2017-11-24 2 views
4

Dies ist der Anfang meines Code:Variable mit InputBox vs mehrere U-Boote in einem Modul

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 wird nur verwendet, um den Variablen Werte zuweisen und aus anderen U-Boote im Modul genannt. Aber offensichtlich bekomme ich bei dieser Methode jedes Mal, wenn das Sub aufgerufen wird, ein Eingabefeld. Gibt es neben dem Workbook.Open-Ereignis eine andere Möglichkeit, den CurrentName-Wert der Variablen an andere Subs im Modul zu übergeben, um mehrere InputBoxen zu vermeiden?

Danke, Bartek

+1

Wenn Sie Wenn 'CurrentName' im gesamten Projekt sichtbar sein soll, müssen Sie möglicherweise' Privat' in 'Öffentlich' ändern. Ich glaube nicht, dass (wie es ist) 'Workbook.Open' in der Lage wäre, diese Variable zu sehen (vorausgesetzt, dass dieser Code in einem Standard-Code-Modul ist). –

Antwort

2

Im Allgemeinen gibt es viele gute Möglichkeiten, zu tun, was Sie wollen, je nach Art und Weise wird die Anwendung angesiedelt. Wahrscheinlich ist die einfachste einfach zu schreiben:

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

Aber Vorsicht, weil es den Code irgendwo brechen. Im besten Fall werden Sie es jedoch nur einmal ausführen.


Eine andere Möglichkeit ist es, den CurrentName Wert in einem bestimmten Bereich zu speichern und von dort jedes Mal zu lesen:

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

Im Allgemeinen Sie ein paar Schritte weiter gehen und einführen das Singleton-Muster zu Ihrem Code https://en.wikipedia.org/wiki/Singleton_pattern und stellen Sie so sicher, dass CurrentName nur einmal zugewiesen wird. Jedoch kann es ein bisschen übertrieben in diesem Fall - How to create common/shared instance in vba

+1

......... nette Antwort ............ –

+0

Vielen Dank, @ Gary'sStudent :) – Vityata

+1

Es in eine Reihe zu setzen hat funktioniert, vielen Dank! – barciewicz

1

Große Antwort von Vityata, würde ich die current als öffentlicher Variable erklärt jedoch, wenn ich es in der gleichen Setup zu tun hatte, dann

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