在工作表和工作表之间更改工作表的名称?

时间:2014-12-03 14:48:39

标签: vba excel-vba excel

我对VBA很陌生,所以如果我没有真正习惯VBA语法,请原谅。

这是我的问题:我有大量包含类似数据的表格,我想制作一个程序来研究每张纸张单元格中的数据(单元格总是位于每张纸张的相同范围内)并将其复制到我的工作表中" DETAILS"。

我试图转换字符串中每个工作表的名称,所以我可以迭代它(s1,然后s2,然后......),但是当我使用工作表(" s" & 1),VBA认可" s" &安培;我作为字符串而不是表格。

我可以做些什么来转换" s" &安培;我被认为是一张纸?

Sub metro()

Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim s4 As String
Dim s5 As String
Dim s6 As String

Set s1 = "measures"
Set s2 = "data"
Set s3 = "eval1"
Set s4 = "eval2"
Set s5 = "observations"
Set s6 = "improvements"


Dim k As Integer

    For k = 1 To 9
        For i = 1 To 17

        Sheets("s" & i).Cells(56, 2 + k).Value = Worksheets("DETAILS").Cells(18, 14 + k).Value
        i = i + 1
        Next
    Next

End Sub

2 个答案:

答案 0 :(得分:1)

在评估字符串"s" & 1时,您期望s1评估变量"s1"。这是编程101错误。变量x与字符串或字符"x"不同。您无法将"s" & 1评估为"measures"。无论你做什么,它总是会评估为"s1"

您无法使用编号的命名约定迭代工作表。您应该使用数组或集合。

Dim sheetNames As Variant
sheetNames = Array("measures","data","eval1","eval2","observations","improvements")

Dim k As Integer
For k = 1 To 9
    Dim sheetName As Variant
    For Each sheetName In sheetNames
        Sheets(sheetName).Cells(56, 2 + k).Value = Worksheets("DETAILS").Cells(18, 14 + k).Value
    Next
Next

您的原始问题表明,当您的示例正在从"DETAILS"读取时,您正在将值复制到"DETAILS"。只需撤消作业

 Worksheets("DETAILS").Cells(18, 14 + k).Value = Sheets(sheetName).Cells(56, 2 + k).Value
每次迭代工作表时,

都会导致Worksheets("DETAILS")中的数据被覆盖。目标单元格需要依赖于示例中的i。我们可以通过用

替换i循环来重新引入For Each
Dim i As Integer
For i = LBound(sheetNames) To UBound(sheetNames)
    Worksheets("DETAILS").Cells(18 + i, 14 + k).Values = Sheets(sheetNames(i)).Cells(56, 2 + k).Value 
Next

sheetNames(0)将评估为"measures"。我还使用i更改了目标单元格,但您需要根据自己的喜好进行更改。


正如已经说过Set用于分配对象引用。它不能用于非对象数据类型,如字符串,整数,数组。

当您只列出6个工作表名称时,我也不知道您为什么要从1到17迭代i

答案 1 :(得分:0)

首先,在字符串赋值之前删除Set;它导致错误。

我认为你不需要在For循环中增加i。这将作为循环的一部分自动发生。 此外,如果我正确阅读您的帖子,我认为您的作业是倒退的。您想将数据从“s1”复制到“DETAILS”,对吗?

还有一件事:每次循环播放新工作表时,您的详细信息都会被覆盖,因此您需要更改每张工作表的数据位置...可能在新行中?

所以,这应该有效,假设您的工作表名称是“s1”,“s2”等。

Sub metro()

    Dim s1 As String
    Dim s2 As String
    Dim s3 As String
    Dim s4 As String
    Dim s5 As String
    Dim s6 As String

    s1 = "measures"
    s2 = "data"
    s3 = "eval1"
    s4 = "eval2"
    s5 = "observations"
    s6 = "improvements"


    Dim k As Integer
    Dim i As Integer

    For i = 1 To 17
        For k = 1 To 9
            'adding i to the target row, so that each sheet will not overwrite previous data
            Worksheets("DETAILS").Cells(18 + i, 14 + k).Value = Sheets("s" & i).Cells(56, 2 + k).Value
        Next
    Next

End Sub