我需要您的帮助才能使用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
不幸的是,我找不到解决方案。我尝试过词典,收集和数组,但没有成功。有什么想法吗?
答案 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)
所以我把这张纸设置成这样:
然后使用以下代码加载数组并循环遍历数组中的每一行。我在满足条件时添加了小时数,并在即时窗口中显示结果。
编辑:据我所知,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