使用VBA进行数据透视访问数据的其他方法

时间:2016-07-26 10:18:08

标签: excel vba ms-access access-vba pivot

大家好日子。 在过去的8小时内,我正在寻找Access 2007中的数据透视替代方案,因为我们的Citrix帐户(OWC10.dll)中没有引用dll。所以我做了所有努力来研究这方面的解决方法,但到目前为止我什么都没有,所以我认为是时候给予一些帮助了。

我这里有一个原始数据样本..

enter image description here

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

enter image description here

enter image description here

基本上,我需要显示:

  • 他们每天工作多长时间
  • 他们每天工作多少。

我尝试了TRANSFORM Statement/Crosstab我得到的错误是有太多的行使它成为一个列,因为我有20,000多行 - 30天/月*工作的人。 - DISTINCT他们,但我不知道怎么做?

我的系统中没有.dll文件,所以正常的旋转是不可能的。有谁知道可以给我这些显示结果的任何替代品?

2 个答案:

答案 0 :(得分:0)

您需要做的是编译所需数据的查询,然后将其推送到Excel中,然后以编程方式在excel中构建一个数据透视表。

我几乎都使用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

这是你追求的吗?

答案 1 :(得分:0)

对于那些遇到和我一样麻烦的人。我使用 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小时时,它会以不同的方式解决。所以我把它留在十进制格式上以显示正确的数字。