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