使用VBA访问数据的其他方法

所有的好日子。 在过去的8个小时里,我正在寻找在Access 2007中的一个数据透视select,因为我们的Citrix帐户(OWC10.dll)中没有提供参考dll 。 所以我尽了我的一切努力研究解决这个问题的方法,但到目前为止我什么都没有,所以我觉得是时候给点帮忙。

我在这里是一个原始数据的样本..

在这里输入图像说明

这是我正在寻找的最终结果,一个数据透视表,其中,当然,可以在一个窗体(最佳解决scheme)或提取的Excel文件中查看。

在这里输入图像说明

在这里输入图像说明

所以基本上,我需要显示:

  • 他们每天工作多less时间
  • 他们每天工作多less

我尝试了TRANSFORM语句/交叉表 ,我得到错误,有太多的行使它成为一个列,因为我有20,000+行 – 30天/月*工作的人。 – DISTINCT他们,但我不知道如何?

我没有在我们的系统中的.dll文件,所以正常的pivoting是没有问题的。 有谁知道任何替代品,可以给我这些显示结果?

你需要做的是编译一个你所需要的数据的查询,并将其推入到excel中,然后以编程方式在excel中build立一个数据透视表,以便于访问。

我使用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做了一个解决scheme。 使用查询向导非常容易理解。 下面是编辑的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小时,解决不同。 所以我把它留在十进制格式,以显示正确的数字。