VBA新手請求協助簡化, 我寫的內容會跑到當機, 公司電腦不夠力
Sub 效率總表G欄空白填上資料()
Application.ScreenUpdating = False
Dim i, j As Integer
For i = 2 To 32000
For j = 2 To 32000
If Worksheets("Page1").Cells(i, "G") = "" And Worksheets("Page1").Cells(i, "I") <> "全檢" _
And Worksheets("Page1").Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
Worksheets("Page1").Cells(i, "G") = Worksheets("標準工時表").Cells(j, "K")
'Exit For
End If
Next
Next
Application.ScreenUpdating = True
End Sub
試試看,我覺得應該可以快很多。
Sub 效率總表G欄空白填上資料()
Dim i as long, j As long
dim a(2 to 32000, 0) as variant
For i = 2 To 32000
For j = 2 To 32000
With Worksheets("Page1")
If .Cells(i, "G") = "" And .Cells(i, "I") <> "全檢" _
And .Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
a(i, 0) = Worksheets("標準工時表").Cells(j, "K")
End If
end with
Next j
Next i
worksheets("Page1").range("G2:G32000") = a
End Sub
先做If
檢核,以避免落入J
迴圈
Sub 效率總表G欄空白填上資料()
Dim i as long, j As long
Dim a(2 to 32000, 0) as variant
With Worksheets("Page1")
For i = 2 To 32000
If .Cells(i, "G") = "" And .Cells(i, "I") <> "全檢" Then
For j = 2 To 32000
If .Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
a(i, 0) = Worksheets("標準工時表").Cells(j, "K")
End If
Next j
End if
Next i
.range("G2:G32000") = a
End With
End Sub
不更動原始資料或程式設計架構的話
簡化的方法就是「Exit For」
不管原因或者合理性
單純就程式碼來看
要的是「符合條件的最後一筆」的資料
就沒必要從前面每筆找,每筆判斷,每筆換然後再被後面的蓋掉值
那就改成從後面找回來,一找到就結束
Sub 效率總表G欄空白填上資料()
Application.ScreenUpdating = False
Dim i, j As Integer
For i = 2 To 32000
For j = 32000 To 2 Step -1
If Worksheets("Page1").Cells(i, "G") = "" And Worksheets("Page1").Cells(i, "I") <> "全檢" And Worksheets("Page1").Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
Worksheets("Page1").Cells(i, "G") = Worksheets("標準工時表").Cells(j, "K")
Exit For '只要有值就離開這層迴圈
End If
Next
Next
Application.ScreenUpdating = True
End Sub
萬一要的是「符合條件的第一筆」的資料
那就改成
Sub 效率總表G欄空白填上資料()
Application.ScreenUpdating = False
Dim i, j As Integer
For i = 2 To 32000
For j = 2 To 32000
If Worksheets("Page1").Cells(i, "G") = "" And Worksheets("Page1").Cells(i, "I") <> "全檢" And Worksheets("Page1").Cells(i, "F") = Worksheets("標準工時表").Cells(j, "F") Then
Worksheets("Page1").Cells(i, "G") = Worksheets("標準工時表").Cells(j, "K")
Exit For '只要有值就離開這層迴圈
End If
Next
Next
Application.ScreenUpdating = True
End Sub
原始程式迴圈總共要跑 32,000x32,000 = 1,024,000,000
10億次一級戒備,膽子真大
(Quote by 寒戰 保安局長陸明華)
其實你仔細思考細節就會知道怎麼做,借用pcw的代碼
Sub 效率總表G欄空白填上資料()
Dim i as long, j As long
dim a(2 to 32000, 0) as variant
dim G,I,F
For i = 2 To 32000
這邊先設變數把這一輪要用到的丟進去,這樣做是避免每一輪都要重新讓應用程式再去找出這些資料
G=Worksheets("Page1").Cells(i, "G")
I=Worksheets("Page1").Cells(i, "I")
F=Worksheets("Page1").Cells(i, "F")
For j = 2 To 32000
這邊會建議先檢查一個關鍵的就好,不用每個都測,
如果筆數少感覺不出來差別但你的狀況會差很多
IF F= Worksheets("標準工時表").Cells(j, "F") then
這裡在做最後判斷
If G="" And I<> "全檢" And Then
a(i, 0) = Worksheets("標準工時表").Cells(j, "K")
End If
end if
Next j
Next i
worksheets("Page1").range("G2:G32000") = a
End Sub