我有一本包含 50 多張紙的作業簿。除了最后一張,A19:L30 是我關心的范圍。在此范圍的每一行中,單元格 Kx 是作業代碼,Lx 是給定作業的子代碼,Jx 是特定時間段內計入該特定作業代碼/子代碼組合的總作業時數。
在最后一張紙上,我將所有可能的作業代碼/子代碼組合列在三列中,其格式與其他紙上的資料相同。Ax 是給定代碼組合的總計小時數,Bx 是作業代碼,Cx 是作業代碼。我想要做的是回圈遍歷作業簿中的所有作業表,并在最后一張作業表中分別將正在搜索的作業表中的 Kx 和 Lx 與 Ax 和 Bx 進行比較,如果代碼匹配,則將該行的總計添加到總計中總計在最后一張紙上。
到目前為止我所擁有的:
Sub GetAllJobCodes()
Dim ws As Worksheet
Dim x As Integer
Dim z As Integer
Dim NumOfTotals As Integer
NumOfTotals = (JobCodesSorted.Count * WorkCodes.Count) 1
Dim Totals(500) As Double
Dim TotalsTemp As Double
For x = 1 To NumOfTotals - 1
Totals(x) = 0
Next
For x = 2 To 53
For Each ws In ActiveWorkbook.Worksheets
For z = 19 To 30
If ws.Cells(z, 11) = Sheets("Job Totals").Cells(x, 2) And ws.Cells(z, 12) = Sheets("Job Totals").Cells(x, 3) Then
TotalsTemp = CDbl(Row.Cells(z, 10))
Totals(x) = Totals(x) TotalsTemp
End If
Next z
Next ws
Next x
For x = 2 To NumOfTotals
Sheets("Job Totals").Cells(x, 1) = Totals(x)
Next
End Sub
JobCodesSorted 和 WorkCodes 在上游進一步定義。運行此代碼會為 NumOfTotals 分配一個值 71。我運行此代碼,最終作業表中的所有總計都填充為零。將最后一個 For 回圈更改為 Debug.Print 而不是列印到單元格,并且所有陣列值都列印為零。我錯過了什么嗎?任何幫助表示贊賞。
uj5u.com熱心網友回復:
VBA 查找(三重嵌套回圈)
我發現了這個錯誤:
TotalsTemp = CDbl(Row.Cells(z, 10))為什么這不是編譯錯誤對我來說是個謎。
也許TotalsTemp = CDbl(ws.Cells(z, 10))是唯一需要的改變。由于您認為我們不需要在這段代碼之前看到您的資料和代碼的螢屏截圖,所以我只能想出這個。
它仍然和以前一樣慢,它仍然有很多神奇的數字,但它可能會讓你走上正軌。
編碼
Sub GetAllJobCodes()
Dim wb As Workbook: Set wb = ActiveWorkbook
' If the worksheets are in the workbook containing this code, use:
'Dim wb As Workbook: Set wb = ThisWorkbook
Dim dws As Worksheet: Set dws = wb.Worksheets("Job Totals")
Dim Totals(2 To 53, 1 To 1) As Double
Dim sws As Worksheet
Dim sr As Long
Dim dr As Long
Dim TotalsTemp As Double
For Each sws In wb.Worksheets
If Not sws Is dws Then ' exclude the destination worksheet
For dr = 2 To 53
For sr = 19 To 30
If sws.Cells(sr, "K").Value = dws.Cells(dr, "B").Value And _
sws.Cells(sr, "L").Value = dws.Cells(dr, "C").Value _
Then
TotalsTemp = CDbl(sws.Cells(sr, "J").Value)
Totals(dr, 1) = Totals(dr, 1) TotalsTemp
'Else ' no equality; do nothing
End If
Next sr
Next dr
'Else ' it's the destination worksheet; do nothing
End If
Next sws
Dim drCount As Long: drCount = UBound(Totals, 1) - LBound(Totals, 1) 1
dws.Cells(2, "A").Resize(drCount).Value = Totals
' Or without 'drCount':
'dws.Range("A2:A53").Value = Totals
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535469.html
上一篇:以下代碼不適用于大量選擇
下一篇:讓VBA等到批處理檔案完成
