Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1860to1864
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Übergabe Variablen und Fortsetzung For

Übergabe Variablen und Fortsetzung For
28.12.2021 14:25:39
Micha
Übergabe Variablen und Fortsetzung For
Moin zusammen,
ich bin (noch) VBA-Anfänger und habe bisher eigentlich nur mit "normalen" Formeln in Excel gearbeitet. Seit einiger Zeit lese ich hier schon begeistert das Forum und die Tuts, so dass ich langsam VBA lerne und ich muss sagen, dass ich es wirklich klasse, wie hier geholfen wird.
Ich habe ein aus Pro-Sicht vermutlich völlig lächerliches kleines Problem, bei dem ich aber irgendwie ein Brett vor dem Kopf habe und einfach nicht durchblicke. Ich weiß, dass meine nachfolgende Beschreibung auch einfach mit einer "normalen" Formel in Excel zu lösen ist. Ich möchte jedoch um VBA weiter/besser zu lernen und zu verstehen, das ganze über VBA umsetzen und hoffe, dass ihr mir hierbei auf die Sprünge helfen könnt.
In einer Exceltabelle habe ich in den Zeilen der Spalte A immer entweder den Buchstaben A oder T stehen. Abhängig von dem Buchstaben soll durch eine Subprozedur Spalte B befüllt werden, in meinem Lern-Fall mit der Zeilen-Nr und der Angabe aus der Zelle in Spalte A (z.B. "14 A"). Angefangen werden soll in Zeile 10. Um nun die Übergabe von Variablen zwischen Prozeduren besser zu verstehen, möchte ich abhängig von der Angabe in Spalte A entweder die eine oder andere Prozedur ausführen, so dass z.B. mit einer For each Schleife alle befüllten Zeilen nacheinander automatisch abgearbeitet werden. Dafür habe ich 3 kleine Prozeduren geschrieben:
1. "Haupt- bzw. Start-Prozedur": Soll mit einer For-Schleife für jede Zeile zwischen A und T differenzieren und die jeweilige Unterprozedur in einem anderen Modul aufrufen.
2. "AblaufA": Soll die Zeilen mit "A" bearbeiten
3. "AblaufT": Soll die Zeilen mit "T" bearbeiten
Wenn ich von den Unterprozeduren immer nur eine Zeile bearbeiten lasse und dann über die Start-Prozedur für die nächste Zeile differenziert wird, läuft das alles auch gut durch (so wie bei "AblaufA" als Code geschrieben). Damit könnte ich eigentlich aufhören.
Etwas weiter an den Modulen geschraubt wäre es doch bestimmt auch möglich, dass eine Unterprozedur nicht nur eine Zeile bearbeitet und dann zur Start-Prozedur zurückgekehrt wird, sondern die Unterprozedur so lange durchläuft, bis der "andere Fall" eintritt (wie z.B. in „AblaufT“). Und das läuft das Ganze dann nicht mehr sauber durch. So wie ich mich das bisher zumindest erklärt habe, schaffe ich es zwar, die jeweils zu bearbeitende Tabellenzeile von der Start-Prozedur an die Unterprozedur zu übergeben. Wenn in AblaufT jedoch nicht nur eine Zeile bearbeitet wird, sondern mehrere Zeilen und dann zu Start zurückgeschaltet wird, scheint die Start-Prozedur mit der Tabellenzeile weiter zu laufen, die zuvor auch an AblaufT übergeben wurde – nicht jedoch mit der Tabellenzeile, in der AblaufT zuvor „fertig geworden“ ist, z.B.:
Für Tabellenzeile 11 wird aufgrund der Angabe "T" in Spalte A von der Start-Prozedur entschieden, AblaufT zu starten. Angabe "Zeile 11" wird an AblaufT übergeben. AblaufT bearbeitet Zeile 11 und die nachfolgenden Zeilen, bis in Spalte A die Angabe "A" erfolgt, z.B. bis Zeile 14, so dass dann zur Start-Prozedur zurückgekehrt wird. Die Start-Prozedur läuft dann aber scheinbar wieder ab der ursprünglich übergebenen Zeile 11 weiter und nicht ab Zeile 15...
Modul mit Prozedur: Start-Prozedur:

Sub AblaufBeginn()
Dim sheet As Worksheet, rngStart As Range, rngEnd As Range, cell As Range
Dim strItem As String 'Variable zur Differenierung zwischen T und A
Dim ZZurück As Integer 'Zeilennummer, die von den Subprozeduren zurückgegeben werden soll
Set sheet = ActiveSheet
Set rngStart = sheet.Range("A10")
Set rngEnd = rngStart.End(xlDown)
counter = 0
For Each cell In sheet.Range(rngStart, rngEnd)
'Auswahl zwischen T und A
strItem = sheet.Cells(cell.Row, "A").Text
Select Case strItem
Case "A"
Call AblaufA(cell.Row)
Case "T"
Call AblaufT(cell.Row, ZZurück)
Set rngStart = sheet.Range("A" & ZZurück)
Case Else
MsgBox "AuflaufStart *** Bis inkl. Zeile " & cell.Row - 1 & " wurde(n) " & counter & " Einträge erstellt." & vbCrLf & vbCrLf & _
"Zeile " & cell.Row & " enthält keine gültige Angabe zum Item T oder A." & vbCrLf & vbCrLf & _
"Die weitere Verarbeitung wird abgebrochen!", vbExclamation
Application.StatusBar = ""
Exit Sub
End Select
counter = counter + 1
Next
MsgBox "Ablauf Ende - Es wurden " & counter & " Einträge durchlaufen"
End Sub
Modul mit Prozedur: AblaufA

Sub AblaufA(ByVal NrZeile)
On Error Resume Next
Dim sheet As Worksheet, rngStart As Range, rngEnd As Range, cell As Range
Set sheet = ActiveSheet
Set rngNrZeile = sheet.Cells(NrZeile, "B")
rngNrZeile.Value = NrZeile & " A"
End Sub
Modul mit Prozedur: AblaufT

Sub AblaufT(ByVal NrZeile, ByRef NrZeileZurück As Integer)
Dim sheet As Worksheet, rngStart As Range, rngEnd As Range, cell As Range
Set sheet = ActiveSheet
Set rngStart = sheet.Cells(NrZeile, "A")
Set rngEnd = rngStart.End(xlDown)
For Each cell In sheet.Range(rngStart, rngEnd)
strItem = sheet.Cells(cell.Row, "A").Text
If strItem = "" Then
NrZeileZurück = cell.Row
MsgBox "Ende Sub"
Exit For
End If
If strItem = "A" Then
NrZeileZurück = cell.Row
Exit For
End If
MsgBox "Info: " & cell.Row & " T wird in Zeile geschrieben"
Set rngNrZeile = sheet.Cells(cell.Row, "B")
rngNrZeile.Value = cell.Row & " T"
Next
MsgBox "Zurück"
End Sub
Zur Lösung habe ich überlegt, dass beim Zurückschalten von AblaufT zur Start-Prozedur eine Variable übergeben wird, die die Zeilen-Nr enthält, in der AblaufT „fertig geworden“ ist und ich mit der Variablen, die Startzeile für die For-Schleife in der Startprozedur neu setze – das hilft leider auch nicht. Aus Pro-Sicht ist das vermutlich eine Bagatelle, ich stehe aber bei Verstehen der Nutzung von verschiedenen Prozeduren und der Übergabe und Rückgabe von Variablen und Werten irgendwie total auf dem Schlauch …
Deshalb bitte ich bereits vorab um Nachsicht und bedanke mich schon jetzt für Eure Unterstützung ganz herzlich!!
Micha
P.S.: Error-Handling habe ich noch nicht eingebaut, da ich mich damit auch noch nicht wirklich auskenne und viele Dinge dabei auch noch nicht verstanden habe.

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Übergabe Variablen und Fortsetzung For
28.12.2021 15:27:34
ChrisL
Hi Micha
Theoretisch, wenn eine Unterprozedur einen Wert zurückgeben soll, dann würde man daraus eine Funktion machen.

Sub tt()
MsgBox MeineFkt("Micha")
End Sub
Function MeineFkt(strName As String) As String
MeineFkt = "Hallo " & strName
End Function
In deinem konkreten Fall, würde ich aber eher mit einer Public Variable arbeiten. Das Auslagern in Unterprozeduren kann man zwar machen, muss man aber nicht. Aber wenn, dann würde ich zeilenweise zwischen Haupt- und Unterprozedur hin und her springen. Einen Nutzen um innerhalb einer Unterprozedur gleich mehrere Zeilen abzuarbeiten sehe ich hier nicht und es macht die Sache unnötig kompliziert.
Dennoch habe ich mich auf das "Spiel" eingelassen und nachfolgend ein vereinfachtes Beispiel erstellt :)

Public lZ As Long

Sub AblaufBeginn()
lZ = 10
With ActiveSheet
Do While .Cells(lZ, 1)  ""
Select Case .Cells(lZ, 1)
Case "A": Call AblaufA(lZ)
Case "T": Call AblaufT(lZ)
Case Else
MsgBox "Abbruch"
Exit Sub
End Select
Loop
End With
End Sub

Private Sub AblaufA(lZ As Long)
With ActiveSheet
Do
.Cells(lZ, 2) = "'" & lZ & " A"
lZ = lZ + 1
Loop Until .Cells(lZ + 1, 1)  "A"
End With
End Sub

Private Sub AblaufT(lZ As Long)
With ActiveSheet
Do
.Cells(lZ, 2) = "'" & lZ & " T"
lZ = lZ + 1
Loop Until .Cells(lZ + 1, 1)  "T"
End With
End Sub
PS: Schalte "Option Explicit" ein.
cu
Chris
Anzeige
AW: Übergabe Variablen und Fortsetzung For
28.12.2021 15:38:40
Micha
Hallo Chris,
vielen Dank für Deine schnelle und aufschlussreiche Hilfe und die Beispiele!! Ich hatte irgendwo gelesen, dass man nach Möglichkeit immer mit Subs arbeiten soll und Funktionen vermeiden sollte. Ich werde das auf jeden Fall auch noch weiter über beide Wege probieren, d.h. mit Funktion und Public Variable. Wie heißt es so schön: Learning by doing :-)
VG
Micha
AW: Übergabe Variablen und Fortsetzung For
28.12.2021 16:08:07
ChrisL
Hi Micha
Danke für die Rückmeldung.
...nach Möglichkeit immer mit Subs arbeiten soll und Funktionen vermeiden sollte.
So generell würde ich die Aussage nicht machen. Wenn es einen Rückgabewert braucht, dann muss es halt auch mal eine Funktion sein.
Wenn, dann würde ich eher versuchen Public Variablen auf ein Minimum reduzieren. Allerdings auch hier gilt, wenn es hilft bzw. notwendig ist, dann darf/soll auch mal eine öffentliche Variable eingesetzt werden.
Unterprozeduren und Funktionen machen m.E. dann Sinn, wenn...
a) eine Wiederholung derselben Codezeilen verhindert werden kann
b) massvoll eingesetzt, zur Herstellung von Strukturen/Übersichtlichkeit
c) Spezialfälle (z.B. im Umgang mit ErrorHandling o.ä.)
Punkt a) scheint mir bei dir nicht gegeben. Man könnte m.E. gut mit einer einzigen Hauptprozedur arbeiten und mit Select-Case reagieren.
Punkt b) sehe ich hier auch nicht unbedingt. Unter Berücksichtigung der zusätzlich eingebrachten Komplexität (Unterprozedur soll gleich mehrere Zeilen abarbeiten), scheint es mir betr. Übersichtlichkeit sogar eher kontraproduktiv.
Ich finde toll, dass du dich mit diesen Themen beschäftigst, auch wenn es im vorliegenden Fall evtl. etwas übers Ziel hinausgeht.
cu
Chris
Anzeige
AW: Übergabe Variablen und Fortsetzung For
28.12.2021 16:38:28
Micha
Hallo Chris,
vielen Dank für die weiteren Erklärungen!!
Der Code war ja auch nur, um das grundsätzliche Zusammenspiel zwischen verschiedenen Prozeduren etwas besser zu verstehen und daher auch möglichst unspektakulär gehalten :-)
Zu meinem Beispiel noch eine weitere Frage, um das Ganze noch weiter zu verstehen: Wenn ich eine Funktion und nicht die Public Variable nutze: Wäre es dann möglich, die zuletzt bearbeitete Zeile an die Start-Prozedur zurückzugeben und die For-Schleife in der Start-Prozedur an der zurückgegebenen Zeile weiterlaufen zu lassen?
Ich bin noch am Durchdringen, was genau es mit ByVal und ByRef auf sich hat und wo was in den Klammern zu stehen muss ... Ich finde es jedenfalls wirklich toll, dass in diesem Forum hier auch solchen blutigen Einsteigern wie mir geholfen wird und man nicht einfach abgewatscht wird von den Pros wie in manch anderen Foren.
VG
Micha
Anzeige
AW: Übergabe Variablen und Fortsetzung For
28.12.2021 17:00:02
ChrisL
Hi Micha
Rein theoretisch kannst du schon eine Funktion nutzen und auf die Public Variable verzichten.

Sub AblaufBeginn()
Dim lZ As Long
lZ = 10
With ActiveSheet
Do While .Cells(lZ, 1)  ""
Select Case .Cells(lZ, 1)
Case "A": lZ = AblaufA(lZ)
Case "T": lZ = AblaufT(lZ)
Case Else
MsgBox "Abbruch"
Exit Sub
End Select
Loop
End With
End Sub
Private Function AblaufA(lZ As Long) As Long
With ActiveSheet
Do
.Cells(lZ, 2) = "'" & lZ & " A"
lZ = lZ + 1
AblaufA = lZ
Loop Until .Cells(lZ + 1, 1)  "A"
End With
End Function
Private Function AblaufT(lZ As Long) As Long
With ActiveSheet
Do
.Cells(lZ, 2) = "'" & lZ & " T"
lZ = lZ + 1
AblaufT = lZ
Loop Until .Cells(lZ + 1, 1)  "T"
End With
End Function
Die Angabe von ByVal und ByRef wäre tatsächlich Best Practice. Aber ehrlich gesagt bin ich zu faul dazu und in meiner ganzen Zeit musste ich die Technik noch nie anwenden.
Wobei, wenn ich es mir richtig überlege, wäre eigentlich genau hier ein Anwendungsfall. ByRef, dann musst du den Wert nicht über die Funktion zurückgeben.

Sub t()
Dim lZ As Long
lZ = 10
Call AA(lZ)
MsgBox lZ
Call AT(lZ)
MsgBox lZ
End Sub
Sub AA(ByRef lZ As Long)
lZ = 20
End Sub
Sub AT(ByVal lZ As Long)
lZ = 30
End Sub
cu
Chris
Anzeige
AW: Übergabe Variablen und Fortsetzung For
28.12.2021 17:23:16
Micha
Moin Chris,
klasse - vielen Dank für die Beispiele!! Ich merke, ich bin absolut kein geborener Programmierer ... :-) Aber das heißt ja nicht, dass es nicht in mein Hirn will - nur halt (hoffentlich nur etwas) langsamer ... :-)
Irgendwie muss ich mir das mal noch weiter zuführen, damit ich das richtig blicke. Deine weitere Erklärung hat bereits sehr geholfen beim Nachvollziehen, die Anwendung/Umsetzung ist dann mal noch eine etwas andere Sache - wie immer :-)
Nochmals ganz herzlichen Dank!!
VG
Micha

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige