繁体   English   中英

如何将数组传递给 Excel VBA function

[英]How do I pass an array into an Excel VBA function

我正在尝试通过删除冗余并制作更多可重用功能来清理我的一些 VBA 代码。 我正在尝试执行此操作的一个地方是 function ,我在其中获取一组行号(例如[3, 20, 45] )和一列 integer (例如5表示E )并将其转换为字符串:(例如"E3, E20, E45" )。

原始代码

这是我试图转移的原始 VBA 代码:

Dim customRange As String
customRange = ""
For cc = 0 To UBound(resultArr)
    If cc = UBound(resultArr) Then
        customRange = customRange & "E" & resultArr(cc)
    Else
        customRange = customRange & "E" & resultArr(cc) & ", "
    End If
Next cc

(请记住,我还没有尝试将列号转换为字母)

第一次尝试

这工作正常。 现在我试图通过为冗余代码创建函数来清理我的代码,但我遇到了一些错误。 一般来说,我对 VBA 相当陌生,所以这可能相当明显。 这是我的第一次尝试:

召唤:

customRange = BuildRangeStr(resultArr, 5)

Function:

Function BuildRangeStr(ByRef custRowArr As Variant, ByVal custCol As Integer) As String
    Dim aa As Integer
    'convert custCol to column letter
    If custCol <= 26 Then
        column_letter = Chr(64 + custCol)
    Else
        column_letter = Chr(Int((custCol - 1) / 26) + 64) & Chr(((custCol - 1) Mod 26) + 65)
    End If
    
    BuildRangeStr = ""
    'build string
    For aa = 0 To UBound(custRowArr)
        If aa = UBound(custRowArr) Then
            Set BuildRangeStr = BuildRangeStr & "E" & custRowArr(aa)
        Else
            Set BuildRangeStr = BuildRangeStr & "E" & custRowArr(aa) & ", "
        End If
    Next aa
End Function

第二次尝试

通过第一次尝试,我在传递数组时遇到了一些错误。 所以,我去创建一个数组的变体作为我第二次尝试的传递:

召唤:

Dim MyVar As Variant
MyVar = resultArr()
customRange = BuildRangeStr(MyVar, 5)

Function:

Function BuildRangeStr(ByVal custRowArr As Variant, ByVal custCol As Integer) As String
    Dim aa As Integer
    Dim tempStr As String
    'convert custCol to column letter
    If custCol <= 26 Then
        column_letter = Chr(64 + custCol)
    Else
        column_letter = Chr(Int((custCol - 1) / 26) + 64) & Chr(((custCol - 1) Mod 26) + 65)
    End If
    
    tempStr = ""
    'build string
    For aa = 0 To UBound(custRowArr)
        If aa = UBound(custRowArr) Then
            tempStr = tempStr & "E" & custRowArr(aa)
        Else
            tempStr = tempStr & "E" & custRowArr(aa) & ", "
        End If
    Next aa
    Set BuildRangeStr = tempStr
End Function

当前误差

我现在收到错误"Object Required"

理想的解决方案

理想情况下,我不想为我的数组创建一个变体来增加我的代码的简单性,但我知道这可能是最佳用例所必需的。

真的,我所需要的只是让我的 function 以与之前的代码相同的方式运行,但不会让我的代码因冗余片段而混乱。

如果有人有任何想法,我将不胜感激!

虽然本身不是问题主体的答案,但问题行的答案是它像任何其他变量一样被传递。 我会质疑你为什么要这样努力实现你的目标。 output 数组中的字符串的更快方法是使用连接 function ,这可以很容易地适应您想要的目的。

Sub Test()
    Dim arr() As Variant
    arr = Array(2, 5, 10)
    Debug.Print BuildRange(arr, 27)
End Sub

Function BuildRange(ByRef arr() As Variant, Col As Long) As String
    Dim Prefix As String
    Prefix = IIf(Col < 27, Chr(Col + 64), Chr(Int((Col - 1) / 26) + 64) & Chr(((Col - 1) Mod 26) + 65))
    BuildRange = Prefix & Join(arr, ", " & Prefix)
End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM