使用多个工作簿和宏-调用工作簿?[VBA]

使用多个工作簿和宏-调用工作簿?[VBA],vba,excel,macros,Vba,Excel,Macros,我可能有一个简单的问题,但我不知道出了什么问题。我试图在excel中创建一个大宏,它可以对多个文件执行多个操作。背景: 运行宏的excel工作表位于其自己的文件夹中。我已经设置了一个具有以下结构的小测试文件夹: C:\Users\schris\Desktop\eTime Testing\ 此文件夹中有两个文件夹: \主数据集\ 此文件夹中是包含宏的excel文件所在的位置 \EPROM处理\ 此文件夹中有三个文件夹,分别名为“恐惧”、“性别”和“快乐”。在每个文件夹中都有一个excel

我可能有一个简单的问题,但我不知道出了什么问题。我试图在excel中创建一个大宏,它可以对多个文件执行多个操作。背景:

运行宏的excel工作表位于其自己的文件夹中。我已经设置了一个具有以下结构的小测试文件夹: C:\Users\schris\Desktop\eTime Testing\

  • 此文件夹中有两个文件夹:

    • \主数据集\

      • 此文件夹中是包含宏的excel文件所在的位置
    • \EPROM处理\

      • 此文件夹中有三个文件夹,分别名为“恐惧”、“性别”和“快乐”。在每个文件夹中都有一个excel文件,我想打开它
我想做的是创建一个子RunAll,它将调用其他各种Sub,因为我想让宏做很多不同的事情,我想让它有条理

因此:

以下是我的OpenWorkbooks代码:

Sub OpenWorkbooks()
Dim wb1 As Workbook
Dim wbFear As Workbook
Dim wbGender As Workbook
Dim wbHappy As Workbook
Dim FileToOpen As Variant
Dim FileToOpen2 As Variant
Dim FileToOpen3 As Variant
Dim Sheet As Worksheet

' Must be workbook with the Macros I'm running
Set wb1 = ActiveWorkbook

' Opens Fear
ChDir "C:\Users\schris\Desktop\Eprime Testing\Eprime Processing\Fear"

FileToOpen = Application.GetOpenFilename _
(Title:="Please choose Fear file")

If FileToOpen = False Then
    MsgBox "No File Specified.", vbExclamation, "ERROR"
    Exit Sub
Else
    Set wbFear = Workbooks.Open(fileName:=FileToOpen)
End If

Set wbFear = ActiveWorkbook

' Opens Gender
ChDir "C:\Users\schris\Desktop\Eprime Testing\Eprime Processing\Gender"

FileToOpen2 = Application.GetOpenFilename _
(Title:="Please choose Gender file")

If FileToOpen2 = False Then
    MsgBox "No File Specified.", vbExclamation, "ERROR"
    Exit Sub
Else
    Set wbGender = Workbooks.Open(fileName:=FileToOpen2)
End If

Set wbGender = ActiveWorkbook

' Opens Happy
ChDir "C:\Users\schris\Desktop\Eprime Testing\Eprime Processing\Happy"

FileToOpen3 = Application.GetOpenFilename _
(Title:="Please choose Happy file")

If FileToOpen3 = False Then
    MsgBox "No File Specified.", vbExclamation, "ERROR"
    Exit Sub
Else
    Set wbHappy = Workbooks.Open(fileName:=FileToOpen3)
End If

Set wbHappy = ActiveWorkbook
End Sub
现在我希望能够参考这三本工作手册(wbFear、wbGender、wbHappy),并在它们之间无缝移动。在Sub-OpenWorkbooks()中进行测试时,执行
wbFear.Activate
将正常工作并正确处理。。。但是,当我分离出每个宏的任务时(即,OpenWorkbooks现在只打开工作簿,ProcessFear只处理Fear工作簿中的数据),我得到了一个运行时错误“91”:未设置对象变量或With block变量

我假设这与声明的工作簿名在切换Subs时“丢失”有关,但当我将OpenWorkbooks中的代码放入RunAll并仅运行ProcessFear时,它仍然无法激活正确的工作簿

基本上,我的问题是:

如何让一个宏打开三个工作簿,并将它们全部声明为其他宏可以引用的内容?我需要完成很多任务,所以我真的希望每个任务都有单独的sub,这样我就不会在代码中迷失方向


谢谢你抽出时间

有更好、更优雅的解决方案。但这是最简单的,也是最容易实现的。声明3个全局对象变量以保存工作簿引用。打开工作簿并在
OpenWorkbooks
中为这些变量赋值。根据需要使用它们。关闭它们,并在新过程中将它们设置为
Nothing
。(
Call
在此上下文中不需要)


tl;dr但是将它们声明为其他宏可以引用的东西将它们设置为您创建的变量…
wb1
wbFear
wbGender
wbHappy
。我确实将打开的工作簿设置为这些变量,但是如果我运行不同的sub.Oh,它们将不再工作。将它们声明为公共的?编辑:也就是说,在任何sub之外进行编辑。通常在最顶端,高于一切。Edit2:公共作用域不利于调试。您是否考虑过将书籍作为参数传递?在ProcessFear、ProcessGender和ProcessHappy中的每一个中添加一个
wb as WorkBook
参数。在每一本手册中,您都可以将
wb
作为工作手册。在
OpenWorkbooks
add
ProcessFear-wbFear
etcTim-Williams的末尾,我不太清楚你的意思@findwindow我还没考虑过。。。我是否仍然能够让ProcessFear/Gender/Happy成为不同的Sub,代码与OpenWorkbook分开?
Sub OpenWorkbooks()
Dim wb1 As Workbook
Dim wbFear As Workbook
Dim wbGender As Workbook
Dim wbHappy As Workbook
Dim FileToOpen As Variant
Dim FileToOpen2 As Variant
Dim FileToOpen3 As Variant
Dim Sheet As Worksheet

' Must be workbook with the Macros I'm running
Set wb1 = ActiveWorkbook

' Opens Fear
ChDir "C:\Users\schris\Desktop\Eprime Testing\Eprime Processing\Fear"

FileToOpen = Application.GetOpenFilename _
(Title:="Please choose Fear file")

If FileToOpen = False Then
    MsgBox "No File Specified.", vbExclamation, "ERROR"
    Exit Sub
Else
    Set wbFear = Workbooks.Open(fileName:=FileToOpen)
End If

Set wbFear = ActiveWorkbook

' Opens Gender
ChDir "C:\Users\schris\Desktop\Eprime Testing\Eprime Processing\Gender"

FileToOpen2 = Application.GetOpenFilename _
(Title:="Please choose Gender file")

If FileToOpen2 = False Then
    MsgBox "No File Specified.", vbExclamation, "ERROR"
    Exit Sub
Else
    Set wbGender = Workbooks.Open(fileName:=FileToOpen2)
End If

Set wbGender = ActiveWorkbook

' Opens Happy
ChDir "C:\Users\schris\Desktop\Eprime Testing\Eprime Processing\Happy"

FileToOpen3 = Application.GetOpenFilename _
(Title:="Please choose Happy file")

If FileToOpen3 = False Then
    MsgBox "No File Specified.", vbExclamation, "ERROR"
    Exit Sub
Else
    Set wbHappy = Workbooks.Open(fileName:=FileToOpen3)
End If

Set wbHappy = ActiveWorkbook
End Sub
Public gwbFear as WorkBook
Public gwbGender as WorkBook
Public gwbHappy as WorkBook

Sub RunAll()
    OpenWorkbooks
    ProcessFear
    ProcessGender
    ProcessHappy
    CloseWorkbooks
End Sub