我試圖通過更改單元格的內容來觸發作業表事件。我知道我的代碼有錯誤的方法(我應該使用 redim,...),但結果是一樣的。可以隨心所欲地解決問題,還是在編程中有正確的做事方式?
'I condition
For Each cell In rng
If cond1 = "" Then
arr(i) = cell.Row
i = i 1
Else
If cell.Offset(0, 4).Value = cond1 Then
arr(i) = cell.Row
i = i 1
End If
End If
Next
'II condtion
For a = LBound(arr) To UBound(arr)
If cond2 = "" Then
GoTo X
Else
If arr(a) <> "" Then
If wsDB.Cells(arr(a), 5).Value <> cond2 Then
arr(a) = ""
End If
End If
End If
Next a
X:
b = 9
For i = LBound(arr) To UBound(arr)
If arr(i) <> "" Then
If b > 150 Then
Exit Sub
Else
ws.Cells(b, 3).Value = wsDB.Cells(arr(i), 3).Value
b = b 1
End If
End If
Next i
End Sub
uj5u.com熱心網友回復:
“可以隨心所欲地解決問題,還是編程中有正確的做事方式?”
通常有idiomatic一種編碼方式,一種最簡單,也許是最快的方式。例如,在 Python 中,可以使用串列推導來構建串列,這既簡單又快速。每種語言都有慣用的方法。
關于 Excel / VBA 需要注意的重要一點是它們沒有集成。它們實際上是兩個獨立的東西,通過一個非常慢的 COM 介面鏈接。如果有太多的范圍訪問,它會減慢一切。有些事情并不算太慢,因為個人訪問的數量非常少:
range("myrange") = 0 ' One access does the whole range
nrows = range("myrange").rows.count ' Again only one access
其他東西要貴得多。如果正常完成,通過行和列處理非常昂貴,但使用變體要便宜得多。
Option Explicit
Public Sub DoWork()
Dim ThisTime As Variant
Dim myrange As Variant
Dim Row, Col As Integer
ThisTime = Timer
For Row = 1 To 100
For Col = 1 To 100
Range("myrange").Cells(Row, Col) = 1
Next Col
Next Row
MsgBox Timer - ThisTime ' 2.023 seconds
ThisTime = Timer
myrange = Range("myrange")
For Row = 1 To 100
For Col = 1 To 100
myrange(Row, Col) = 1
Next Col
Next Row
Range("myrange") = myrange
MsgBox Timer - ThisTime ' 0.03125 seconds, 65 times faster
End Sub
那么哪個版本更慣用呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/417255.html
標籤:
