這聽起來像一個簡單的解決方案可能是:
For Each cell In Range("B2:B2000")
If cell.Value <= 450 And cell.Value >= 0 Then
i = cell.Row
Range("E" & i).Formula = "=IF($B" & i & "="""","""",INDEX(NAMES,MATCH($B" & i & ",ID,0)))"
End If
Next
將設置在該式中山口E中每次在山口B發現1和450
之間的這種可能成爲一個位值很長的名單很慢。你可以關閉自動計算並表日後事項,以加快速度帶着幾分:
' Deactivate - put this at the start of your code
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' Reactivate - put this at the end of your code
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
這在我的電腦上給了以下的速度提升(平均時速經過20次迭代):
Without deactivation: 1.043359375 s per iteration
With deactivation: 0.270703125 s per iteration
另外,如果是來自索引函數的錯誤是拋出過濾器並進行排序,則可以嘗試將函數包裝在IFERROR()函數中,並完全繞過VBA。
=IFERROR(IF($B49="","",INDEX(NAMES,MATCH($B49,ID,0))),"")
來源
2017-05-22 06:04:11
NHW
你爲什麼不把公式複製下來?這對VBA也是可能的! – teylyn
謝謝,但我回到了第一個 - 我得到的單元格返回空白,螺絲過濾/排序。我需要它來放置公式時Idnumbers存在和跳過空白,這樣我就不會獲得單元格返回空白值的公式 –