Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在两个工作簿中的两个工作表数组中循环_Arrays_Vba_Excel - Fatal编程技术网

Arrays 在两个工作簿中的两个工作表数组中循环

Arrays 在两个工作簿中的两个工作表数组中循环,arrays,vba,excel,Arrays,Vba,Excel,我试图创建并循环两个不同的数组,每个数组包含20个工作表。工作表来自两个不同的工作簿,“每月”和“每周” 我有以下内容(经过一些建议的编辑): 代码的最终目标是从每个每周工作表的特定单元格复制数据,并将其粘贴到相应月度工作表的相应单元格中;所以循环需要像一对一的关系 当前结果(12个MSG框): “月报是读月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊” “月报是写月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊” “月报是科学月刊”,“周报是阅读周刊”,“周报是写作

我试图创建并循环两个不同的数组,每个数组包含20个工作表。工作表来自两个不同的工作簿,“每月”和“每周”

我有以下内容(经过一些建议的编辑):

代码的最终目标是从每个每周工作表的特定单元格复制数据,并将其粘贴到相应月度工作表的相应单元格中;所以循环需要像一对一的关系

当前结果(12个MSG框):

  • “月报是读月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊”
  • “月报是写月报”,“周报是读周报”,“周报是写周报”,“周报是科学周刊”
  • “月报是科学月刊”,“周报是阅读周刊”,“周报是写作周刊”,“周报是科学周刊”
预期结果(6个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
vs
wWshtNames
很难阅读,而且很容易将其中一个误认为另一个。那么改成
月报
周报
怎么样?也就是说,我不知道你的问题是什么。好吧,让我提出一些建议。删除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