2016-01-25 4 views
5

Ich habe ein Makro, das durch Spalte (n) geht und Nummern aus allen Zellen in dem Bereich entfernt. Ich möchte einen optionalen Parameter hinzufügen, damit ich das Sub aufrufen kann, während ich ihm sage, auf welchen Spalten es laufen soll. Hier ist, was ich habe:Benutzer Sub mit optionalen Parametern - nicht im Makrofenster

Sub GEN_USE_Remove_Numbers_from_Columns(Optional myColumns as String)

Die Idee ist, ich es von einem anderen Unter nennen kann, wie diese GEN_USE_...Columns("A B C")

Aber ich nicht, dass aus dem VB-Editor ausgeführt werden kann, noch kann ich sehen, dass Makro im Makrofenster (wenn Sie auf Ansicht -> Makros klicken). Warum nicht? Warum habe ich haben, um es mit einem Parameter (auch GEN_USE_...Columns("")) Ich kann nicht nur anrufen GEN_USE_...Columns() mehr.

Ich habe seen that Sie können = Nothing an das Ende hinzufügen, um einen Standardwert festzulegen, wenn keiner angegeben ist. Ich habe das versucht(), aber es hat nichts getan.

Ich denke, meine Frage ist A) Wieso kann ich meine Makros nicht sehen, die optionale Parameter im Makrofenster haben? und B) Warum kann ich das Makro nicht mit Parametern direkt aus dem VB Editor aufrufen? Ich muss eigentlich ein Sub erstellen, dann kann ich das Makro innerhalb dieses Subs aufrufen. Nicht mehr nur einen Text markieren und "Play" drücken.

Ich weiß, dass die zwei Ausgaben wahrscheinlich zusammenhängen, also würde jeder Einblick geschätzt werden!

(PS: Ich weiß, wir sollten Code posten, aber ich denke nicht, dass das sehr relevant ist. Natürlich, wenn Sie es sehen möchten, lassen Sie mich wissen, und ich werde aktualisieren).

+3

Verwenden Sie 'Optional myColumns als Variant', um es im Dialogfeld Run Macro ([alt] + [F8]) anzuzeigen. Alternativ, lassen Sie es versteckt; Sie können den Namen eingeben und auf Ausführen klicken. Der Varianttyp ist auch der einzige Typ, der richtig auf "IsMissing" reagiert. – Jeeped

+3

Sie können das Sub mit Parametern aus dem Direktfenster von VBE aufrufen ([Strg] + G). – Jeeped

Antwort

7

Verwenden Sie Optional myColumns as Variant, um es im Dialogfeld Run Macro ([alt] + [F8]) anzuzeigen. Alternativ, lassen Sie es versteckt; Sie können den Namen eingeben und auf Ausführen klicken. Der Variant-Typ ist auch der einzige, der richtig auf die IsMissing function reagiert.

Sub GEN_USE_Remove_Numbers_from_Columns(Optional myColumns As Variant) 
    If IsMissing(myColumns) Then 
     myColumns = Intersect(Selection.Parent.UsedRange, Selection).Address '.address 'cause you were using a string 
    End If 
    Debug.Print Range(myColumns).Address(external:=True) 
End Sub 

optional_ismissing

Sie können die Unter mit Parametern aus dem Direkt-Fenster des VBE aufrufen ([ctrl] + G).

+0

Aha! Das ist ein ziemlich ordentlicher "Trick". Ich mag das, weil ich "F8" eine Tonne zu Fuß durchführe und dies erlaubt mir, das Makro wie ein "normales" zu verwenden, ohne wirklich viel mehr Komplikationen. Tangent, aber ich habe festgestellt, dass, wenn ich die Subroutine ohne 'myColumns'-Daten ausführen lasse,'If IsEmpty (myColumns)' 'FALSE' zurückgibt, obwohl' myColumns' 'Nothing' hat. (Dann habe ich bemerkt, dass es tatsächlich "IsMissing" ist, also habe ich es gewechselt. Nur eine kontraintuative Eigenart, die ich mit "IsEmpty" denke). – BruceWayne

+1

Ja, gegen die Existenz eines optionalen Parameter testen 'Ist Nothing' oder mit der [IsEmpty Funktion] (https://msdn.microsoft.com/en-us/library/office/gg264227.aspx) nicht korrekte Ergebnisse produziert . Ein varianter Typparameter mit der [IsMissing-Funktion] (https://msdn.microsoft.com/en-us/library/aa445048%28v=vs.60%29.aspx) ist der beste Test. Alternativ können Werte (Konstanten) nicht als Standardwerte festgelegt und getestet werden, wenn der Parameter diesen Konstanten entspricht. – Jeeped

3

Ein Teil mit jedem Parameter, optional oder nicht, nicht direkt ausgeführt werden kann und kann nur von einem anderen Sub oder Function

beste Option, um einen Wrapper Sub zu schreiben, ist aufgerufen werden, die in dem Fenster Makros

erscheinen
Sub USER_Remove_Numbers_from_Columns() 
    GEN_USE_Remove_Numbers_from_Columns 
End Sub 
+0

Danke für diesen! Das werde ich für Makros in Zukunft berücksichtigen. Für diese spezifische, Jeepeds Antwort funktioniert ein wenig besser, aber vielen Dank für Ihre Antwort und Kommentar !! – BruceWayne