2017-01-24 79 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