【发布时间】:2017-02-21 17:16:19
【问题描述】:
我正在尝试创建并循环遍历两个不同的数组,每个数组包含 20 个工作表。工作表来自两个不同的工作簿,“每月”和“每周”。
我有以下内容(经过一些建议的修改):
Dim Monthly As Excel.Workbook
Set Monthly = Workbooks("name of monthly workbook")
Dim Weekly As Excel.Workbook
Set Weekly = Workbooks.Open("path to weekly workbook")
Dim mWshtNames As Variant
Dim mWshtNameCrnt As Variant
Dim wWshtNames As Variant
Dim wWshtNameCrnt As Variant
mWshtNames = Array(Monthly.Worksheets("Reading Monthly"), Monthly.Worksheets("Writing Monthly"), Monthly.Worksheets("Science Monthly"))
'and so on, to include 20 worksheets
wWshtNames = Array(Weekly.Worksheets("Reading Weekly"), Weekly.Worksheets("Writing Weekly"), Weekly.Worksheets("Science Weekly"))
'and so on, to include 20 worksheets
For Each mWshtNameCrnt In mWshtNames
For Each wWshtNameCrnt In wWshtNames
MsgBox "Monthly sheet is " + mWshtNameCrnt.Name
MsgBox "Weekly sheet is " + wWshtNameCrnt.Name
'the real code will loop here; I am using MsgBox to test that the loop is working.
Next wWshtNameCrnt
Next mWshtNameCrnt
代码的最终目标是从每个 Weekly 工作表中的特定单元格复制数据并将其粘贴到相应 Monthly 工作表中的相应单元格中;所以循环需要像一对一的关系。
当前结果(12 个消息框):
- “月刊是阅读月刊”、“周刊是阅读周刊”、“周刊是每周写作”、“周刊是科学周刊”
- “月刊是每月写作”、“周刊是每周阅读”、“周刊是每周写作”、“周刊是科学周刊”
- “月刊是科学月刊”、“周刊是阅读周刊”、“周刊是每周写作”、“周刊是科学周刊”
预期结果(6 个消息框):
- “月表是月读”、“周表是周读”
- “月表是每月写作”,“周表是每周写作”
- “月刊是科学月刊”、“周刊是科学周刊”
@Jeeped 的答案具有相同的有效结果,其中即时窗口返回 9 个结果,而预期为 6 个。我想我需要“Next wWshtNameCrnt”和“Next mWshtNameCrnt”同时激活,但不知道怎么写。
【问题讨论】:
-
不应该
'and so on, to include 20 workbooks是'and so on, to include 20 workSHEETs吗? -
您应该使用
For循环来迭代数组,并使用For Each循环来迭代对象集合。您的 cmets 表明数组包含 workbooks,但您的代码另有说明,并且数组实际上包含 worksheets。此外,您的数组正在存储Worksheet对象,而不仅仅是它们的名称,因此变量的名称具有误导性......并且mWshtNames与wWshtNames很难阅读并且容易将一个误认为另一个。monthlySheets和weeklySheets怎么样? -
也就是说,我不知道你的问题是什么。
-
好的,让我提出一些建议。放弃 lorem ipsum 的东西,给我们一些明确的信息 - 月表可以是“Jan”、“Feb”、“March”,然后每周可以是“Wk1”、“Wk2”、“Wk3”——然后你可以描述你的'期待与你得到的(在你的帖子中,而不是在 cmets 中) - 再次考虑 Jeeped's answer below,它肯定能满足你的需要。
-
FWIW,关于如何创建“还需要指定工作簿的工作表”数组的问题并没有真正意义——您的代码已经这样做了。如果您需要从
Worksheet引用返回Workbook,只需调用.Parent。