InputBox与模块中的多个子潜在variables

这是我的代码的开始:

Private FilesPath As String Private CostCentersPath As String Private FinalPath As String Private CurrentName As String Private CostCenters As Worksheet Private Final As Workbook Private Template As Worksheet Sub ReadySetGo() FilesPath = "O:\MAP\04_Operational Finance\Accruals\Accruals_Swiss_booked\2017\Month End\10_2017\Advertising\automation\" 'path change ("automation") CostCentersPath = FilesPath & "CostCenters.xlsx" CurrentName = InputBox("Please adjust the final file name:", , "ABGR_2017-10_FINAL.xls.xlsx") FinalPath = FilesPath & CurrentName Set CostCenters = Workbooks("CostCenters.xlsx").Worksheets("Cost Center Overview") Set Final = Workbooks(CurrentName) Set Template = Workbooks("Template.xlsm").Worksheets("Template") End Sub 

Sub ReadySetGo仅用于将值赋给variables,并从模块中的其他子集中调用。 但显然这种方法我得到input框popup每次调用子。 除了Workbook.Open事件之外,还有其他方式将variables的CurrentName值传递给模块中的其他子元素,以避免多个InputBox?

谢谢,Bartek

一般来说,根据您的申请解决方式,有很多好方法可以做您想做的事情。 可能最简单的就是写:

 If CurrentName <> vbNullString Then InputBox("Please adjust the final file name:", , "ABGR_2017-10_FINAL.xls.xlsx") End if 

但要小心,因为它可能会破坏你的代码。 但是,在最好的情况下,你只能运行一次。


另一种方法是保存给定范围内的CurrentName值,并且每次都从这里读取:

 If Len(Range("A1")) = 0 Then Range("A1") = InputBox("Please ...") End if CurrentName = Range("A1") 

一般来说,您可以进一步进行一些操作,并将Singleton模式引入您的代码https://en.wikipedia.org/wiki/Singleton_pattern ,从而确保CurrentName只分配一次。 然而,在这种情况下可能有点矫枉过正 – 如何在vba中创build公共/共享实例

Vityata很好的回答,我会将CurrentName声明为公共variables,但是如果我必须在相同的设置中执行它

  Static CurrentName As String Static HasName As Boolean If Not HasName Then CurrentName = InputBox("Please adjust the final file name:", , "ABGR_2017-10_FINAL.xls.xlsx") HasName = True End If