Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro zuordnen mit Parametern

Forumthread: Makro zuordnen mit Parametern

Makro zuordnen mit Parametern
knickebein
Hallo,
Ich möchte innerhalb einer Prozedur die Inhalte einer Liste/Matrix verarbeiten. Die Größe dieser Liste/Matrix hängt aber davon ab, wieviel der User mittlerweile eingetragen hat. Daher möchte ich die Matrixkoordinaten beim Aufruf als Parameter übergeben.
Beim Zuordnen eines Makros zu einem Button ist dies aber weder dynamisch noch durch Verwendung eines definierten Namens möglich, da parametrisierte Prozeduren gar nicht zur Wahl gestellt werden.
Gibt es irgendeine Möglichkeit? Danke.
Gruß
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 11:16:03
{Boris}
Hi Knickebein,
kryptisch drückt er sich aus.
Ruf doch per Button eine ganz normale Sub auf und übergib dabei die notwendigen Parameter.
Grüße Boris
AW: Makro zuordnen mit Parametern
28.07.2009 11:27:40
knickebein
Hallo,
exakt das würde ich gern. Einzig ich weiß nicht wie, da ich parametrierte Prozeduren Buttons nicht zuweisen kann. Oder übersehe ich hier irgendetwas?
Gruß
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 11:16:45
MichaV
Lass doch das Makro die Anzahl der Einträge ermitteln. Die Erste Zelle kennst Du ja, die letzte Zelle bekommst Du mit der Foren- Suche heraus oder wenn Du in Excel bei xlDown nachschlägst.
Gruß- Micha
AW: Makro zuordnen mit Parametern
28.07.2009 11:20:51
Tino
Hallo,
bin mir nicht sicher ob Du sowas meinst.
Schau auch in der Hilfe unter ParamArray.
Sub Beispiel(ParamArray varWerte())
Dim strString As String

strString = Join(varWerte, vbLf)

MsgBox "Es wurden " & Ubound(varWerte) + 1 & " Werte übergeben" & _
        vbLf & vbLf & strString

End Sub

Sub Test()
 Call Beispiel("Wert1", "Wert2", "Wert3", "usw...")
End Sub
Gruß Tino
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 11:25:52
knickebein
Sorry, war wohl etwas missverständlich.
Die Prozedur ist eine Prozedur, die eine Range als Parameter erwartet:
Sub test(X As Range)
End Sub
Diese Prozedur möchte ich nun mittels Button aufrufen. Dem Button weise ich zu diesem Zweck normalerweise (per Kontextmenü "Makro zuweisen") ein Makro zu. Das besagte MAkro kann ich hier aber nicht auswählen, da mir Makros mit Parametern nicht angezeigt werden. Offenbar kann ich auf diese Weise keine Parameter übergeben, oder?
Die Übergabe im Rahmen eines Aufrufes innerhalb von vba (Call test(...)) ist keine Alternative, da die als Parameter übergebene Range ja dynamisch ist.
Gruß
knickebein
Anzeige
verstehe Dein Problem nicht...
28.07.2009 11:35:55
Tino
Hallo,
"Die Übergabe im Rahmen eines Aufrufes innerhalb von vba (Call test(...)) ist keine Alternative"
Was ist daran so schlimm? Verstehe ich nicht!
Frage offen!
Gruß Tino
AW: verstehe Dein Problem nicht...
28.07.2009 11:50:14
knickebein
Hallo,
wie ich in einer anderen Antwort geschrieben habe, kann ich den fraglichen Bereich in vba nur schlecht ermitteln (nur anhand von davor/dahinter stehenden Schlüsselwörtern, da dieser sich inmitten anderer gefüllter Zellen befindet). Wünschenswert wäre daher die Definition eines Namens, dessen BEreich sich bei Einfügen von Zeilen/Spalten automatisch vergrößert.
Gruß
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 11:36:58
{Boris}
Hi,
Sub Schaltfläche1_BeiKlick()
Dim var1, var2
'Hier kannst Du var1 und var2 noch dynamisch befüllen,
'danach rufst Du Deine Prozedur auf und übergibst dabei die Parameter
Call Deine_Sub(var1, var2)
End Sub
Grüße Boris
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 11:45:13
knickebein
Danke - zugegeben, so könnte man es machen. Nur die dynamische Befüllung innerhalb der Prozedur macht mich nicht ganz glücklich.
Grund hierfür ist, dass der dynamisch (durch Einfügen von Zeilen und Spalten durch den Benutzer) vergrößerte Bereich "mitten drin" zwischen ausgefüllten Zellen steht, d.h. ich kann nicht die Range von A1 bis "Ende des ausgefüllten Bereiches" verwenden, sondern ich müsste anhand von Schlüsselwörtern oder Eigenschaften der ausgefüllten Zellen versuchen zu erkennen, ob es sich noch eine usergefüllte Zelle handelt oder nicht.
Dies wollte ich eigentlich umgehen, in dem ich den usergefüllten Bereich als Namen definiere und diesen als Parameter an die Prozedur übergebe. Der Bereich dieses Namens wird ja beim Einfügen von Zeilen oder Spalten automatisch erweitert.
Noch eine Idee?
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 11:50:07
Tino
Hallo,
wenn Dein Bereich einen Namen hat, kannst Du ihn so übergeben.
Sub Beispiel(rZelle As Range)
MsgBox rZelle.Address(0, 0)
End Sub
Sub Schaltfläche1_KlickenSieAuf()
Call Beispiel(Range("BereichName"))
End Sub
Gruß Tino
AW: Makro zuordnen mit Parametern
28.07.2009 11:53:17
knickebein
Hi Tino,
das ist vermutlich die beste Lösung, danke!
Wünschenswert wäre natürlich trotzdem, dass man den Namen als Parameter übergeben könnte. Dann könnte man den vba-Code komplett von konkreten Adressen, Namen, Inhalten etc. entkoppeln...
Gruß
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 12:03:41
Tino
Hallo,
"Wünschenswert wäre natürlich trotzdem, dass man den Namen als Parameter übergeben könnte"
Übergib den Namen als String.
Sub Beispiel(strName As String)
MsgBox Range(strName).Address(0, 0)
End Sub
Sub Schaltfläche1_KlickenSieAuf()
Call Beispiel("BereichName")
End Sub
Gruß Tino
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 12:12:16
knickebein
Sorry, wieder mein Fehler.
Ich meinte die Übergabe "aus Excel nach vba". Für mich sind das immer quasi zwei Welten. In Excel werden Formeln idR dynamisch an Erweiterungen, Verkeinerungen, Verschiebungen etc. angepasst. Dies gilt natürlich nicht für den vba-Code. Daher würde ich gern alle relevanten Informationen per Parameter von Excel nach vba übergeben.
Und dies schließt auch ein, dass ich den in Excel definierten Namen eigentlich ungern in vba "fest verdrahten", sondern eben beim Makroaufruf als Parameter übergeben würde.
Aber was nicht ist, ist nicht.
Trotzdem vielen Dank!
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 13:18:11
{Boris}
Hi Knickebein,
Und dies schließt auch ein, dass ich den in Excel definierten Namen eigentlich ungern in vba "fest verdrahten", sondern eben beim Makroaufruf als Parameter übergeben würde.
Sorry - aber ich hab das Gefühl, Du stehst Dir grad selbst im Weg.
Das hier
Call Beispiel("BereichName")
ist doch eine Übergabe des Namens als String. Und der Bereich verhält sich ja schon über den Namen selbst dynamisch.
Wenn Du es noch dynamischer haben möchtest, dann schreibe denn Namen in eine Zelle und übergib dann den Zellwert. Dann kannst Du verschiedene Namen über Änderung des Zellinhaltes ansteuern.
Wie gesagt - Du denkst wahrscheinlich viel zu kompliziert.
Grüße Boris
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 14:51:54
knickebein
Hi Boris,
wenn ich einen String verwende und diesen in vba fest verdrahte, läuft vba ins Leere, wenn der Name geändert wird (oder ich die Prozedur in ein anderes Workbook übernehme und der Name dort nicht definiert ist).
Schreibe ich den Namen in eine Zelle, muss ich diese in vba fest verdrahten. Wird sie (von mir oder sonstwem) verschoben, läuft vba ebenfalls ins Leere.
Universell und sauber wäre für mich einzig, wenn ich den Namen als Parameter beim Aufruf durch einen Button direkt übergeben könnte. So wäre die Prozedur unabhängig von ihrem Excel-Umfeld.
Aber ich bin halt auch Perfektionist... Und ich bin begeistert von euren Bemühungen, mich auf "den richtigen Pfad" zu bringen. Danke!
Gruß
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 15:00:15
MichaV
Nö, nicht im Nirvana, Du hast nicht F5 gedrückt.
Selbst wenn Du einen Parameter an die Funktion aus Excel heraus übergeben könntest, müsstest Du den doch irgendwo hinschreiben?! Und damit wäre er "verdrahtet".
Gruß- Micha
AW: Makro zuordnen mit Parametern
28.07.2009 14:54:37
knickebein
[komisch, ich konnte die Antwort nicht mehr unten in den Baum hängen - ist kommentarlos ins Nirvana gegangen...]
Hi Boris,
wenn ich einen String verwende und diesen in vba fest verdrahte, läuft vba ins Leere, wenn der Name geändert wird (oder ich die Prozedur in ein anderes Workbook übernehme und der Name dort nicht definiert ist).
Schreibe ich den Namen in eine Zelle, muss ich diese in vba fest verdrahten. Wird sie (von mir oder sonstwem) verschoben, läuft vba ebenfalls ins Leere.
Universell und sauber wäre für mich einzig, wenn ich den Namen als Parameter beim Aufruf durch einen Button direkt übergeben könnte. So wäre die Prozedur unabhängig von ihrem Excel-Umfeld.
Aber ich bin halt auch Perfektionist... Und ich bin begeistert von euren Bemühungen, mich auf "den richtigen Pfad" zu bringen. Danke!
Gruß
knickebein
Anzeige
AW: Makro zuordnen mit Parametern
28.07.2009 21:49:57
Hübi
Hi,
"...wenn ich einen String verwende und diesen in vba fest verdrahte, läuft vba ins Leere, wenn der Name geändert wird (oder ich die Prozedur in ein anderes Workbook übernehme und der Name dort nicht definiert ist)...."
Das, lieber Perfektionist, kann man mit einer Fehlerbehandlung abfangen.
Wenn du nichts hart verdrahten willst, musst du halt beim Aufruf die Parameter ermitteln und dann übergeben. Ob das im Einzelnen immer möglich ist, ist aus der Ferne nicht zu beurteilen.
mfg Hübi
Anzeige
;
Anzeige

Infobox / Tutorial

Makro zuordnen mit Parametern in Excel


Schritt-für-Schritt-Anleitung

  1. Erstelle eine Sub-Prozedur: Definiere eine Sub-Prozedur, die einen Range-Parameter erwartet.

    Sub test(X As Range)
       ' Deine Logik hier
    End Sub
  2. Button erstellen: Füge einen Button in dein Excel-Arbeitsblatt ein.

  3. Makro zuweisen: Gehe mit der rechten Maustaste auf den Button und wähle "Makro zuweisen".

  4. Sub-Prozedur aufrufen: Verwende eine weitere Sub-Prozedur, um das Makro mit dem gewünschten Range-Parameter aufzurufen.

    Sub Schaltfläche1_Klick()
       Call test(Range("BereichName"))
    End Sub
  5. Dynamische Bereichsbestimmung: Stelle sicher, dass der Bereich dynamisch ist, indem du einen definierten Namen verwendest, der sich anpasst, wenn Benutzer Zeilen oder Spalten hinzufügen.


Häufige Fehler und Lösungen

  • Problem: Das Makro mit Parametern wird nicht angezeigt.

    • Lösung: Du kannst nur Makros ohne Parameter direkt zuweisen. Um Parameter zu übergeben, rufe eine andere Sub-Prozedur auf, die dann die Parameter an deine Zielprozedur weitergibt.
  • Problem: VBA läuft ins Leere, wenn der Name geändert wird.

    • Lösung: Implementiere eine Fehlerbehandlung in deiner Prozedur, um sicherzustellen, dass das Skript nicht abbricht, wenn der Bereich nicht gefunden wird.

Alternative Methoden

  • ParamArray verwenden: Du kannst das ParamArray-Schlüsselwort verwenden, um eine variable Anzahl von Parametern zu übergeben.

    Sub Beispiel(ParamArray varWerte())
       Dim strString As String
       strString = Join(varWerte, vbLf)
       MsgBox "Es wurden " & UBound(varWerte) + 1 & " Werte übergeben" & vbLf & vbLf & strString
    End Sub
  • Direkter Zellbezug: Statt den Namen als Parameter zu übergeben, kannst du auch den Zellbezug direkt in die Prozedur integrieren.


Praktische Beispiele

  1. Einfacher Makroaufruf:

    Sub Beispiel(rZelle As Range)
       MsgBox rZelle.Address(0, 0)
    End Sub
    
    Sub Schaltfläche1_KlickenSieAuf()
       Call Beispiel(Range("BereichName"))
    End Sub
  2. Dynamische Befüllung:

    Sub Schaltfläche1_BeiKlick()
       Dim var1, var2
       var1 = Range("A1").Value
       var2 = Range("A2").Value
       Call test(var1, var2)
    End Sub

Tipps für Profis

  • Fehlerbehandlung: Nutze On Error Resume Next und On Error GoTo 0, um sicherzustellen, dass dein Makro nicht abstürzt, wenn ein Parameter fehlt oder ungültig ist.

  • Dynamische Zellbezüge: Verwende die OFFSET-Funktion in Verbindung mit definierten Namen, um noch flexibler auf Veränderungen im Arbeitsblatt zu reagieren.

  • Verwendung von Formeln: Bevor du ein Makro ausführst, kannst du auch überprüfen, ob eine Formel in einer Zelle vorhanden ist, um die Logik zu steuern.


FAQ: Häufige Fragen

1. Kann ich Parameter an ein Makro über einen Button übergeben? Ja, du kannst einen Button verwenden, um eine Sub-Prozedur ohne Parameter aufzurufen, die dann die Parameter an eine andere Prozedur weitergibt.

2. Was ist der Vorteil der Verwendung von ParamArray? Mit ParamArray kannst du eine flexible Anzahl von Argumenten übergeben, was die Funktion vielseitiger und anpassungsfähiger macht.

3. Wie kann ich sicherstellen, dass mein Makro dynamisch bleibt? Verwende definierte Namen, die sich automatisch anpassen, wenn Zeilen oder Spalten hinzugefügt oder entfernt werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige