2014-12-03 29 views
1

我对VBA相当陌生,所以请原谅我是否真的习惯了VBA语法。字符串和工作表之间的换单名称的变化?

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

我试图将名称转换每片在一个字符串,所以我可以遍历它(S1,S2然后,然后...),但是当我使用表(“S” & 1),VBA将的“& i”识别为字符串而不是表单。

我能做些什么来转换的“&我被承认为表?

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

您的工作表是名为“s1”,“s2”,“s3”,“s4”等吗?另外,如果您想循环使用17个工作表,每个工作表的k为1到9,则For循环看起来倒退。除非你把k当作1到所有的纸张,然后把k作为2到所有的纸张,等等...... – Chrismas007 2014-12-03 14:56:26

回答

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。我们可以通过更换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)重新引入i将评估为"measures"。我也用i做了目标单元格更改,但是您会想要将其更改为您的喜好。


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

我也不知道为什么你只重复从1到17的i当你只列出6个表名。

+0

啊哈!你更有见地。我无法弄清楚为什么那些变数在那里;我没有看到OP真的想做什么。 +1 – LimaNightHawk 2014-12-03 15:31:27

+0

我还想补充一点,即每@ Christmas007,循环可能会更好地颠倒(外循环表)。 *我认为*详细信息表是目标不是来源。 – LimaNightHawk 2014-12-03 15:34:07

+0

@LimaNightHawk如果“DETAILS”是目标,那么'.Cells(18,14 + k).Value'将被覆盖,因为它不会迭代表单。在原始情况下,它需要依赖于'i'。 – cheezsteak 2014-12-03 15:49:44

0

一,摆脱Set之前的String赋值;这是导致错误。

我不认为你需要在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