vba 中的关联数组,如 php

associative array in vba like php

我需要你的帮助来使用 VBA 在 Microsoft Excel 中构建分析。

我有一个数据 sheet 有 y 列和 n 行

Line Number  Firstname  Lastname  Country  Training Hours  Training Status
1            John       Smith     USA      1               Completed
2            Henri      Dupont    France   1               Completed
3            Paul       Walker    USA      25              Incomplete
4            Ron        Howard    USA      10              Completed

我想像 php 那样使用数组,但使用 VBA

For i = 1 To nblines
    If(array[i]["Country"] = "USA" And array[i]["Training Status"] = "Completed") Then
        myval = myval + array[i]["Training Hours"]
    End If
Next

myval 应该是 11

很遗憾,我找不到解决方案。我试过字典、集合和数组,但没有成功。有什么想法吗?

所以我这样设置 sheet:

然后使用以下代码加载数组并循环遍历数组中的每一行。我添加了满足条件的小时数,并立即显示结果 window.

编辑:据我所知,excel 不使用列名。所以我能想到的唯一方法是,我们将第一行添加到数组中,然后循环遍历它们,查找数组第一行中的名称以获得该列的位置,然后使用变量再次查找.

一种更快的方法可能是带有小计的高级过滤器。在与数据不同的页面上过滤。或者,最好的答案是使用枢轴 table.

Sub nubuk()

Dim arr() As Variant
Dim smTtl As Double
Dim i&
Dim lastrow As Long
Dim lastcolumn
Dim t&
Dim cntry&, stus&, hrs&

With ActiveSheet
    lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
    lastcolumn = Cells(1, .Columns.Count).End(xlToLeft).Column
    Debug.Print lastcolumn
    arr = .Range(.Cells(1, 1), .Cells(lastrow, lastcolumn)).Value
End With
For t = 1 To lastcolumn
    Select Case LCase(arr(1, t))
        Case "country"
            cntry = t
        Case "training status"
            stus = t
        Case "training hours"
            hrs = t
        Case Else
    End Select
Next t
For i = LBound(arr, 1) To UBound(arr, 1)
    If arr(i, cntry) = "USA" And arr(i, stus) = "Completed" Then
        smTtl = smTtl + arr(i, hrs)
    End If
Next

Debug.Print smTtl

End Sub

您可以对打开的工作簿中的作品sheet进行SQL查询(与任何其他工作簿的查询方式相同)。在这种情况下,查询字符串将如下所示:

SELECT SUM([Training Hours]) AS Myval FROM [data sheet$] WHERE Country = 'USA' AND [Training Status] = 'Completed';

这是代码

Sub TestSQLRequest()

    Const adOpenStatic = 3
    Const adLockOptimistic = 3
    Const adCmdText = &H1

    Select Case LCase(Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")))
        Case ".xls"
            strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 8.0;HDR=YES;"";"
        Case ".xlsm"
            strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 12.0 Macro;HDR=YES;"";"
    End Select

    With CreateObject("ADODB.Connection")
        .Open strConnection
        With .Execute("SELECT SUM([Training Hours]) AS Myval FROM [data sheet$] WHERE Country = 'USA' AND [Training Status] = 'Completed';")
            Myval = .Fields("Myval")
        End With
        .Close
    End With

    MsgBox Myval

End Sub

在查询字符串中,带空格的列名称应放在方括号中,以及包含数据的作品名称sheet,后跟$。 不用说,查询无法访问数据,这些数据在对 sheet 进行了一些更改后未保存到文件中。 请注意,Excel 8.0 提供程序无法在 64 位 Excel 版本上工作,请尝试使用 Excel 12.0 提供程序(第二个 strConnection 分配)。