Excel VBA统一了两个变量

时间:2011-07-06 06:28:26

标签: excel-vba vba excel

我有一个代码:

Public nrSheet As Integer
Public sheetName As Variant

Sub serials()

a = 1
nrSheet = ThisWorkbook.Sheets.Count
For i = 2 To nrSheet
    sheetName = Sheets(i).Name
    a = a + 1
Next
End Sub

我想要像

这样的东西

sheetName& a =表格(i).Name

,结果应为:

sheetName1 =“Sheet1”

sheetName2 =“Sheet2”

我怎么能这样做,因为不使用&或+

谢谢

3 个答案:

答案 0 :(得分:0)

你的意思是:

sheetName = Sheets(i).Name & a

[编辑]

不,你不,抱歉。 :)你描述的是不可能的,但你实际上是在寻找阵列。对于数组,您可以拥有一个列表变量,就像您已经使用的Sheets集合一样。

所以你可以写:

sheetName(a) = Sheets(i).Name & a

然后在需要第一个工作表名称的地方使用sheetName(1)。

我在这里找到a tutorial on using arrays in Excel VBA

答案 1 :(得分:0)

您可以使用“for each Loop”循环遍历每张工作表。 使用“Scripting.Dictionary”而不是数组,可以省去一些麻烦。

这是满足您需求的另一种方法:

Public sheetName As Scripting.Dictionary

Sub serials()
    Dim mySheet As Worksheet

    Set sheetName = New Scripting.Dictionary

    For Each mySheet In ThisWorkbook.Worksheets
        sheetName.Add mySheet.Name, "Here you can add another variable/value" 'Dictionary requiers allways a Key (first argument) and a Item(second argument)
    Next mySheet

    Set sheetName = Nothing 'Put this line at the end of your procedure.
End Sub

要检索您的值,您只需要:sheetName.Keys( n )。其中 n 是索引号。 要测试值是否在字典中,只需使用sheetName.Exists( Name )。其中名称是工作表的名称。

要使字典可用,请转到Extras-> Reference并选中“Microsoft Scripting Runtime”选项。

您可以在此处获得有关Dictionary Object

的更多信息

答案 2 :(得分:0)

这正是Arrays和其他集合的创建方式,但它们更好,因为您不需要拥有多个变量。

<强>阵列
VB中的数组通常声明如下:

Dim sheetName(1 to 10) As String

在上面的例子中,我们已经指定我们想要1到10之间的索引,所以我们可以通过指定类似的东西来访问它们:

Debug.Print sheetName[5]

输出第五个元素。如果您不知道阵列中可以预期的项目数,则必须按如下方式声明:

Dim sheetName() As String

然后,您需要声明该项目的使用量:

ReDim sheetName(1 to 10)

请注意,如果您有一个阵列,并且想要添加更多项目,则需要自行管理调整大小。
假设我们有1到10个单位,然后你想要把它变大:

ReDim Preserve sheetName(1 to 20)

使用preserve关键字确保我们不会丢失现有数据。

幸运的是,已经包含了一些其他选项来管理这些选项,而不必担心手动增加大小。

然后,您可以通过执行以下操作来获取阵列数据:

Dim sheetName(1 To 10) As String
sheetName(1) = "One"
sheetName(2) = "Two"
Dim i As Integer
For i = 1 To 10
    Debug.Print sheetName(i)
Next i

请注意,在这种情况下,我们已宣布有10张,尽管事实上我们只声明了其中的两张,所以这将愚蠢地通过并打印出10个工作表名称中的每一个,8其中将是空白的。

此处的另一个选择是使用For Each,因此我们无需担心计数器。

Dim sheetName(1 To 10) As String
sheetName(1) = "One"
sheetName(2) = "Two"
Dim sheet As Variant
For Each sheet In sheetName
    Debug.Print sheet
Next sheet

遗憾的是,这会产生同样的问题,因为它会打印出10个工作表名称中的每一个。

幸运的是,VB有一些内置的集合可以解决其中的一些问题。

<强>集合
Visual Basic具有内置集合。 您可以按如下方式声明集合:

Dim sheetName As Collection
Set sheetname = New Collection

请注意,我们需要使用Set和New关键字来创建集合,因为这是一个复杂的类型 您现在可以通过执行以下操作添加一个集合:

sheetName.Add "Your Sheet Name"

进一步采用上述代码示例,我们可以执行以下操作:

Dim sheetName As Collection
Set sheetName = New Collection
sheetName.Add "One"
sheetName.Add "Two"
Dim sheet As Variant
For Each sheet In sheetName
    Debug.Print sheet
Next sheet

现在,请注意我们不必担心Collection中有多少元素。我们可以根据需要添加它,并且将处理重新调整大小。

也可以使用索引号(如数组)访问集合,因此如果您愿意,我们仍然可以执行以下操作:

Dim i As Integer
For i = 1 To 2
    Debug.Print sheetName(i)    ' where this is the sheetName Collection
Next i

集合还允许您定义用于引用sheetName项的键。假设我们仍然想要使用另一个变量来跟踪工作表,这将使您最接近您在问题中最初要求的内容,尽管现在您已经看到没有任何需要这样做:

Dim sheetName As Collection
Set sheetName = New Collection
sheetName.Add "One", "Sheet" & "1"    ' Note that I have only separated the
sheetName.Add "Two", "Sheet" & "2"    ' Sheet & the 1 for illustrative purposes.
Dim i As Integer
For i = 1 To 2
    Debug.Print sheetName("Sheet" & i)
Next i

最后,为了完整起见,CaBieberach在answer中提到了Scripting.Dictionary。

<强>词典
字典实际上不是标准VB的一部分,但可以很容易地包含在内。执行此操作的步骤是通过转到“Microsoft Scripting Runtime”中的“工具”,“引用”和“添加勾选”来包含对“Microsoft Scripting Runtime”的引用。
完成后,您可以按如下方式创建字典:

Dim sheetName As Scripting.Dictionary
Set sheetName = New Scripting.Dictionary
sheetName.Add "Sheet" & "1", "One"  ' Note that these are reversed. The Key is first,
sheetName.Add "Sheet" & "2", "Two"  ' the Item is second.
Dim sheet As Variant
For Each sheet In sheetName
    Debug.Print sheet
Next sheet

字典几乎可以与集合完全相同,但必须有一个键才能与每个项目一起使用,这可以用于非常快速查看 - up,所以在上面的示例中我们将Item列为One,我们可以:

Debug.Print sheetName("Sheet1")

获得“One”的输出

<强>推荐
如果您只是存储一些工作表名称而且不需要非常快速的查找,我就不会费心使用Scripting.Dictionary,在我看来,收集就足够了,您不需要记住包含非标准引用。

使用For Each遍历项目 - 这样您无需无理由地跟踪额外的整数。