2016-03-27 9 views
0

テーブル(tblGeoData)を照会してフィールド(lngPopulation)に関数を使用できるように、VBAで関数を作成しようとしています。テーブル(tblGeoData)には複数の行があり、1年ごとに1つ(tblGeoData = lngYearのフィールド)です。必要な年は、グローバルコンストラクト(lngDataYr)で定義されます。そのため、関数はtblGeoData.lngPopulationを取得します。ここで、tblGeoData.lngYr = lngDataYr、lngDataYr-1、lngDataYr-2です。したがって、Global Const lngDataYrが2014に設定されている場合、この関数は2014年、2013年、および2012年にlngPopulationを取得します。次に、lngPopulationの3つの値を使用して平均変化率を計算します(簡略化のためにpopに短縮します)。変更率関数を作成する方法

AvgChangeRate =(2014年(ポップ - 2013年の2013年のポップ)/ポップ+ 2013(ポップ - 2012年のポップ)2012 /ポップ)/ 2

不確実なこの関数を作成するには、正確にどのように私はそれがあること絵lngPopulationだけではなく、どのフィールドでも使用できるようになり、2つの引数を持ちます.1つはフィールドで、もう1つはどの行を指定するかです。あなたは

SELECT tblGeoData.lngPopulation 
FROM tblGeoData 
WHERE tblGeoData.lngYear In(GetlngDataYr(),GetlngDataYr-1,GetlngDataYr-2); 

しかし、それは同様にデータをプルする機能のためにいいだろう

答えて

0

ができます。おそらく、私は(たとえば、グローバルのConstはGetlngDataYrという名前の関数と呼ばれる最初の行を問い合わせることができただ三つの値を取得し、計算を実行します。あなたのコードの先頭に

Public Function PopRate() As Double 

    Dim rs As DAO.Recordset 
    Dim AvgChangeRate As Double 
    Dim SQL As String 
    Dim Pops As Variant 

    SQL = "SELECT lngPopulation As pop FROM tblGeoData WHERE lngYear Between GetlngDataYr() And (GetlngDataYr() - 2) Order By lngYear Desc;" 

    Set rs = CurrentDb.OpenRecordset(SQL) 
    ' Copy values to array. 
    Pops = rs.GetRows(3) 
    rs.Close 

    AvgChangeRate = ((Pops(0, 0) - Pops(0, 1))/Pops(0, 1) + (Pops(0, 1) - Pops(0, 2))/Pops(0, 2))/2 

    Set rs = Nothing 

    Poprate = AvgChangeRate 

End Function 
+0

を、私が追加しました:「公開機能PopRate()doubleとして」あなたのコードのために、私は加えた:「エンド機能」これはゼロを返したので、関数名をPopRateからAvgChangeRateに変更しました。これはdについてのエラーを返しましたeclarationsので、私は 'Dim AvgChangeRate As Double'を削除しました。今は期待どおりに動作します。関数名は出力の名前と同じである必要がありますか? – random13

+0

申し訳ありません。私はそれを書いているように完全な機能を保持する答えを編集しました。 – Gustav

関連する問題