讓我首先將事物置於上下文中。 我有三個問題,希望能在我遇到的問題上得到一些幫助。 我正在開發一個應用程序,對特定工作場所/活動組合中使用的物質進行風險評估。我想要做的就是創建一個矩陣報告如下:在Access VBA中編寫數據透視表
[職場名稱(如列標題)
[活動名稱](作爲行標題)
[風險評估分數] (作爲數據)
所有這些值都可以通過查詢來檢索。我嘗試使用交叉表查詢,但它似乎只能用於彙總數據。我正在摔跤如果我的假設是正確的,因爲這是我看完微軟網站後得出的結論。但是,由於我不是經驗豐富的Acces程序員,我可能是錯的。
基於我的假設,我認爲數據透視表是最好的選擇。我在http://msdn.microsoft.com/en-us/library/aa662945(office.11).aspx 上找到了一個我試圖複製的例子。編程的原因是,可以根據表單中的用戶標準生成數據透視表。
下面的代碼是上述鏈接中給出的示例代碼的輕微變化。
Private Sub cmdPivotTable_Click()
Dim strDefaultName As String
Dim strRecordSource As String
'Create an empty form with a PivotTable
'default view and a record source
strRecordSource = "SELECT *" _
& " FROM ((OEL RIGHT JOIN Substance ON OEL.OEL_ID = Substance.OEL_ID) INNER JOIN" _
& " ((Product INNER JOIN Proportions ON (Product.Product_Name = Proportions.Product_Name) AND (Product.Product_ID = Proportions.Product_ID) AND (Product.Product_Name = Proportions.Product_Name) AND (Product.Product_ID = Proportions.Product_ID)) INNER JOIN (STM_Workplace INNER JOIN (Respiratory_PPE INNER JOIN (STM_LocalControls INNER JOIN (STM_Diffuse INNER JOIN ((STM_Vent_NF_FF INNER JOIN Workplace ON (STM_Vent_NF_FF.STM_Vent_FF_ID = Workplace.STM_Vent_NF_ID) AND (STM_Vent_NF_FF.STM_Vent_FF_ID = Workplace.STM_Vent_NF_ID) AND (STM_Vent_NF_FF.STM_Vent_FF_ID = Workplace.STM_Vent_FF_ID)) INNER JOIN (STM_Activity_Score INNER JOIN (Activity INNER JOIN (PBMCode INNER JOIN Product_Activity ON PBMCode.ID_PBMCode = Product_Activity.ID_PBMCode) " _
& " ON Activity.Activity_ID = Product_Activity.ID_Activity) ON STM_Activity_Score.STM_ActivityScore_ID = Activity.STM_ActivityScore_ID) ON (Workplace.Workplace_ID = Product_Activity.Workplace_ID) AND (Workplace.Workplace_ID = Product_Activity.Workplace_ID)) ON STM_Diffuse.STM_Diffuse_ID = Workplace.STM_Diffuse_ID) ON STM_LocalControls.STM_LocalControls_ID = Workplace.STM_LocalControls_ID) ON (Respiratory_PPE.STM_PPE_ID = PBMCode.STM_PPE_ID) AND (Respiratory_PPE.STM_PPE_ID = PBMCode.STM_PPE_ID)) ON STM_Workplace.STM_Workplace_ID = Workplace.STM_Workplace_ID) ON (Product.Product_Name = Product_Activity.Product_Name) AND (Product.Product_ID = Product_Activity.Product_ID) " _
& " AND (Product.Product_Name = Product_Activity.Product_Name) AND (Product.Product_ID = Product_Activity.Product_ID)) ON (Substance.Substance_Name = Proportions.Substance_Name) AND (Substance.Substance_ID = Proportions.Substance_ID)) INNER JOIN Risk_Assessment ON (Substance.Substance_Name = Risk_Assessment.Substance_Name) AND (Substance.Substance_ID = Risk_Assessment.Substance_ID) " _
& " WHERE Product_Activity.ID_Product_Task = Product_Activity_ID"
strDefaultName = CreatePivotTable(strRecordSource)
'Rename the form from its default name
Dim strFormName As String
strFormName = "TestCreatePivotTableForm"
If (AssignPivotTableName(strDefaultName, strFormName)) = False Then
Exit Sub
End If
'Configure the PivotTable
ConfigurePivotTable (strFormName)
End Sub
Public Function AssignPivotTableName(strDefaultName As String, strFormName As String As Boolean
Dim acc1 As AccessObject
AssignPivotTableName = True
For Each acc1 In CurrentProject.AllForms
If acc1.Name = strFormName Then
MsgBox "Choose a form name other " & _
"than '" & strFormName & "' that " & _
"does not match an existing form."
AssignPivotTableName = False
DoCmd.DeleteObject acForm, strDefaultName
Exit Function
End If
Next acc1
DoCmd.Rename strFormName, acForm, strDefaultName
End Function
Public Function CreatePivotTable(strRecordSource As String) As String
Const acFormPivotTable = 3
Dim frm1 As Access.Form
Set frm1 = CreateForm
frm1.DefaultView = acFormPivotTable
frm1.RecordSource = strRecordSource
CreatePivotTable = frm1.Name
DoCmd.Close acForm, CreatePivotTable, acSaveYes
End Function
Public Sub ConfigurePivotTable(strFormName As String)
Dim fst1 As PivotFieldSet
DoCmd.OpenForm strFormName, acFormPivotTable
Set frm1 = Forms.Item(strFormName)
With frm1.PivotTable.ActiveView
***Set fst1 = .FieldSets("Product_Name")***
.FilterAxis.InsertFieldSet fst1
Set fst1 = .FieldSets("WorkPlace_Name")
.ColumnAxis.InsertFieldSet fst1
Set fst1 = .FieldSets("Activity_Name")
.RowAxis.InsertFieldSet fst1
Set fst1 = .FieldSets("Imission_Score")
.DataAxis.InsertFieldSet fst1
End With
DoCmd.Close acForm, frm1.Name, acSaveYes
End Sub
的問題如下:設置PivotFieldSet和我無能,什麼錯誤時,我得到一個錯誤13類型不匹配。該表格是使用適當的記錄集創建的,並在PivotTableView中打開,就是這樣。我希望找到一些關於問題可能出現的建議。
另外,是否還有其他方法可以實現我所描述的製作矩陣的目標?由於需要輸出到Excel來打印數據透視表,這是一個繞道而已,我寧願最終用戶不必採取。
在此先感謝您的任何建議或回覆我的文章。
感謝一束!我之前嘗試過,但沒有按預期得到輸出。感謝您的回答,我又看了一眼,發現問題出在我正在使用的查詢中。我忘了添加一個where子句,導致很多重複的風險比率。所以事實證明,交叉表查詢的確適合我的問題。請原諒我的無知,謝謝! – Makki