VBA EXCEL / Schleife zählt falsch

Hallo liebe Forumsmitglieder,

ich habe ein kleines Problem mit einer For-Schleife in meinem Excel-Makro.
;
Ausgangspunkt ist ein Tabellenblatt „Kalender“, bei dem in jeder zweiten Spalte der Monatsname steht (B1=Januar,D2=Februar etc) und in jeder ersten Spalte das jeweilige Datum dazu, beginnend ab der 2. Zeile (A2=1.1., A3=2.1. ; C2=1.2., C3=2.2. etc).

Neben den jeweiligen Datumsangaben steht dann immer ein Name, also zb 2.1. Hans.

Nun soll, wenn in einem Tabellenblatt „Ausgabe“ in der Zelle C7 beispielsweise „Januar“ eingegeben wird, in diesem Tabellenblatt ab Zelle A10 das jeweilige Datum und der Eintrag nach dem Datum (der Name; dann in der Monatsspalte) ausgegeben werden - also quasi dann so:

Spalte A Spalte B

Name Datum

Foldenden Code hab ich schon:

Worksheets("Ausgabe").Range("c7").Select

For c = 2 To 24 Step 2

If Selection.Value = Worksheets("Kalender").Cells(1, c) Then
 a = 10
For dat = 1 To 23 Step 2
 For b = 2 To 33

 If Worksheets("Kalender").Cells(b, c).Value "" Then
 Worksheets("Ausgabe").Cells(a, 1).Value = Worksheets("Kalender").Cells(b, c).Value
 Worksheets("Ausgabe").Cells(a, 2).Value = Worksheets("Kalender").Cells(b, dat).Value
 a = a + 1
 End If

 Next b


Next dat
End If
Next c

Leider schreibt er mir nich nur die Daten vom Januar hin, wenn in C7 Januar steht, sondern auch noch Februar, März, April, etc. Allerdings bleiben die Tage immer gleich, lediglich der Monat zählt hoch…(also zb 1.1., 12.1., 23.1., danach dann 1.2, 12.2., 23.2. etc) und die Namen wiederholen sich entsprechend.

Is das ein Formatierungsproblem im „Kalender“ (hab benutzerdefiniertes Format) oder liegts an der Schleife?

Vielen Dank schonmal für die Hilfe.

Gruß,
Junika

Hallo Junika,

lade mal bitte eine Beispielmappe hoch mit FAQ:2606

Gruß
Reinhard

Guten Tag,

Hallo Reinhard,

hier der Link:
http://www.hostarea.de/server-05/Mai-5c328b53d9.xls

Danke schonmal, dass du dich meinem Problem annimmst :wink:
Gruß,
Junika

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

http://www.hostarea.de/server-05/Mai-5c328b53d9.xls

Hallo Junika,

mir sind da auf den ersten Blick zuviele Variablen im Code.
Wie auch immer, genau durchgeblickt was zu tun ist habe ich noch nicht.
Hier mal erstmal der Code in besserer form:

Private Sub CommandButton1\_Click() 'Ausführen
Dim a As Integer, b As Integer, c As Integer, dat As Integer
Dim zielort As Integer, entf As Integer, wsK As Worksheet
Set wsK = Worksheets("Kalender")
With Worksheets("Ausgabe")
 For c = 2 To 24 Step 2
 If .Range("C7").Value = wsK.Cells(1, c).Value Then
 a = 10
 For dat = 1 To 23 Step 2
 For b = 2 To 33
 If wsK.Cells(b, c).Value "" Then
 .Cells(a, 1).Value = wsK.Cells(b, c).Value
 .Cells(a, 2).Value = wsK.Cells(b, dat).Value
 a = a + 1
 End If
 Next b
 Next dat
 End If
 Next c
End With
End Sub

Gruß
Reinhard

Hallo Reinhard,

vielen Dank erstmal für die Anpassung des Codes, das sieht doch um einiges übersichtlicher aus :smile: Ich bin da noch nich ganz so fit, versuch mir grad selber VBA by doing beizubringen :wink:

Nun zur Verdeutlichung meines Problems:
Wenn man die Mappe öffnet, ist lediglich im Tabellenblatt Kalender was eingetragen, Ausgabe ist leer.
Nun trägt man in C7 den Monat ein, für den man die Auswertung möchte, drückt auf den Button „Ausführen“ und so das Makro will, stehen dann die Daten für den entsprechenden Monat aus dem Blatt Kalender in der Ausgabe-Tabelle. Und eben nur für den Monat, und nich wie bei mir aktuell für jeden Monat untereinander…
Drückt man dann auf den Button Löschen, ist in der Ausgabe wieder alles leer und man kann einen neuen Monat abfragen.
Soweit die Theorie, nur die praktische Umsetzung fehlt noch :wink:

Gruß,
Junika

Hallo Junika.

Ich hatte vorhin eigentlich einen funktionierenden Code als Antwort geschickt - leider ist die Antwort verschwunden. Bin wohl noch zu müde gewesen und hab die falsche Tate gedrückt. Wenn ich nachher Zeit finde, dann kann ich den Code nochmal schreiben. Interesse? Der Code basiert aber nicht wirklich auf deinem Schnipsel, sondern eher auf meiner Programmierweise.

Grüße, Aiko.

Hallo Aiko,

danke für deinen Aufwand erstmal :wink: Dein Code interessiert mich natürlich. Poste ihn doch einfach mal, aber bitte mit ner kleinen Beschreibung, was der jeweilige Schritt so macht, damit ich auch noch was lernen kann :smile:

Danke und Gruß,
Junika

Hallo Junika.

Okay, dann viel Spaß, Erklärung am Ende.


Sub kalender_auslesen()

Application.ScreenUpdating = False

Sheets(„Ausgabe“).Select
i = 10
Do Until Range(„A“ & i) = „“
i = i + 1
Loop
i = i - 1
Range(„A10:B“ & i).ClearContents
Range(„A10“).Select
monat = Range(„C7“)

Sheets(„Kalender“).Select
Range(„B1“).Select
Do Until ActiveCell = „“
If ActiveCell = monat Then GoTo endesuche
ActiveCell.Offset(0, 2).Select
Loop

endesuche:
ActiveCell.Offset(1, -1).Select

Do Until ActiveCell = „“
ActiveCell.Offset(0, 1).Select
If ActiveCell „“ Then
Name = ActiveCell
ActiveCell.Offset(0, -1).Select
datum = ActiveCell
Sheets(„Ausgabe“).Select
ActiveCell = Name
ActiveCell.Offset(0, 1).Select
ActiveCell = datum
ActiveCell.Offset(1, -1).Select
Sheets(„Kalender“).Select
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, -1).Select
End If
Loop

Range(„A1“).Select

Sheets(„Ausgabe“).Select
Range(„A10“).Select

End Sub


Was macht das Makro? (Am besten per F8 einzeln nachvollziehen.)

  1. Zuerst einmal wird im Blatt Ausgabe der Inhalt gelöscht. Hierzu wird von Zelle A10 solange nach unten gegangen, bis die aktive Zelle leer ist. Danach wird der ausgelesene Bereich gelöscht.
  2. Dann wird der Monat in eine Variable übergeben.
  3. Im Blatt Kalender wird nur ab Zelle B1 geschaut, ob es sich um de eingelesenen Monat handel. Wenn nein, dann springt das makro zwei Zelen anch rechts und prüft erneut, wenn ja, springt es aus der Abfrage. Insgesamt hört die Abfrage auf, wenn die Zelle leer ist (hier wäre vielleicht ein Abbruch mti Fehlermeldung interessant).
  4. Ist der Monat gefunden, beginnt eine Schleife, die solange nach beim entsprecehnden Datum nach unten geht, bis ein leeres Feld kommt. Die Einzelschritte sind abfragen, ob eine Name neben dem Datum steht und wenn ja Name und Datum auslesen und in Blatt Ausgabe übergeben, ansonsten zum nächsten Datum.

Das war das grundsätzliche. Schau dir die einzelnen Schritte einfach mal an (Editor auf und Makro mitTaste F8 starten --> Einzelschritt).

Bei mir gab es keiner Probleme.

Viel Erfolg, Aiko.

Hallo Aiko,

vielen Dank für den Code und die Erklärung.
Allerdings bekomme ich bei Range(„B1“).Select eine Fehlermeldung:
Laufzeitfehler ‚1004‘ anwendungs- oder objektdefinierter Fehler

Woran liegt das?

Gruß,
Junika

Hallo Junika.

vielen Dank für den Code und die Erklärung.
Allerdings bekomme ich bei Range(„B1“).Select eine
Fehlermeldung:
Laufzeitfehler ‚1004‘ anwendungs- oder objektdefinierter
Fehler

Woran liegt das?

Meinst du hier:

Sheets(„Kalender“).Select
Range(„B1“).Select
Do Until ActiveCell = „“
If ActiveCell = monat Then GoTo endesuche
ActiveCell.Offset(0, 2).Select
Loop

Ganz ehrlich? Keine Ahnung. Ich kann mir immer nicht merken, was die Fehler genau bedeuten - allerdings wüsste ich jetzt so spontan überhaupt nicht, was daran falsch sein sollte, die Zelle B1 anzuwählen (das besagt „Range(„B1“).Select“ ja eigentlich nur). Geht er denn in das Blatt Kalender rein? Komisch.

Grüße, Aiko.

Hallo Aiko,

jep, genau da. Wenn ich über den Button „Ausführen“ ins Makro gehe, wird der Fehler konkreter:
„Die Select-Methode des Range-Objektes konnte nicht ausgeführt werden.“

Was mir allerdings auch mal total unverständlich ist. Sollte ja eigentlich kein Problem sein…
Muss ich vorher noch irgendwas definieren? Variablen o.ä.?

Gruß,
Junika

Allerdings bekomme ich bei Range(„B1“).Select eine
Fehlermeldung:
Laufzeitfehler ‚1004‘ anwendungs- oder objektdefinierter
Fehler

Hallo Junika,

der Code steht im falschen Modul.

Er gehört in ein Standard-Modul (Einfügen—Modul)

Und, Select braucht man nahezu nie, gewöhns dir erst gar nicht an bzw. gewöhne dir gleich an Select nicht zu benutzen.

Gruß
Reinhard

Hallo Reinhard.

Ui, wieder was gelernt. Ich versuche auch langsam von den Selects wegzukommen, ist zum Einstieg aber vielleicht nicht das verkehrteste - ich arbeite allerdings auch gerne mit den visuell nachvollziehbaren Codes, damit ich die Funktion mit dem Auge auch nachvollziehen kann. Wird dadurch natürlich etwas länger das Makro.

Grüße, Aiko.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Junika.

Ich denke, Reinhard hat die lösung gefunden. Wäre aber auch komisch gewesen.

Grüße, Aiko.

Hallo Reinhard,

danke für deine Antwort, nun läufts ohne Probleme.
Da muss man erstmal draufkommen :wink:

Wie kann ich jetzt meinem Button das Modul zuweisen?

Gruß,
Junika

Hallo Aiko,

der Code steht im falschen Modul.
Er gehört in ein Standard-Modul (Einfügen—Modul)

Und, Select braucht man nahezu nie, gewöhns dir erst gar nicht
an bzw. gewöhne dir gleich an Select nicht zu benutzen.

Ui, wieder was gelernt.

ja, EINE Problematik bei Select :smile:

Ich versuche auch langsam von den
Selects wegzukommen, ist zum Einstieg aber vielleicht nicht
das verkehrteste

Normal, wird ja auch vom Makrorekordeer mit Select geliefert.

  • ich arbeite allerdings auch gerne mit den
    visuell nachvollziehbaren Codes, damit ich die Funktion mit
    dem Auge auch nachvollziehen kann.

Mach zwei Fenster nebeneinander, ggfs zwei Monitore, in einem der Code im anderen die Tabelle, dann F8

Wird dadurch natürlich
etwas länger das Makro.

Das auch, vo allem wird die Codeausführung langsamer und langer Cod mit vielen Acivate und Select nahezu unlesbar.

Gruß
Reinhard

Grüße, Aiko.

Habs selber rausgefunden :wink:

Private Sub CommandButton1\_Click() 'Ausführen

Call Makro1

End Sub

Danke für die Hilfe, Reinhard und Aiko! Wieder was gelernt :smile:

Gruß,
Junika

Hallo Reinhard.

Ich gebe dir grundsätzlich Recht. Zur visuellen Verfolgung jedoch:

Mach zwei Fenster nebeneinander, ggfs zwei Monitore, in einem
der Code im anderen die Tabelle, dann F8

Ich empfinde es als visueller, wenn man sieht, dass das Makro gerade in einer bestimmten Zelle ist und diesen Wert ausliest, als wenn man mit der Maus das erst noch mal überprüfen muss. Na ja - ist sicher auch alles Erfahrung und ich traue den Makros noch nicht so ganz, mag halt Object und so (noch) nicht so wirklich.

Bist da wahrscheinlich einfach besser - habe mir das alles autark beigebracht (mittels Rekorder) - daher die Einfachheit meiner Makros.

Grüße, Aiko.

Hallo Junika

Wie kann ich jetzt meinem Button das Modul zuweisen?

ehrliche Antwort?
Am besten gar nicht, der Code gehört in die Tonne.

Aber, ich habe nicht vergessen daß ich auch mal bei Null begann, Excel, Hä, was ist das denn. Erst paar Jährchen her.
Also nimm den Code und gut iss :smile:)

Gruß
Reinhard