Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
在多个excel工作簿中按顺序运行多个宏-vba_Vba_Excel - Fatal编程技术网

在多个excel工作簿中按顺序运行多个宏-vba

在多个excel工作簿中按顺序运行多个宏-vba,vba,excel,Vba,Excel,我有多个excel工作簿,每个工作簿代表一天的数据,每个工作簿有多个工作表代表一天中的每个事件 我需要在工作簿中的每个工作表上按顺序运行6个宏,然后转到下一个工作簿(所有工作簿都在桌面上的同一文件夹中) 目前,我用这个(下面)在所有的工作表上按顺序运行宏,但是我在试图在所有的工作簿上运行宏时遇到了麻烦 Sub RUN_FILL() Dim sh As Worksheet For Each sh In ThisWorkbook.Worksheets sh.Activate Call macro

我有多个excel工作簿,每个工作簿代表一天的数据,每个工作簿有多个工作表代表一天中的每个事件

我需要在工作簿中的每个工作表上按顺序运行6个宏,然后转到下一个工作簿(所有工作簿都在桌面上的同一文件夹中)

目前,我用这个(下面)在所有的工作表上按顺序运行宏,但是我在试图在所有的工作簿上运行宏时遇到了麻烦

Sub RUN_FILL()
Dim sh As Worksheet

For Each sh In ThisWorkbook.Worksheets
sh.Activate

Call macro_1
Call macro_2  
Call macro_3  
Call macro_4  
Call macro_5  
Call macro_6

Next sh
End Sub
你知道我该怎么做吗?

伪代码大纲:

For each file in folder  ' I'd use the FileSystemObject for this
    Set wb = Workbooks.Open file 
    For Each sh in wb.worksheets
        ....
    Next
    wb.save
    wb.close
Next 
伪代码大纲:

For each file in folder  ' I'd use the FileSystemObject for this
    Set wb = Workbooks.Open file 
    For Each sh in wb.worksheets
        ....
    Next
    wb.save
    wb.close
Next 

我没有您的宏,所以我创建了伪宏,为每个工作簿的每个工作表(包含宏的工作簿除外)向即时窗口输出一些值

您的代码似乎取决于激活每个工作表的输出宏。这是个坏习惯。我将工作簿和工作表名称传递给宏。我输出单元格A1的值(
.Cells(1,1).value
)来显示它是如何完成的

我希望这足以让你开始。询问是否有不清楚的地方

Option Explicit
Sub ControlCall()

  Dim FileNameCrnt As String
  Dim InxWSheet As Long
  Dim MsgErr As String
  Dim PathCrnt As String
  Dim RowReportCrnt As Long
  Dim WBookCtrl As Workbook
  Dim WBookOther As Workbook
  Dim WSheetNameOtherCrnt As String

  If Workbooks.Count > 1 Then
    ' It is easy to get into a muddle if there are multiple workbooks
    ' open at the start of a macro like this.  Avoid the problem.
    Call MsgBox("Please close all other workbooks " & _
                "before running this macro", vbOKOnly)
    Exit Sub
  End If

  Application.ScreenUpdating = False

  Set WBookCtrl = ActiveWorkbook

  ' Assume all the workbooks to be processed are in the
  ' same folder as the workbook containing this macro.
  PathCrnt = WBookCtrl.Path

  ' Add a slash at the end of the path if needed.
  If Right(PathCrnt, 1) <> "\" Then
    PathCrnt = PathCrnt & "\"
  End If

  FileNameCrnt = Dir$(PathCrnt & "*.xl*")

  Do While FileNameCrnt <> ""

    If FileNameCrnt <> WBookCtrl.Name Then
      ' Consider all workbooks except the one containing this macro
      Set WBookOther = Workbooks.Open(PathCrnt & FileNameCrnt)

      For InxWSheet = 1 To WBookOther.Worksheets.Count
        WSheetNameOtherCrnt = WBookOther.Worksheets(InxWSheet).Name

        Call macro_1(WBookOther, WSheetNameOtherCrnt)
        Call macro_2(WBookOther, WSheetNameOtherCrnt)
        Call macro_3(WBookOther, WSheetNameOtherCrnt)
        Call macro_4(WBookOther, WSheetNameOtherCrnt)
        Call macro_5(WBookOther, WSheetNameOtherCrnt)
        Call macro_6(WBookOther, WSheetNameOtherCrnt)
      Next
      WBookOther.Close SaveChanges:=False
    End If
 FileNameCrnt = Dir$()
Loop

Application.ScreenUpdating = True

End Sub
Sub macro_1(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "1 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_2(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "2 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_3(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "3 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_4(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "4 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_5(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "5 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_6(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "6 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
选项显式
子控制调用()
Dim FileNameCrnt作为字符串
将纸张调暗,使其变长
作为字符串的Dim MsgErr
Dim PathCrnt作为字符串
变暗的行报告与长的行报告相同
将WBookCtrl设置为工作簿
将WBookOther设置为工作簿
将WSheetNameOtherCrnt设置为字符串
如果工作簿.计数>1,则
他说,如果有多本工作簿,很容易陷入混乱
'在这样的宏开始时打开。避免这个问题。
致电MsgBox(“请关闭所有其他工作簿”&_
“运行此宏之前”,vbOKOnly)
出口接头
如果结束
Application.ScreenUpdating=False
设置WBookCtrl=ActiveWorkbook
'假设所有要处理的工作簿都在
'与包含此宏的工作簿相同的文件夹。
PathCrnt=WBookCtrl.Path
'如果需要,在路径末尾添加斜杠。
如果正确(路径号,1)\,则
PathCrnt=PathCrnt&“\”
如果结束
FileNameCrnt=Dir$(路径crnt&“*.xl*”)
当文件名为“”时执行此操作
如果文件名crnt WBookCtrl.Name,则
考虑所有工作簿,除了包含此宏的工作簿
设置WBookOther=Workbooks.Open(路径和文件名)
对于InxWSheet=1到WBookOther.Worksheets.Count
WSheetNameOtherCrnt=WBookOther.Worksheets(InxWSheet).Name
调用宏_1(WBookOther、WSheetNameOtherCrnt)
调用宏2(WBookOther、WSheetNameOtherCrnt)
调用宏3(WBookOther、WSheetNameOtherCrnt)
调用宏4(WBookOther、WSheetNameOtherCrnt)
调用宏_5(WBookOther、WSheetNameOtherCrnt)
调用宏6(WBookOther、WSheetNameOtherCrnt)
下一个
WBookOther.Close SaveChanges:=False
如果结束
FileNameCrnt=Dir$()
环
Application.ScreenUpdating=True
端接头
子宏_1(WBookOther作为工作簿,WSheetNameOtherCrnt作为字符串)
用WBookOther
使用.worksheet(WSheetNameOtherCrnt)
调试。打印“1”和WBookOther.Name&“_
WSheetNameOtherCrnt&“”和.Cells(1,1).Value
以
以
端接头
子宏_2(WBookOther作为工作簿,WSheetNameOtherCrnt作为字符串)
用WBookOther
使用.worksheet(WSheetNameOtherCrnt)
调试。打印“2”和WBookOther.Name&“_
WSheetNameOtherCrnt&“”和.Cells(1,1).Value
以
以
端接头
子宏_3(WBookOther作为工作簿,WSheetNameOtherCrnt作为字符串)
用WBookOther
使用.worksheet(WSheetNameOtherCrnt)
Debug.Print“3”和WBookOther.Name&“_
WSheetNameOtherCrnt&“”和.Cells(1,1).Value
以
以
端接头
子宏_4(WBookOther作为工作簿,WSheetNameOtherCrnt作为字符串)
用WBookOther
使用.worksheet(WSheetNameOtherCrnt)
调试。打印“4”和WBookOther.Name&“_
WSheetNameOtherCrnt&“”和.Cells(1,1).Value
以
以
端接头
子宏_5(WBookOther作为工作簿,WSheetNameOtherCrnt作为字符串)
用WBookOther
使用.worksheet(WSheetNameOtherCrnt)
调试。打印“5”和WBookOther.Name&“_
WSheetNameOtherCrnt&“”和.Cells(1,1).Value
以
以
端接头
子宏_6(WBookOther作为工作簿,WSheetNameOtherCrnt作为字符串)
用WBookOther
使用.worksheet(WSheetNameOtherCrnt)
调试。打印“6”和WBookOther.Name&“_
WSheetNameOtherCrnt&“”和.Cells(1,1).Value
以
以
端接头

我没有您的宏,因此我创建了虚拟宏,为每个工作簿的每个工作表(包含宏的工作簿除外)向即时窗口输出一些值

您的代码似乎取决于激活每个工作表的输出宏。这是个坏习惯。我将工作簿和工作表名称传递给宏。我输出单元格A1的值(
.Cells(1,1).value
)来显示它是如何完成的

我希望这足以让你开始。询问是否有不清楚的地方

Option Explicit
Sub ControlCall()

  Dim FileNameCrnt As String
  Dim InxWSheet As Long
  Dim MsgErr As String
  Dim PathCrnt As String
  Dim RowReportCrnt As Long
  Dim WBookCtrl As Workbook
  Dim WBookOther As Workbook
  Dim WSheetNameOtherCrnt As String

  If Workbooks.Count > 1 Then
    ' It is easy to get into a muddle if there are multiple workbooks
    ' open at the start of a macro like this.  Avoid the problem.
    Call MsgBox("Please close all other workbooks " & _
                "before running this macro", vbOKOnly)
    Exit Sub
  End If

  Application.ScreenUpdating = False

  Set WBookCtrl = ActiveWorkbook

  ' Assume all the workbooks to be processed are in the
  ' same folder as the workbook containing this macro.
  PathCrnt = WBookCtrl.Path

  ' Add a slash at the end of the path if needed.
  If Right(PathCrnt, 1) <> "\" Then
    PathCrnt = PathCrnt & "\"
  End If

  FileNameCrnt = Dir$(PathCrnt & "*.xl*")

  Do While FileNameCrnt <> ""

    If FileNameCrnt <> WBookCtrl.Name Then
      ' Consider all workbooks except the one containing this macro
      Set WBookOther = Workbooks.Open(PathCrnt & FileNameCrnt)

      For InxWSheet = 1 To WBookOther.Worksheets.Count
        WSheetNameOtherCrnt = WBookOther.Worksheets(InxWSheet).Name

        Call macro_1(WBookOther, WSheetNameOtherCrnt)
        Call macro_2(WBookOther, WSheetNameOtherCrnt)
        Call macro_3(WBookOther, WSheetNameOtherCrnt)
        Call macro_4(WBookOther, WSheetNameOtherCrnt)
        Call macro_5(WBookOther, WSheetNameOtherCrnt)
        Call macro_6(WBookOther, WSheetNameOtherCrnt)
      Next
      WBookOther.Close SaveChanges:=False
    End If
 FileNameCrnt = Dir$()
Loop

Application.ScreenUpdating = True

End Sub
Sub macro_1(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "1 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_2(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "2 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_3(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "3 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_4(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "4 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_5(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "5 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
Sub macro_6(WBookOther As Workbook, WSheetNameOtherCrnt As String)

  With WBookOther
    With .Worksheets(WSheetNameOtherCrnt)
      Debug.Print "6 " & WBookOther.Name & " " & _
                  WSheetNameOtherCrnt & " " & .Cells(1, 1).Value
    End With
  End With

End Sub
选项显式
子控制调用()
Dim FileNameCrnt作为字符串
将纸张调暗,使其变长
作为字符串的Dim MsgErr
Dim PathCrnt作为字符串
变暗的行报告与长的行报告相同
将WBookCtrl设置为工作簿
将WBookOther设置为工作簿
将WSheetNameOtherCrnt设置为字符串
如果工作簿.计数>1,则
他说,如果有多本工作簿,很容易陷入混乱
'在这样的宏开始时打开。避免这个问题。
致电MsgBox(“请关闭所有其他工作簿”&_
“运行此宏之前”,vbOKOnly)
出口接头
如果结束
Application.ScreenUpdating=False
设置WBookCtrl=ActiveWorkbook
'假设所有要处理的工作簿都在
'与包含此宏的工作簿相同的文件夹。
PathCrnt=WBookCtrl.Path
'如果需要,在路径末尾添加斜杠。
如果正确(路径号,1)\,则
PathCrnt=PathCrnt&“\”
如果结束
FileNameCrnt=Dir$(路径号&“*