2011-07-19 63 views
4

我有一個Access數據庫和一個VBA模塊,可以對數據進行一些統計分析。統計分析的結果不能由SQL生成,但它們可以以表格形式呈現。現在,我可以在立即窗口中運行VBA函數,它將循環結果並使用Debug.Print()將它們寫入終端。使用VBA在Access 2010中創建一個動態表格

我想將此功能的結果提供給Access的其餘部分,以便我可以從結果表中創建查詢和報告。所以我在尋找的是如何將我的函數變成一個「動態表」 - 一個實際上不存儲數據的表,但存儲運行的VBA函數並在使用該表時動態填充表數據。

我花了相當多的時間來查看通過MAKE TABLE查詢動態創建表或使用VBA中的DDL,但所有這些示例都使用SQL從現有記錄創建新表。我無法使用SQL來生成結果,因此我不確定如何將結果強制轉換爲Access將識別的對象。部分問題在於我對Access VBA術語不太瞭解,不知道我應該在尋找什麼。

我的聲明只是「Public Function GenerateSchedule」。它有三個代碼塊:第一個使用查詢從數據庫中提取需要的數據,並將RecordSet處理成數組。第二個塊對陣列執行統計分析,第三個塊將分析結果打印到終端。我想用一個提供結果的塊替換第三個塊,並將其作爲Access其餘部分可用的表。

+0

聲明只是「Public Function GenerateSchedule」。它有三個代碼塊:第一個使用查詢從數據庫中提取需要的數據,並將RecordSet處理成數組。第二個塊對陣列執行統計分析,第三個塊將分析結果打印到終端。我想用一個能夠提供結果的塊替換第三個塊,這個塊可以被Access的其餘部分使用。 – Soren

回答

8

我使用後,如果我不想使用DDL和SQL查詢代碼...

Set dbs = CurrentDb   
Set tbl = dbs.CreateTableDef("tbl_Name") 
Set fld = tbl.CreateField("Field1", dbText, 255) 
tbl.Fields.Append fld 
Set fld = tbl.CreateField("Field2", dbText, 255) 
tbl.Fields.Append fld 
Set fld = tbl.CreateField("Field3", dbInteger) 
tbl.Fields.Append fld 
Set fld = tbl.CreateField("Field4", dbCurrency) 
tbl.Fields.Append fld 
dbs.TableDefs.Append tbl 
dbs.TableDefs.Refresh 

,如果你想添加一條記錄,你可以做

Dim dbs As DAO.Database 
Dim rs As DAO.Recordset 

Set dbs = CurrentDb 
Set rstVideos = dbs.OpenRecordset("tbl_name") 

rs.AddNew  
rs("field1").Value = "TEST " 
rs("field2").Value = "TEXT" 
rs("field3").Value = 1991 
rs("field4").Value = 19.99 

rstVideos.Update 
+0

我在這裏看到的問題是,我需要手動運行此子程序,每次我想更新表數據。有沒有辦法在每次讀取表時都運行這段代碼?就像可以觸發調用我的VBA函數的宏的表的「OnRead」事件一樣? – Soren

+1

「rstVideos」的目的是什麼?它的數據類型是什麼?另外,還沒有'rs'尚未初始化,這會導致錯誤? – Paradox

0

我不知道爲什麼你需要將檢索到的數據放入數組中。它似乎和額外的一步。如果您可以從數組中生成統計信息,則在查詢中應該可以做到這一點。創建另一個查詢,將結果查詢作爲一個記錄源使用,並相應地爲您想要創建的字段進行計算。 如果我們看到你想要做的事情,我認爲它可以變得更簡單。

0

這聽起來像一個斷開連接的記錄集,或者是ADO可以做的「合成記錄集」。我不使用ADO,所以不能給你提供指導,但也許這會爲你提供你所需要的。

或者,根據您希望如何顯示給用戶,您可能可以在Access中以原生方式執行此操作。例如,如果將它顯示在列表框中的表單或報表上就足夠了,那麼可以編寫自定義回調函數並將其綁定到列表框。