2015-02-06 167 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