Hi,
man könnte die Lösung der Aufgabenstellung komplett in einem einzigen Code herstellen.
Durch die Aufteilung der Gesamtaufgabe in einzelne Arbeitsschritte ( Auslagerung sich wiederholender Programmzeilen ) wird (soll) der Code kürzer und übersichtlicher (werden). ==> Vermeidung von sog. Redundanzen
Darüber hinaus braucht man dann bei notwendigen Änderungen lediglich an 1 Stelle den Code ändern.
Aufrufe von "Unterroutinen" können ohne oder mit Übergabe von Argumenten erfolgen. Sollen "Unterroutinen" etwas an die aufrufende Prozedur zurückliefern, verwendet man im Regelfall FUNCTION(). Braucht nichts zurückgeliefert werden, kann man auch eine weitere SUB() aufrufen.
Bei beiden können Argumente erforderlich sein. Das ergibt sich aus der "Kopfzeile", z.B. Sub errMsg(rg as Range)
Das ist dann auch gleichzeitig deren Deklaration, es entfällt also ---dim rg as Range--- innerhalb der Function oder Sub
Hier ist also eine Übergabe einer Range ( das kann eine Zelle oder ein Zellbereich sein ) erforderlich. Fehlt diese bei Aufruf gibt es einen Fehler.
Mann kann mehrere Argumente übergeben. Es gibt auch die Möglichkeit, Argumente optional zu übergeben.
Die Parameterübergabe ist als Default eine Übergabe byRef. Insofern kann man das weglassen. Die andere Übergabeform wird durch das prefix byVal erreicht --- Sub errMsg( byval rg as range) --
Was bedeutet das jeweils???
Bei der Übergabe eines Parameters byRef wird quasi ein Zeiger auf den Parameter übergeben, d.h. dass wenn in der auf
gerufenen Function oder Sub der Parameter verändert wird, dieser dann ebenfalls in der auf
rufenden Prozedur verändert ist, da die Veränderung am Originalwert stattfindet.
Die Übergabe byVal ist eine KOPIE des Parameters, d.h. ich kann diese in der auf
gerufenen Function oder Sub zwar verändern, in der auf
rufenden Prozedur ist und bleibt er aber unverändert.
Lies mal hier:
https://www.vba-tutorial.de/prozeduren/
mtch.value ist der Wert der Zelle W1 aus dem jeweiligen Worksheet Gruppe*.
Die Sub matchSheet erwartet 2 parameter ( rg und mtch ), die Range-Objekte sind. Dass rg als byVal und mtch als byRef übergeben werden liegt an meiner Oberflächlichkeit. Ist mir nicht aufgefallen und spielt auch keine Rolle, da lediglich die Werte in beiden Zellen miteinander verglichen werden sollen. Sry for that
Um Code nachzuvollziehen und zu verstehen mache ich, falls notwendig weil nicht sofort ersichtlich ist, was wie passiert, folgendes:
ich setze in der Codezeile, wo mein Unverständnis beginnt, mit F9 oder Mausklick einen Breakpoint und starte den Code. Der hält dann am Breakpoint und ich kann dann jeweils mit F8 den Code zeilenweise abarbeiten.
Der Mauszeiger über den jeweiligen Variablen zeigt mir deren Wert. Ersatzweise kann auch das Überwachungs- oder Lokalfenster Aufschluss geben. Und wenn mann sich dann so durch den Code durcharbeitet, versteht man ( ich ) leichter, was wie passiert.
Hoffe, es ist ein wenig mehr Licht!
VG Juvee