2015-02-06 117 views
-1

我有一个宏从一个“主”工作表复制一行到多个基于一组规则的其他工作表,但并不是每一行都会复制到每个工作表。因此,我有一组变量用作不同工作表上每行的“计数器”,这样我就可以跟踪当前行并且不会覆盖任何给定工作表上的任何行。这导致了许多类似于以下的丑陋代码。VBA:变量名称阵列

.Rows(material.Row).Copy Destination:=Worksheets("QM").Range("A" & QMCounter) 

我想制作成单个子,我可以打电话,我通过它从主表,预定的工作表,然后在工作表中的计数器变量行号此。

我想什么做的是创造不同的计数器变量名称的数组,这样我可以做一些类似以下

For i = 0 to Ubound(VarNameArray) 

    Counter = VarNameArray(i)   

    Call CopyRow(Material, DestWorksheet, Counter) 

Next i 

我的问题的东西在翻译变量名的字符串值成实际变量名称,以便VarNameArray(i)可以变成不是字符串“QMCounter”,而是变量QMCounter。由于并非来自“主”工作表的每一行都将被复制到每个其他工作表中,因此我需要能够独立控制每个计数器变量的值。这可能与VBA?

编辑:此电子表格的目标是查看“主”表中行中的特定单元格值,然后根据这些值将该行复制到10个“从属”工作表的组合中。因此,例如,“主”表单的第1行可能仅复制到从属表单9,但主表单的第2行可能会复制到从属表单1,2,3,6,7,9和10。第3行可能被复制到一组不同的从属工作表。这一切都取决于特定细胞的价值,我事先不知道。

我有10个从属工作表中的每一个的计数器变量来跟踪当前行,并确保我不会将所有内容都复制到该工作表的第一行。称他们为Sheet1到10和Counter1到10,Sheet1和Counter1连接到10.因此,如果我从主工作表复制一行到Sheet1,并且仅当我从主工作表复制到Sheet1时,我递增Counter1。但是,正如我已经说过的,基于用户填入的特定单元格的值在运行时确定一行被复制到的特定从属表格。

所以我想利用代码高度重复有点像

.Rows(material.Row).Copy Destination:=Worksheets("Sheet1").Range("A" & Counter1) 
.Rows(material.Row).Copy Destination:=Worksheets("Sheet3").Range("A" & Counter3) 
.Rows(material.Row).Copy Destination:=Worksheets("Sheet4").Range("A" & Counter4) 

其中代码的99%是相同的,用的东西更清洁,更通用。

+1

你想做的事情不能按照你想要的方式完成。我建议你告诉我们更多关于你的实际目标,并停止关注你感知的问题。 – RubberDuck 2015-02-06 18:17:55

+0

@RubberDuck - 目标是重构我的代码。采用丑陋且重复性强(但功能性)的代码,如第一个代码片段,并用(理想情况下)代替循环代码,其中我有一个将相关信息传递给(主行,目标表单和行目的地表格)。 – Aerogems 2015-02-06 18:48:32

+0

简短的回答是:这不能在VBA中完成。现在,似乎您至少了解For/Next循环的概念,我认为问题只是您尝试实现它的方式,而没有看到更多代码,并且是问题的更好示例(并且所需的解决方案---请修改您的OP以包含这些细节!)这将很难提供帮助。 – 2015-02-06 18:52:18

回答

1

有没有必要时,你可以直接使用数组变量名的数组...

Dim Counters 
Counters = Array(1,2,3,4,5) 

For i = LBound(Counters) to Ubound(Counters) 

    CopyRow Material, DestWorksheet, Counters(i) 

Next i 

编辑:如果你只是追加低于任何现有的新行:

.Rows(material.Row).Copy _ 
    Destination:=Worksheets("Sheet1").Cells(Rows.Count,1).End(xlUp).offset(1,0) 

只要ColA中的任何复制行都总是有值就可以工作。

+0

除了我并不总是使用相同的计数器。我有10个从属工作表到我的一个主工作表,但有时在主工作表上的第5行可能只能复制到工作表2,6和9,但第6行会被复制到工作表2,3,4,5,6和10这完全取决于特定细胞的值。所以我需要确保与特定工作表相关联的计数器得到更新,而不仅仅是任何随机计数器。 – Aerogems 2015-02-06 20:37:27

+0

然后使用类似字典的地方,你可以做'dictRows(“Sheet1”)= 10'和'dictRows(“Sheet1”)= dictRows(“Sheet1”)+ 1',或者如果你只是在末尾附加行然后使用'End(xlUp)'并且根本不跟踪行号。 – 2015-02-06 20:57:38

+0

来自编辑的例子足以让我开始,我能够适应它。它确实带来了额外的bug,如果我再次运行宏而不清除从属表中的值,它会给我重复的值,但是我只是在每次主代码被执行时清除其他表跑。无论如何,我应该已经这么做了。 – Aerogems 2015-02-06 23:00:58