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