2013-11-15 33 views
1

讓我首先將事物置於上下文中。 我有三個問題,希望能在我遇到的問題上得到一些幫助。 我正在開發一個應用程序,對特定工作場所/活動組合中使用的物質進行風險評估。我想要做的就是創建一個矩陣報告如下:在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來打印數據透視表,這是一個繞道而已,我寧願最終用戶不必採取。

在此先感謝您的任何建議或回覆我的文章。

+0

感謝一束!我之前嘗試過,但沒有按預期得到輸出。感謝您的回答,我又看了一眼,發現問題出在我正在使用的查詢中。我忘了添加一個where子句,導致很多重複的風險比率。所以事實證明,交叉表查詢的確適合我的問題。請原諒我的無知,謝謝! – Makki

回答

1

您不喜歡使用交叉表查詢是沒有根據的。如果每個行/列組合最多隻有一個觀察值,那麼您的「彙總數據」就是其本身的值:如果使用Min(),Max()或Sum(),則無關緊要。

示例:對於樣本數據[Risk_Data]

Activity  Workplace  Risk_Ratio 
-------------- --------------- ---------- 
Activity_Name Workplace_Name   1.2 
Activity_Name Workplace_Name2   2.3 
Activity_Name2 Workplace_Name   3.4 
Activity_Name2 Workplace_Name2   4.5 

查詢

TRANSFORM Max(Risk_Ratio) AS MaxOfRisk_Ratio 
SELECT Activity 
FROM Risk_Data 
GROUP BY Activity 
PIVOT Workplace 

返回

Activity  Workplace_Name Workplace_Name2 
-------------- -------------- --------------- 
Activity_Name    1.2    2.3 
Activity_Name2    3.4    4.5