繁体   English   中英

VBA Excel:跨模块、工作表和工作簿共享变量

[英]VBA Excel : share variables across modules, sheets and workbooks

我正在尝试跨多个模块、工作表和工作簿访问变量。 我什至无法在同一个工作簿中的模块之间共享它们……我想知道缺少什么。 在这种情况下,我想打开一个文件,然后跨模块共享其名称,以便通过其他功能对其进行操作。

运行此过程"Sub get_workbook_and_sheets_names_S"时,它要求运行一个宏(我选择了Sub myMain ),但后来我只得到了宏 output。

最终输出

Sub myMain()
Dim i As Integer
Static v_sheet_name_S As Variant
Static v_workbook_name_S As Variant


'Call f_FSOGetFileName_S

With Application.Workbooks(f_FSOGetFileName_S)
     v_workbook_name_S = .Name
    
     Debug.Print "this is WORKBOOK  : " & v_workbook_name_S
    
     For i = 1 To .Sheets.Count
         
        
         v_sheet_name_S = .Sheets(i).Name
         
         Debug.Print "this is workbook SHEET : " & v_sheet_name_S
         
     Next

End With

'Call f_FSOGetFileName_T


End Sub



Function f_FSOGetFileName_S()   'OPEN SOURCE FILE
    
    Dim v_strFile_S As String
    Dim v_FileName_S As String
    Dim v_FSO_S As New FileSystemObject
        
    Dim v_FileNameWOExt_S As Variant
    
    
    Set v_FSO_S = CreateObject("Scripting.FileSystemObject")

    'get file full path
    v_strFile_S = Application.GetOpenFilename(filefilter:="Excel files,*.x*", Title:="select SOURCE file")
    Workbooks.Open Filename:=v_strFile_S


    
    
    'Get File Name
    
    v_FileName_S = v_FSO_S.GetFileName(v_strFile_S)
    
   
    
    'Get File Name no Extension
    v_FileNameWOExt_S = Left(v_FileName_S, InStr(v_FileName_S, ".") - 1)
    
    f_FSOGetFileName_S = v_FileName_S    'FUNCTION RESULT

End Function



Sub get_workbook_and_sheets_names_S(v_workbook_name_S, v_sheet_name_S)

Debug.Print "Source workbook name : " & v_workbook_name_S
Debug.Print "Source sheet name : " & v_sheet_name_S


End Sub

为了创建Global变量,请按以下方式进行:

  1. 标准模块之上(在声明区域)创建一个Public变量:
   Public v_workbook_name_S As String

可以从已声明它的工作簿的所有模块访问/使用此变量。 你应该简单地使用:

   Debug.print v_workbook_name_S

当然,变量必须事先收到一个值......

  1. 为了可以从其他工作簿访问,您还应该在声明了全局变量的工作簿中创建 function (**not Private )。 在标准模块中:
Sub setGobVarStr()
    v_workbook_name_S = "myString"
End Sub
  1. 可以通过上述 function 访问全局变量值,使用:
Sub testReadGlobalVar()
     Dim wbName As String, myName As String
     wbName = "Teste Forum StackOverflow Last.xlsm"

     myName = Application.Run("'" & wbName & "'!getWbName")
     Debug.Print myName
End Sub

当然,全局变量应该事先收到一个值。 如果没有,代码将返回一个VBNullString ,无论如何......

注意

不能在 colling Sub / Function中声明相同的变量,在这种情况下,代码不会引发任何错误,但它会重写全局变量并返回一个VBnullString ,太...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM