Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 是否在工作表名称的字符串和工作表之间进行更改?_Vba_Excel - Fatal编程技术网

Vba 是否在工作表名称的字符串和工作表之间进行更改?

Vba 是否在工作表名称的字符串和工作表之间进行更改?,vba,excel,Vba,Excel,我是VBA新手,如果我不太习惯VBA语法,请原谅 这是我的问题:我有大量包含类似数据的工作表,我想制定一个程序来研究每张工作表单元格中的数据(单元格始终位于每张工作表的相同范围内),并将其复制到我的工作表“详细信息”中 我尝试将每个工作表的名称转换为字符串,这样我就可以迭代它(s1,然后s2,然后…),但是当我使用工作表(“s”&1)时,VBA将“s”&I识别为字符串而不是工作表 如何将“s”和

我是VBA新手,如果我不太习惯VBA语法,请原谅

这是我的问题:我有大量包含类似数据的工作表,我想制定一个程序来研究每张工作表单元格中的数据(单元格始终位于每张工作表的相同范围内),并将其复制到我的工作表“详细信息”中

我尝试将每个工作表的名称转换为字符串,这样我就可以迭代它(s1,然后s2,然后…),但是当我使用工作表(“s”&1)时,VBA将“s”&I识别为字符串而不是工作表

如何将“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

首先,在字符串赋值之前去掉
集合
;这导致了一个错误

我认为您不需要在For循环中增加
I
。这将作为循环的一部分自动发生。 另外,如果我读对了你的文章,我认为你的作业是倒退的。您想将数据从“s1”复制到“DETAILS”,对吗

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

因此,假设您的工作表名称为“s1”、“s2”等,这应该是可行的

当对字符串
“s1”
求值时,您希望
“s”和1
求值为变量
s1
。这是一个编程错误。变量
x
与字符串或字符
“x”
不同。您不能使
“s”和1
评估为
“度量”
。无论您做什么,它都将计算为
“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
将导致每次迭代工作表时,
工作表(“详细信息”)
中的数据被覆盖。目标单元格需要依赖于示例中的
i
。我们可以通过将每个循环的
替换为

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)
将计算为
“度量值”
。我还使用
I
更改了目标单元格,但您需要根据自己的喜好进行更改


如前所述,
Set
用于分配对象引用。它不能用于字符串、整数、数组等非对象数据类型


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

您的工作表是否命名为“s1”、“s2”、“s3”、“s4”等?此外,如果要在17张图纸中循环,且每张图纸中的k为1到9,则For循环看起来是向后的。除非你做的是k-as-1到所有表,然后k-as-2到所有表,等等…啊哈!你有点洞察力。我不明白为什么会有这些变量;我不知道OP到底想干什么+1我还要补充一点,根据@Christmas007,循环可能更好地反转(外部循环的表)。我认为详细信息工作表是目标而不是源。@LimaNightHawk如果“详细信息”是目标,那么
.Cells(18,14+k).Value
将被覆盖,因为它不会与工作表进行迭代。在原始情况下,它需要依赖于
i
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