2016-03-27 35 views
0

試圖在VBA中創建一個函數,以便我可以查詢表(tblGeoData)並將該函數用於字段(lngPopulation)。表(tblGeoData)有多行,每年一行(tblGeoData = lngYear中的字段)。所需年份將使用全局常量(lngDataYr)進行定義。所以函數會抓取tblGeoData.lngPopulation,其中tblGeoData.lngYr = lngDataYr,lngDataYr-1,lngDataYr-2。因此,如果Global Const lngDataYr設置爲2014,那麼該函數將抓取lngPopulation數年,2014年,2013年和2012年。然後,使用lngPopulation的3個值(爲了簡潔而縮短流行度)計算平均變化率:如何創建更改速率函數

AvgChangeRate =((2014年的流行音樂 - 2013年的流行音樂)/ 2013年的流行音樂(2013年的流行音樂 - 2012年的流行音樂)/ 2012年的流行音樂)/ 2

不確定如何創建這個功能,能夠用於任何領域,不只是lngPopulation,它將有2個參數,1是該字段,另一個是指定哪些行的標準。可能的話,我可以查詢該行第一(說全球常量是帶一個名爲GetlngDataYr功能:

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

但是這將是很好的功能,提取數據以及

回答

0

你可以只需檢索三個值並進行計算:

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

在代碼的開頭,我添加了:'Public Function PopRate()As Double'。在代碼末尾添加了'End Function' 。這返回零,所以我將函數名稱從PopRate更改爲AvgChangeRate。這返回了關於d的錯誤eclarations,所以我刪除了'Dim AvgChangeRate As Double'。它現在按預期工作。函數名稱是否需要等於輸出的名稱? – random13

+0

對不起。我編輯了答案來保存完整的功能,因爲我會寫它。 – Gustav