[英]Can we change complex excel formula into VBA
任何人都可以在 VBA 代碼中寫下這個公式,這會使工作表變得很重,每當我添加或編輯原始數據(數據表)時,它都會開始“計算 4 個處理器”並花費很多時間。
在原始數據表中有 almsot 18000 個條目,而在我提取狀態的其他表中包含 8000 個條目,但是如果它看到最后一個原始數據將會很有幫助。
=IF(SUMPRODUCT((數據:$A$2:$A$17989=A7076) (數據:$B$2:$B$17989=B7076) (數據:$C$2,$C$17989="組合")),"可用":IF(COUNTIFS(數據,$A$2,$A$17989:A7076,數據,$B$2:$B$17989,B7076,數據,$C$2:$C$17989,"Feed *")=2,"可用“,“無法使用”))
我已經閱讀了很多關於 web 的文章並進行了嘗試但沒有幫助,我想知道 VBA 是否是這個復雜公式的最佳解決方案之一。
我記錄的內容如下:
Sub Macro1() ' ActiveCell.FormulaR1C1 = _
"=IF(SUMPRODUCT((Data!R2C1:R17989C1=RC[-5])*(Data!R2C2:R17989C2=RC[-4])*(Data!R2C3:R17989C3=""Combine"")),""Available"",IF(COUNTIFS(Data!R2C1:R17989C1,RC[-5],Data!R2C2:R17989C2,RC[-4],Data!R2C3:R17989C3,""Feed *"")=2,""Available"",""Not Available""))"
Range("F2").Select
Selection.Copy
Range("F3:F7076").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.End(xlUp).Select
Range("F3").Select
ActiveWorkbook.Save
結束子
謝謝
請測試下一個解決方案。 激活要處理的工作表並運行SetAvailability
:
Sub SetAvailability()
Dim sh As Worksheet, shD As Worksheet, lastRA As Long, lastRD As Long, arrD, arr, arrF, i As Long
Set sh = ActiveSheet
Set shD = Worksheets("Data")
lastRA = sh.Range("A" & sh.rows.count).End(xlUp).Row
lastRD = shD.Range("A" & shD.rows.count).End(xlUp).Row
arrF = sh.Range("F2:F" & lastRA).Value2
arr = sh.Range("A2:B" & lastRA).Value2
arrD = shD.Range("A2:C" & lastRD).Value2
For i = 1 To UBound(arr)
arrF(i, 1) = getAvailability(arrD, arr(i, 1), arr(i, 2), "Combine", "Feed *")
Next i
'drop the processed aray content at once:
sh.Range("F2").Resize(UBound(arrF), 1).Value2 = arrF
MsgBox "Ready..."
End Sub
Function getAvailability(arrD, strAA, strBB, strAv As String, strFeed As String) As String
Dim countFeed As Long, i As Long
For i = 1 To UBound(arrD)
If arrD(i, 1) = strAA And UCase(arrD(i, 2)) = UCase(strBB) Then
If UCase(arrD(i, 3)) = UCase(strAv) Then getAvailability = "Available": Exit Function
If arrD(i, 3) Like strFeed Then countFeed = countFeed + 1
If countFeed = 2 Then getAvailability = "Available": Exit Function
End If
Next i
getAvailability = "Not Available"
End Function
它應該足夠快,僅在 memory 中工作,並在代碼末尾立即丟棄處理過的數組內容。 而且,因為復雜的公式,沒有任何工作簿費用......
上面的解決方案假設作為“Feed *”的字符串至少有兩個,用於 A:A 和 B:B 中的匹配,這意味着允許更多(超過兩個)這樣的匹配將返回視為“可用”。
無論如何,這需要一些時間,但我很好奇如何匹配您的特定數據范圍。
如果可用性更大,它會更快(“數據”表數組上的迭代在找到匹配項后停止......)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.