使用Concatenate构建变量名称

时间:2015-04-02 23:24:42

标签: excel-vba vba excel

我有一个成功获取可选参数的函数: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的评论以获取更新。

2 个答案:

答案 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

这样,您可以使用LBoundUBound函数来查看有多少参数传递给函数,从而有必要检查它们是否缺失。

例如,您可以在函数(而不是参数数组)中创建 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

编辑1

根据OP的评论,我重写了代码,现在每个输入范围userRanges都会将firstCelllastCell存储在适当的数组中。我以前没有意识到我之前帖子的局限性。

现在唯一想到的是,指数0是第一个范围; 1是第二范围; 2是第三范围;等
或者您可以使用Option Base 1使其更自然地编入索引,但出于某种原因不建议这样做。