2017-01-24 45 views
0

我试图使用我在模块1中设置的工作簿的名称,跨越其他专用模块,但根据设置的方式我得到了不同的错误。我在代码中添加了注释,解释了在不同情况下会发生什么。VBA跨模块使用变量值

Option Explicit 

Sub TestSharedVars() 

CopyCellsthenClose 
OpenNewWksheet (AlphaExportBook) 

' *** Like this 
' OpenNewWksheet (AlphaExportBook) I get "Error Variable not defined" 

' *** Like this 
' OpenNewWksheet I get "Error Argument not optional" 

CloseWkbook 


End Sub 

Private Sub CopyCellsthenClose() 
Dim AlphaExportBook As Workbook 
Dim theRows 
Dim theColumns 
    With ActiveSheet.UsedRange 
     theRows = .Rows.Count 
     theColumns = .Columns.Count 
     Range(Cells(1, 1), Cells(theRows, theColumns)).Select 
    End With 
     Selection.Copy 

    Set AlphaExportBook = ActiveWorkbook 


End Sub 


Private Sub OpenNewWksheet() 

'****************************** 
' Open the File Dialog 
'****************************** 
Dim ReversionWBook As Workbook 


    With Application.FileDialog(msoFileDialogOpen) 
     .AllowMultiSelect = False 
     .Show 
     .Execute 
    If (.SelectedItems.Count = 0) Then 
     MsgBox "User Cancelled Operation" 
'  GoTo EndofInstructions 
    Else 
    End If 
    End With 
    ActiveWorkbook.Activate 
    Set ReversionWBook = ActiveWorkbook 
End Sub 

Private Sub CloseWkbook(AlphaExportBook As Workbook) 

'********************************** 
' Close Alpha Export WorkBook 
'********************************** 
    AlphaExportBook.Activate 
    Application.DisplayAlerts = False 
    AlphaExportBook.Close SaveChanges:=False 
    Application.DisplayAlerts = True 

End Sub 

回答

1

首先,你不应该打电话时OpenNewWksheet因为子程序没想到的论点得到一个“参数不可选”错误。你会得到这个错误,试图在不指定参数的情况下调用CloseWkbook,因为该子例程需要将一个Workbook对象传递给它。


使工作簿可用于所有子例程的最简单方法是声明具有模块级范围的变量,例如,

Option Explicit 
Dim AlphaExportBook As Workbook 

Sub TestSharedVars() 
    CopyCellsthenClose 
    OpenNewWksheet 
    CloseWkbook 
End Sub 

Private Sub CopyCellsthenClose() 
    Dim theRows 
    Dim theColumns 
    With ActiveSheet.UsedRange 
     theRows = .Rows.Count 
     theColumns = .Columns.Count 
     'Note - the following line won't do what you expect unless 
     '  UsedRange starts at cell A1 
     Range(Cells(1, 1), Cells(theRows, theColumns)).Select 
    End With 
    Selection.Copy 

    Set AlphaExportBook = ActiveWorkbook 
End Sub 


Private Sub OpenNewWksheet() 

'****************************** 
' Open the File Dialog 
'****************************** 
    Dim ReversionWBook As Workbook ' Does this need to be module-level scope too? 

    With Application.FileDialog(msoFileDialogOpen) 
     .AllowMultiSelect = False 
     .Show 
     .Execute 
     If .SelectedItems.Count = 0 Then 
      MsgBox "User Cancelled Operation" 
     End If 
    End With 
    'ActiveWorkbook.Activate ' This is redundant - the ActiveWorkbook is already active 
    Set ReversionWBook = ActiveWorkbook 
End Sub 

Private Sub CloseWkbook() 

'********************************** 
' Close Alpha Export WorkBook 
'********************************** 
    'You don't need to activate the workbook before you close it 
    'AlphaExportBook.Activate 
    Application.DisplayAlerts = False 
    AlphaExportBook.Close SaveChanges:=False 
    Application.DisplayAlerts = True 
End Sub 

或者,您可以通过子程序之间的工作簿对象如下:

Option Explicit 

Sub TestSharedVars() 
    'Dimension object to have scope only within this subroutine, but we 
    ' will pass a reference to this object to the other subroutines that 
    ' need to reference it 
    Dim AlphaExportBook As Workbook 
    CopyCellsthenClose AlphaExportBook 
    OpenNewWksheet 
    CloseWkbook AlphaExportBook 
End Sub 

Private Sub CopyCellsthenClose(wb As Workbook) 
    Dim theRows 
    Dim theColumns 
    With ActiveSheet.UsedRange 
     theRows = .Rows.Count 
     theColumns = .Columns.Count 
     'Note - the following line won't do what you expect unless 
     '  UsedRange starts at cell A1 
     Range(Cells(1, 1), Cells(theRows, theColumns)).Select 
    End With 
    Selection.Copy 

    Set wb = ActiveWorkbook 
End Sub 


Private Sub OpenNewWksheet() 

'****************************** 
' Open the File Dialog 
'****************************** 
    Dim ReversionWBook As Workbook ' Does this need to be module-level scope too? 

    With Application.FileDialog(msoFileDialogOpen) 
     .AllowMultiSelect = False 
     .Show 
     .Execute 
     If .SelectedItems.Count = 0 Then 
      MsgBox "User Cancelled Operation" 
     End If 
    End With 
    'ActiveWorkbook.Activate ' This is redundant - the ActiveWorkbook is already active 
    Set ReversionWBook = ActiveWorkbook 
End Sub 

Private Sub CloseWkbook(wb As Workbook) 

'********************************** 
' Close Alpha Export WorkBook 
'********************************** 
    'You don't need to activate the workbook before you close it 
    'wb.Activate 
    Application.DisplayAlerts = False 
    wb.Close SaveChanges:=False 
    Application.DisplayAlerts = True 
End Sub