我有一个成功获取可选参数的函数:firstRange_1,secondRange_2; firstRange_2,secondRange_2;等
对于每个可选参数,如果参数传递给函数,我需要执行一系列语句。
例如
dim firstRange_1 as range
dim secondRange_1 as range
dim firstRange_2 as range
dim secondRange_2 as range
etc.
dim firstCell_1 as string
dim lastCell_1 as string
dim firstCell_2 as string
dim lastCell_2 as string
etc.
If IsMissing(firstRange_1) = False Then
firstCell_1 = secondRange_1.Cells(1,1).Address
lastCell_1 = secondRange_1.Cells(secondRange_1.Rows.Count, secondRange_1.Rows.Count)
End if
if IsMissing(firstRange_2) = False Then
firstCell_2 = secondRange_2.Cells(1,1).Address
lastCell_2 = secondRange_2.Cells(secondRange_2.Rows.Count, secondRange_2.Rows.Count)
End If
是否有可能“构建”(对不起,如果术语不正确,我还没有编程或vba的经验)动态变量?
例如像
这样的循环For n=1 to 100
If IsMissing(firstRange_ & "n") = False Then
firstCell_ & "n" = secondRange_ & "n".Cells(1,1).Address
lastCell_ & "n" = secondRange_ & "n".Cells(secondRange_ & "n".Rows.Count, secondRange_ & "n".Rows.Count)
End If
Next
编辑:
请参阅我对BranislavKollár的评论以获取更新。
答案 0 :(得分:1)
您无法动态命名变量,但可以使用数组。他们是愚蠢的强大,所以值得了解它们。
基本上你会制作2个阵列。一个用于输入(variable1_n)和一个输出(output_1_n)。
Dim inputArray(1 to 100) as String 'or whatever type these are supposed to be
Dim outputArray(1 to 100) as Range 'perhaps these are ranges?
For i = 1 to 100
Set outputArray(i) = function(inputArray(i))
Next i
现在你有一个充满范围的数组!
答案 1 :(得分:1)
我认为您需要重写功能以使用 ParamArrays (see the "Using an Indefinite Number of Arguments" section) 。这样的事情:
myFunction(ParamArray userRanges()) As Range'or whatever Data Types you need
这样,您可以使用LBound
和UBound
函数来查看有多少参数传递给函数,从而有必要检查它们是否缺失。
例如,您可以在函数(而不是参数数组)中创建 2个新数组,以确定每个参数范围的第一个和最后一个单元格。 这不是唯一的方法,您可以使用2D数组或将所有内容放入一个数组中。这只是一种方式。
Function myFunction(ParamArray userRanges()) As Range
Dim firstCell() As Range
Dim lastCell() As Range
ReDim firstCell(UBound(userRanges))
ReDim lastCell(UBound(userRanges))
For x = 0 To UBound(userRanges)
Set firstCell(x) = userRanges(x).Range("A1")
Set lastCell(x) = firstCell_1(x).Offset(userRanges(x).Rows.Count - 1, userRanges(x).Columns.Count - 1)
Next x
'other code to actually do something with the cells
'...
End Function
试试这个,如果您有任何问题,请告诉我们。
还有一个链接可以了解这个Understanding the ParamArray
根据OP的评论,我重写了代码,现在每个输入范围userRanges
都会将firstCell
和lastCell
存储在适当的数组中。我以前没有意识到我之前帖子的局限性。
现在唯一想到的是,指数0
是第一个范围; 1
是第二范围; 2
是第三范围;等
或者您可以使用Option Base 1
使其更自然地编入索引,但出于某种原因不建议这样做。