簡體   English   中英

Excel VBA-對函數使用數組(3個變量)

[英]Excel VBA - use array for function (3 variables)

在Excel VBA中,我有一個y函數,輸入了3個變量(a,b,c)。 我想做的是使用VBA自動將此功能應用於一系列單元格(工作表中列出的a,b和c的組合)。

我設置數據的方式:

  b   1  1  1  1  1  2  2  2  2  3  3  3  4  4  etc.
  c   2  3  4  5  6  3  4  5  6  4  5  6  5  6  etc.

a  
1     .  .  .  .  .  .  .  .  .  .  .  .  .  .
2     .  .  .  .  .  .  .  .  .  .  .  .  .  .
3     .  .  .  .  .  .  .  .  .  .  .  .  .  .
4     .  .  .  .  .  .  .  .  .  .  .  .  .  .
etc.

“點”是函數(a,b,c)的結果應終止的位置(例如,左上角的點應為“ function(1,1,2)”的結果)。 值得注意的是,在一列中應使用相同的b和c配對值(因此,在同一列中,只有“ a”變化而b和c保持不變)。

該函數的先前版本只有2個變量作為輸入(a和b,設置方式與上面的數據相同),我使用了2D數組(垂直行上“ a”的值,“ b”的值'(在水平列上)),使用以下代碼將函數應用於a和b的所有組合:

Sub applyfunction()
Dim ws As Worksheet
Dim arr_ab()
Dim a, b, i As Long, j As Long

For Each ws In Worksheets
   If ws.Name Like "Util*" Then
       With ws
           a = .Range("B5:B244").Value
           b = .Range("C2:CG2").Value
           ReDim arr_ab(1 To UBound(a), 1 To UBound(b, 2))
           For i = LBound(arr_ab) To UBound(arr_ab)
              For j = LBound(arr_ab, 2) To UBound(arr_ab, 2)
                arr_ab(a, b) = "=function(" & a(i, 1) & ", " & b(1, j) & ")"
              Next j
           Next i
           .Range("C5:CG244").Value = arr_ab()
       End With
   End If
Next ws

End Sub

但是,既然我已經向函數添加了第三個變量(c),我想使用function(a,b,c)。 我很難像我只有2個變量時那樣工作。 有沒有辦法仍然為此使用數組?

在此先感謝您的幫助。

編輯:我想在函數中使用a,b,c的值(不是引用)

Option Explicit
Sub ApplyFunction()

Dim Arng As Range: Set Arng = Application.Range("A4:A8")
Dim AVal As Integer
Dim ACell As Range
Dim ARow As Integer

Dim Brng As Range: Set Brng = Application.Range("C1:G1")
Dim BVal As Integer
Dim BCell As Range
Dim BCol As Integer
Dim BRow As Integer

Dim CVal As Integer


For Each ACell In Arng
  AVal = ACell.Value
  ARow = ACell.Row
  For Each BCell In Brng
    BVal = BCell.Value
    BCol = BCell.Column
    BRow = BCell.Row
    CVal = Cells(BRow + 1, BCol)
    Cells(ARow, BCol) = ABC(AVal, BVal, CVal)
  Next
Next


End Sub

Function ABC(A As Integer, B As Integer, C As Integer) As Integer
   ABC = A * B * C
End Function

我不確定這是否是您想要的。 在數組中使用三個元素的問題是,您將失去從二維結果集到三維數組的映射。 因此,當您要將結果傳輸到工作表時,您將不得不做一些不同的事情,即不僅要繪制數組的內容。 簡短的答案使您的問題錯了,但是是的,如果可以的話,您可以添加多個維度,但是在將其映射到二維結果集時,效率會越來越低,而且笨拙。 我還沒有在上面用我的代碼重新創建過所有代碼,但是我已經包含了足夠的內容來向您展示另一種方法。 我不是在檢查我正在使用的工作表,也不是完全引用單元格等,而是將其放在工作表中,它會做我想做的事情,然后修改以攻擊正確的工作表等。

使用Application.Transpose()處理一維數組,這使事情變得更簡單:

Sub applyfunction()
    Dim ws As Worksheet
    Dim a As Variant, b As Variant, c As Variant
    Dim i As Long, j As Long

    For Each ws In Worksheets
        If ws.name Like "Util*" Then
            With ws
                a = Application.Transpose(.Range("B5", Cells(.Rows.Count, "B").End(xlUp)).Value)
                b = Application.Transpose(Application.Transpose(.Range("C2", .Cells(2, .Columns.Count).End(xlToLeft)).Value))
                c = Application.Transpose(Application.Transpose(.Range("C3").Resize(, UBound(b)).Value))
                ReDim abc(1 To UBound(a), 1 To UBound(b))
                For i = LBound(a) To UBound(a)
                    For j = LBound(b) To UBound(b)
                        abc(i, j) = "=MyFunction(" & a(i) & ", " & b(j) & ", " & c(j) & ")"
                    Next j
                Next i
                .Range("C5").Resize(UBound(a), UBound(b)).Value = abc()
            End With
        End If
    Next
End Sub

雖然可以將bc保留在2D數組中以縮短代碼一些:

Sub applyfunction()
    Dim ws As Worksheet
    Dim a As Variant, bc As Variant
    Dim i As Long, j As Long

    For Each ws In Worksheets
        If ws.name Like "Util*" Then
            With ws
                a = Application.Transpose(.Range("B5", Cells(.Rows.Count, "B").End(xlUp)).Value)
                bc = .Range("C2", .Cells(2, .Columns.Count).End(xlToLeft)).Resize(2).Value
                ReDim abc(1 To UBound(a), 1 To UBound(bc, 2))
                For i = LBound(a) To UBound(a)
                    For j = LBound(bc, 2) To UBound(bc, 2)
                        abc(i, j) = "=MyFunction(" & a(i) & ", " & bc(1, j) & ", " & bc(2, j) & ")"
                    Next
                Next
                .Range("C5").Resize(UBound(a), UBound(bc, 2)).Value = abc()
            End With
        End If
    Next
End Sub

注意:我使用“ MyFunction”而不是“ function”來進行測試。 將“ MyFunction”更改為您的實際函數名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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