Wie kann ich den Wert dieser variable für meine nächste Unterprogramm?
Bin ich ein Programmier-Anfänger (keine Erfahrung) erlernen von Visual Basic für einen job, den ich gerade mache. Ich habe gelesen, für einen Tag oder so und haben schließlich beschlossen, um das gewünschte Programm!
Allerdings bin ich im laufen in einige Probleme.
Nun habe ich zwei Unterprogramme. Die erste Unterroutine ermöglicht es dem Benutzer-Eingabe, wie viele Daten-Paare, die Sie haben, so dass ich eine Tabelle für Sie ausfüllen. Dies ist, so dass Ihre Daten an der richtigen Stelle für mich, um für spätere Referenzzwecke.
Dort ist dann eine Schaltfläche, die Sie drücken, nachdem Sie die Eingabe beenden, starten Sie eine andere Unterroutine, die einige Berechnungen, die zahlen, die Sie eingegeben. Mein Problem ist, ich brauche die variable, die besagt, wie viele Daten-Paare, die Sie tragen müssen, über die zweite routine.
Bevor ich weiter, hier ist mein code so weit!!! (Sie müssen nach unten scrollen in dem Fenster) ich sollte auch beachten, dass das zweite Unterprogramm wird in einem separaten Modul.
Option Explicit
Public Counter As Long
Sub TableCreation1()
ActiveSheet.Shapes.Range(Array("Button 5")).Select
Selection.Delete
Counter = InputBox("How many pairs of data do you have? ")
Range("A1") = "Time (days)"
Range("B1") = "CFL (measured)"
Range("A1:B1").Font.Bold = True
Columns("A:B").EntireColumn.EntireColumn.AutoFit
Range("A1").Select
ActiveCell.Range("A1:B" & Counter + 1).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
End With
Dim btn As Button
Dim rng As Range
With Worksheets("Sheet1")
Set rng = .Range("A" & Counter + 2)
Set btn = .Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
With btn
.Caption = "Click this button to begin calculations"
.AutoSize = True
End With
End With
End Sub
Option Explicit
Dim IntermediateVariable As Long
Public Counter As Long
Sub FindCFLGuess()
IntermediateVariable = Worksheets("Sheet1").Range("B:B").Cells.SpecialCells(xlCellTypeConstants).Count
Counter = IntermediateVariable - 1
End Sub
Warum ist nicht der Wert für Zähler der Versetzung in das zweite Unterprogramm? Jetzt habe ich eine Abhilfe, zählt die Anzahl von Zellen ausgefüllt, die in der Spalte B, die gibt mir die Nummer. Jedoch, dass macht es so, dass ich nicht in der Lage sein, die Verwendung der Raum, in Spalte B für den rest der Platte, die ich verwenden möchten.
Kann jemand helfen? Ich dachte an die "Öffentlichkeit" wäre es ein Workbook-level-variable? Wenn ich den zweiten sub-display wird der Wert des Zählers, es kommt als null.
Sorry, wenn mein code ist chaotisch/ineffizient. Ich bin immer noch lernen. 🙂
Counter
zweimal für den Anfang. Versuchen Sie, loszuwerden, die zweite definition. Public Counter As Long
Ah danke, das hat geholfen.
Wenn ich versuche, führen Sie den code, wie oben geschrieben, bekomme ich einen compile-Fehler wegen der
Option Explicit
und die öffentlichen Variablen deklariert, die in der Mitte. Wie sind Sie in der Lage zu laufen auch diese wissen, dass Ihr nicht arbeiten?InformationsquelleAutor TheTreeMan | 2012-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem code deklarieren
Public Counter As Long
zweimal. Was wohl geht, ist, dass jede IhrerSub
Blöcke sind ein anderesCounter
variable. Wenn Sie entfernen das zweite ist, sollen Sie beide teilen die gleiche variable.Außerdem sollten Sie nur brauchen, um die Liste
Option Explicit
einmal pro Modul. Die nun, da ich sehe, dass Sie angeben, diese sind separate Module, Sie sind wohlauf.EDIT: Versucht, die Aufklärung mehr.
Denken, es als eine Schichtung und jedes "scope" ist, was die layer zugreifen können. Jede Ebene hat Zugriff auf sich selbst und alle Eltern. Hier ist eine vereinfachte Visualisierung:
In dem Unterprogramm verweisen Sie auf die variable, also das Programm startet nach oben schauen. Vorausgesetzt natürlich Sie haben
Option Explicit
was bedeutet, dass die Variablen müssen manuell festgelegt werden, und Sie werden nie automatisch definiert.Was Sie haben wollen, ist etwas wie das folgende. Wo die variable ist global, so dass Sie zugegriffen werden kann von anderen Modulen gleichzeitig ausgeführt.
Eine variable deklariert, die außerhalb der Reichweite der beiden Routinen sollten Sie die Lebensdauer und die Sichtbarkeit zum letzten durch und zugänglich in beiden. Ich habe wirklich nicht tun, einen guten job zu erklären, dies ist eine gute Ergänzende Informationen! msdn.microsoft.com/en-us/library/1t0wsc67.aspx
Ich benutze Option Explicit einmal, auch wenn beide Teile in separaten Modulen? Auch wenn ich entfernt die zweite Public Zähler As Long, mein code immer noch war es zu zeigen, wie null. Ich landete mit dem setzen der Wert in Z1. Aber das fühlt sich an wie eine billige Art und Weise aus ihm heraus.
Diese sind in eigenen Modulen? Das ist ein anderes problem in der Tat. Sie sollten nicht gruppiert Sie in die post, ich denke, ich beschönigt das Teil über Sie als separate Module beim Lesen.
Aber ich habe gerade getestet, dass dieses Konzept in separate Module. Müssen Sie Option Explicit in den beiden Modulen, aber nicht die Deklaration von Variablen. Ohne "Option Explicit" in das 2. Modul die variable stellt sich auf null.
InformationsquelleAutor TheZ
Habe ich entfernt, ein paar Ihrer überflüssigen code, müssen Sie möglicherweise in der Produktion, sondern ist immer nur in der Art des Sehens das problem. Getestet habe ich die folgenden, und der Zähler behält seinen Wert festgelegt ist, die erste sub in das erste Modul der sub in dem zweiten Modul.
Modul 1:
Modul 2:
Wenn Sie erstellen eine neue Arbeitsmappe mit 2 Modulen und fügen Sie den code in jede, die Ihren Counter variable Wert wird angezeigt in der
messagebox
wenn SieTableCreation1
und dannFindCFLGuess
in Folge.Wenn Sie eine Laufzeit-Fehler aus irgendeinem Grund, oder brechen die Ausführung des Codes, offensichtlich Zähler seinen Wert verlieren. Wenn keines dieser Dinge passiert, sollten Sie hinzufügen eine Uhr
zu verfolgen, den Wert der Variablen, während Sie Schritt für Schritt durch den code.
Hinzufügen der Uhr mit der rechten Maustaste auf die variable und wählen Sie Add Watch... und wählen Sie dann (Alle Module) aus der Modul-Dropdown-Liste aus. Sie können auch die Uhr zu brechen, wenn der Wert des Ausdrucks ändert.
Guter deal-froh, dass es geholfen hat. Haben Sie Ihren code, um zu arbeiten, wie Sie wollten?
InformationsquelleAutor Jon Crowell