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
分配)。
我需要你的帮助来使用 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
分配)。