Arrays 在两个工作簿中的两个工作表数组中循环
我试图创建并循环两个不同的数组,每个数组包含20个工作表。工作表来自两个不同的工作簿,“每月”和“每周” 我有以下内容(经过一些建议的编辑): 代码的最终目标是从每个每周工作表的特定单元格复制数据,并将其粘贴到相应月度工作表的相应单元格中;所以循环需要像一对一的关系 当前结果(12个MSG框):Arrays 在两个工作簿中的两个工作表数组中循环,arrays,vba,excel,Arrays,Vba,Excel,我试图创建并循环两个不同的数组,每个数组包含20个工作表。工作表来自两个不同的工作簿,“每月”和“每周” 我有以下内容(经过一些建议的编辑): 代码的最终目标是从每个每周工作表的特定单元格复制数据,并将其粘贴到相应月度工作表的相应单元格中;所以循环需要像一对一的关系 当前结果(12个MSG框): “月报是读月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊” “月报是写月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊” “月报是科学月刊”,“周报是阅读周刊”,“周报是写作
- “月报是读月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊”
- “月报是写月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊”
- “月报是科学月刊”,“周报是阅读周刊”,“周报是写作周刊”,“周报是科学周刊”
- “月报是读月报”,“周报是读周报”
- “月报是每月写的”,“周报是每周写的”
- “月报是科学月刊”,“周报是科学周刊”
@Jeeped的答案具有相同的有效结果,其中立即窗口返回九个结果,其中预期有六个结果。我想我需要同时激活“下一个wwshtnamecrn”和“下一个mwshtnamecrn”,但我不知道如何编写它。您似乎想循环查看每月的工作表,对于每个工作表,循环查看每周的工作表
Option Explicit
Sub bleh()
Dim Monthly As Excel.Workbook, Weekly As Excel.Workbook
Set Monthly = Workbooks("name of monthly workbook")
Set Weekly = Workbooks.Open("path to weekly workbook")
Dim m As Long, w As Long
Dim mWshtNames As Variant, wWshtNames As Variant
'define 20 monthly workSHEET names
mWshtNames = Array("Lorem", "Ipsum", "Dolor", "sit", "amet", _
"consectetur", "adipiscing", "elit", "Sed", "vel", _
"cursus", "purus", "Vivamus", "nec", "ex", _
"et", "lorem", "fringilla", "consectetur", "Fusce")
'define 20 weekly workSHEET names
wWshtNames = Array("Pellentesque", "quis", "viverra", "lorem", "ac", _
"sodales", "turpis", "Morbi", "in", "vulputate", _
"lectus", "Donec", "aliquam", "suscipit", "nunc", _
"eget", "bibendum", "augue", "interdum", "porta")
For m = LBound(mWshtNames) To UBound(mWshtNames)
With Monthly.Worksheets(mWshtNames(m))
Debug.Print .Name
For w = LBound(wWshtNames) To UBound(wWshtNames)
With Weekly.Worksheets(wWshtNames(w))
Debug.Print .Name
End With
Next w
End With
Next m
End Sub
这将循环遍历每个月的工作表,并将其发送到VBE的。当月度工作表处于“活动”状态时,它会循环浏览所有每周工作表,并将其.Name发送到即时窗口
虽然代码没有做任何有目的的事情,但它从使用名称的进程调用名称,以便至少验证名称
所以循环需要像一对一的关系
因此,嵌套循环不行。当您迭代外部循环中的每个项时,内部循环会在外部循环每次进行新的迭代时迭代其所有项。借用表关系词汇表,新的迭代将是一对多关系
如果是“一对一”,那么只需要一个循环,两个数组的大小相同。因此,为创建一个循环,从LBound(任意数组)到UBound(任意数组,但最好是您用于设置绑定的所有数组)
:
对于每个数组中的3个项目,这将为立即窗格(Ctrl+G)提供3行输出,这比
MsgBox
调用更实用,至少在调试时是这样。完全跳过嵌套循环。工作表按主题相互对应,但仅按名称一致。不要在进入循环之前生成所有完整的名称(和\或工作表),而是通过组合主题和工作表类型来创建索引,并在循环内部获得工作表参考:
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 subjects() As String
subjects = Split("Reading,Writing,Science", ",")
Dim weeklySheet As Worksheet
Dim monthlySheet As Worksheet
Dim subject As String
For Each subject In subjects
Set weeklySheet = Weekly.Worksheets(subject & " Weekly")
Set monthlySheet = Montly.Worksheets(subject & " Monthly")
MsgBox "Monthly sheet is " + monthlySheet.Name
MsgBox "Weekly sheet is " + weeklySheet.Name
'"Real" code here.
Next
请注意,这还允许您使用强类型引用,如工作表
和字符串
,而不必将所有内容声明为变量
不应”等等,以包括20本工作簿
be,等等,要包含20个工作表
,您应该为
循环使用一个,以迭代数组,为每个
循环使用一个,以迭代对象集合。您的注释表明数组包含工作簿,但您的代码表明不是这样,数组实际上包含工作表。此外,您的数组存储的是工作表
对象,而不仅仅是它们的名称,因此变量的名称具有误导性。。。。而且mWshtNames
vswWshtNames
很难阅读,而且很容易将其中一个误认为另一个。那么改成月报
和周报
怎么样?也就是说,我不知道你的问题是什么。好吧,让我提出一些建议。删除LROM IPSUM乱数假文,并给出一些清晰的信息,每月的单页可以是“简”、“FEB”、“三月”,然后每周可以是“WK1”、“WK2”、“WK3”,然后你可以描述你所期待的和你所得到的(在你的帖子中,而不是在评论中)-再考虑一下,这当然是你所需要的。关于如何创建“还需要指定工作簿的工作表”数组的问题没有真正意义——您的代码已经做到了这一点。如果您需要从工作表
参考返回到工作簿
,只需致电.Parent
。忍者在47秒前杀了我!:D
Dim index As Long
For index = LBound(mWshtNames) To UBound(mWshtNames)
Debug.Print mWshtNames(index).Name, wWshtNames(index).Name
Next
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 subjects() As String
subjects = Split("Reading,Writing,Science", ",")
Dim weeklySheet As Worksheet
Dim monthlySheet As Worksheet
Dim subject As String
For Each subject In subjects
Set weeklySheet = Weekly.Worksheets(subject & " Weekly")
Set monthlySheet = Montly.Worksheets(subject & " Monthly")
MsgBox "Monthly sheet is " + monthlySheet.Name
MsgBox "Weekly sheet is " + weeklySheet.Name
'"Real" code here.
Next