簡體   English   中英

我們可以將復雜的 excel 公式更改為 VBA

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM