使用 VBA 透视访问数据的替代方法
Alternative ways to Pivot Access data using VBA
大家好。
在过去的 8 小时里,我正在寻找 Access 2007 中的枢轴替代方案,因为引用 dll
在我们的 Citrix 帐户 (OWC10.dll) 中不可用。所以我尽我所能来研究解决这个问题的方法,但到目前为止我一无所获,所以我认为是时候提供一点帮助了。
我这里有原始数据的样本..
这是我正在寻找的最终结果,一个枢轴 table,当然,可以在其中以表格(最佳解决方案)或提取的 excel 文件查看。
所以基本上,我需要显示:
- 他们每天工作多少时间
- 他们每天工作多少人。
我尝试了 TRANSFORM Statement/Crosstab,但我得到的错误是行数过多,无法将其列为一列,因为我确实有 20,000 多行 - 30 天/月 * 工作的人。 - DISTINCT
他们,但我不知道怎么办?
我的系统中没有 .dll
文件,因此无法正常旋转。有谁知道可以给我这些显示结果的替代方法吗?
您需要做的是编译所需数据的查询,并将其推送到 excel,然后以编程方式在 excel 中构建数据透视表 table,从访问。
我几乎所有的事情都使用 ADO - 所以我这里的语法反映了这一点;如果你是 DAO,你需要翻译它。
sql = _
"SELECT Name, ProcessDate, HandlingTime " & _
"FROM tbl ... WHERE ..."
GenerateSimplePivot(excel_path&file_name_to_create, sql, 2)
Private Sub GenerateSimplePivot(xname As String, auditData As String, _ pivotColumns As Long)
Dim ii As Long
Dim XL As Object
Dim WB As Object
Dim WS1 As Object
Dim WS2 As Object
Dim rst As ADODB.Recordset
'create/assign xl objects
Set XL = CreateObject("Excel.Application")
XL.Visible = False
XL.DisplayAlerts = False
Set WB = XL.Workbooks.Add
Set WS1 = WB.Worksheets(1)
Set rst = New ADODB.Recordset
rst.Open auditData, CurrentProject.Connection, adOpenKeyset, adLockReadOnly
For ii = 0 To rst.Fields.Count - 1
WS1.Cells(1, ii + 1) = rst.Fields(ii).Name
Next
WS1.Range("A2").CopyFromRecordset rst
WS1.Columns.Autofit
WS1.Name = "AuditData"
For ii = 0 To rst.Fields.Count - 1
'add column formatting logic here, if required
Next
rst.Close
If WB.Worksheets.Count < 2 Then
Set WS2 = WB.Worksheets.Add(, WB.Worksheets(WB.Worksheets.Count))
Else
Set WS2 = WB.Worksheets(2)
End If
WS2.Name = "PivotTable"
DoCmd.SetWarnings False
Dim PTcache As Object
Dim pt As Object
WS1.Activate
Set PTcache = WB.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=WS1.Range("A1").CurrentRegion.Address)
Set pt = PTcache.CreatePivotTable(TableDestination:=WS2.Range("a6"), TableName:="PivotTable ")
WS2.Activate
With pt
For ii = (pivotColumns - 3) To 2 Step -1
.PivotFields(ii).Orientation = xlPageField
Next
On Error Resume Next
.PivotFields(1).Orientation = xlPageField
Err.Clear
ON Error GoTo [error handler label]
.PivotFields(pivotColumns - 2).Orientation = xlRowField
.PivotFields(pivotColumns - 1).Orientation = xlColumnField
.PivotFields(pivotColumns).Orientation = xlDataField
End With
WB.SaveAs FileName:=xname
WB.Close
Set WS1 = Nothing
Set WS2 = Nothing
Set PTcache = Nothing
Set pt = Nothing
Set WB = Nothing
XL.Quit
DoCmd.SetWarnings True
Set rst = Nothing
Set WS1 = Nothing
Set WS2 = Nothing
Set PTcache = Nothing
Set pt = Nothing
Set WB = Nothing
Set XL = Nothing
End Sub
这就是你想要的吗?
献给和我有同样烦恼的人。我使用 CrossTab 做了一个解决方案。
使用查询向导非常简单易懂。下面是经过编辑的 SQL 查询以满足我的需要:
TRANSFORM format(Sum(MyCopy.[Duration]), "hh:mm:ss") AS SumOfDuration
SELECT MyCopy.[UserID].[FullName], MyCopy.[TL], Sum(MyCopy.[Duration]) AS [Total Of Duration]
FROM MyCopy
Group BY MyCopy.[UserID], MyCopy.[FullName], MyCopy.[TL]
PIVOT MyCopy.[Process Date];
注意:出于报告目的,提取此查询非常容易。我确实使用了 format
这样小数看起来就不会难看。显然,MS Access 没有给出实数的答案,而是相同的百分比。当 sum of total duration
经过 24 小时时,它的解决方式不同。所以我将其保留为十进制格式以显示正确的数字。
大家好。
在过去的 8 小时里,我正在寻找 Access 2007 中的枢轴替代方案,因为引用 dll
在我们的 Citrix 帐户 (OWC10.dll) 中不可用。所以我尽我所能来研究解决这个问题的方法,但到目前为止我一无所获,所以我认为是时候提供一点帮助了。
我这里有原始数据的样本..
这是我正在寻找的最终结果,一个枢轴 table,当然,可以在其中以表格(最佳解决方案)或提取的 excel 文件查看。
所以基本上,我需要显示:
- 他们每天工作多少时间
- 他们每天工作多少人。
我尝试了 TRANSFORM Statement/Crosstab,但我得到的错误是行数过多,无法将其列为一列,因为我确实有 20,000 多行 - 30 天/月 * 工作的人。 - DISTINCT
他们,但我不知道怎么办?
我的系统中没有 .dll
文件,因此无法正常旋转。有谁知道可以给我这些显示结果的替代方法吗?
您需要做的是编译所需数据的查询,并将其推送到 excel,然后以编程方式在 excel 中构建数据透视表 table,从访问。
我几乎所有的事情都使用 ADO - 所以我这里的语法反映了这一点;如果你是 DAO,你需要翻译它。
sql = _
"SELECT Name, ProcessDate, HandlingTime " & _
"FROM tbl ... WHERE ..."
GenerateSimplePivot(excel_path&file_name_to_create, sql, 2)
Private Sub GenerateSimplePivot(xname As String, auditData As String, _ pivotColumns As Long)
Dim ii As Long
Dim XL As Object
Dim WB As Object
Dim WS1 As Object
Dim WS2 As Object
Dim rst As ADODB.Recordset
'create/assign xl objects
Set XL = CreateObject("Excel.Application")
XL.Visible = False
XL.DisplayAlerts = False
Set WB = XL.Workbooks.Add
Set WS1 = WB.Worksheets(1)
Set rst = New ADODB.Recordset
rst.Open auditData, CurrentProject.Connection, adOpenKeyset, adLockReadOnly
For ii = 0 To rst.Fields.Count - 1
WS1.Cells(1, ii + 1) = rst.Fields(ii).Name
Next
WS1.Range("A2").CopyFromRecordset rst
WS1.Columns.Autofit
WS1.Name = "AuditData"
For ii = 0 To rst.Fields.Count - 1
'add column formatting logic here, if required
Next
rst.Close
If WB.Worksheets.Count < 2 Then
Set WS2 = WB.Worksheets.Add(, WB.Worksheets(WB.Worksheets.Count))
Else
Set WS2 = WB.Worksheets(2)
End If
WS2.Name = "PivotTable"
DoCmd.SetWarnings False
Dim PTcache As Object
Dim pt As Object
WS1.Activate
Set PTcache = WB.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=WS1.Range("A1").CurrentRegion.Address)
Set pt = PTcache.CreatePivotTable(TableDestination:=WS2.Range("a6"), TableName:="PivotTable ")
WS2.Activate
With pt
For ii = (pivotColumns - 3) To 2 Step -1
.PivotFields(ii).Orientation = xlPageField
Next
On Error Resume Next
.PivotFields(1).Orientation = xlPageField
Err.Clear
ON Error GoTo [error handler label]
.PivotFields(pivotColumns - 2).Orientation = xlRowField
.PivotFields(pivotColumns - 1).Orientation = xlColumnField
.PivotFields(pivotColumns).Orientation = xlDataField
End With
WB.SaveAs FileName:=xname
WB.Close
Set WS1 = Nothing
Set WS2 = Nothing
Set PTcache = Nothing
Set pt = Nothing
Set WB = Nothing
XL.Quit
DoCmd.SetWarnings True
Set rst = Nothing
Set WS1 = Nothing
Set WS2 = Nothing
Set PTcache = Nothing
Set pt = Nothing
Set WB = Nothing
Set XL = Nothing
End Sub
这就是你想要的吗?
献给和我有同样烦恼的人。我使用 CrossTab 做了一个解决方案。 使用查询向导非常简单易懂。下面是经过编辑的 SQL 查询以满足我的需要:
TRANSFORM format(Sum(MyCopy.[Duration]), "hh:mm:ss") AS SumOfDuration
SELECT MyCopy.[UserID].[FullName], MyCopy.[TL], Sum(MyCopy.[Duration]) AS [Total Of Duration]
FROM MyCopy
Group BY MyCopy.[UserID], MyCopy.[FullName], MyCopy.[TL]
PIVOT MyCopy.[Process Date];
注意:出于报告目的,提取此查询非常容易。我确实使用了 format
这样小数看起来就不会难看。显然,MS Access 没有给出实数的答案,而是相同的百分比。当 sum of total duration
经过 24 小时时,它的解决方式不同。所以我将其保留为十进制格式以显示正确的数字。