vba中的关联数组,如php

时间:2015-10-28 17:46:16

标签: sql excel vba excel-vba adodb

我需要您的帮助才能使用VBA在Microsoft Excel中构建分析。

我有一个包含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

不幸的是,我找不到解决方案。我尝试过词典,收集和数组,但没有成功。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以在打开的工作簿中对工作表进行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

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

答案 1 :(得分:0)

所以我把这张纸设置成这样:

enter image description here

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

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

更快的方法可能是带小计的高级过滤器。过滤与数据不同的页面。或者,最好的答案是使用数据透视表。

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