PDA

Vollständige Version anzeigen : For...Next: auf allen Tabellenblättern einen Eintrag vornehmen


Willy L.
11.04.2012, 14:55
Hallo zusammen

als absoluter Neuling versuche ich mich langsam in das VBA Excel heranzutasten und lerne mit dem Buch von Bernd Held "Excel VBA Kompendium 2000 bis 2010".

Bei meinen Fragen beziehe ich mich auf die angehängte Bild mit den drei Makros; ich stehe bereits bei den relativ simplen For...Next schleifen an:

http://s7.directupload.net/images/120411/28rqxy58.png (http://www.directupload.net)

Übung1: Ist das programmiertechnisch bedingt immer so, dass ich beim For Endwert um 1 reduzieren muss, um auf die gewünschte Anzahl zu kommen? Also bspw. 5 --> For var = 1 to 4?
Übung2: Eng verknüpft zu Übung1: Warum gilt hier wiederum "1 to 5", wenn ich alle vorhandenen 5 Sheets unbenennen möchte und nicht analog zu Übung1 "1 to 4"?
Übung3: Sein Beispiel "Makro Listing 4.21: Auf allen Tabellenblättern einen Eintrag vornehmen" auf S. 82 funktioniert bei mir anscheinend nicht wie beschrieben. Bei mir wird nur die aktuell selektierte sheet mit dem Datum abgefüllt. Das hier murkt mich am meisten.
Meine letzte allgemeinere Frage ist: kann man diese drei separaten Markos nicht auf einmal mit einer For...next Schleife ausführen, also im sinne von "Generiere mir ein neues workbook mit fünf sheets, benenne sie jeweils mit "Hello World 1, 2, etc. und trage in jedes sheet in der Zelle E1 das Datum". Habe den ganzen morgen herumgebastelt, bin aber nicht auf einen grünen Zweig gekommen. Oder muss ich anders bewerkstelligen mit For..Each schleife?


Ich habe noch kein Programmier-Verständnis bzw. feeing, also nicht (allzu laut) lachen, ist mir bewusst, dass es typische Anfängerdetailfragen sind.

Gruss
willy

Alfredx
11.04.2012, 15:02
beim ersten hast du doch schon ein workbooks.add nach der Variablendeklarierung, deswegen danach 1 to 4, weil eins ja schon da ist

DeBabba
11.04.2012, 15:05
Hi,
wenn du auf allen tabellenblättern was einfügen möchtest, probier mal das


Sub EintragVornehmen()
Dim intTab As Integer
For intTab = 1 To ActiveWorkbook.Worksheets.Count
Range("E1").Value = Date
Next intTab
End Sub



Gruß De babba

EarlFred
11.04.2012, 15:20
Hallo Willy,

wenn Code als Text vorliegt, poste ihn bitte auch als Text. Bilder lassen sich so schwer in den Editor kopieren ;) (OK, ist hier konkret vielleicht nicht erforderlich, aber für die Zukunft... Es gibt neben den Code-Tags im Forum auch tolle Tools, mit denen sich Code gut darstellen (und auch wieder kopieren) lässt - schau einfach mal, wie es andere machen (aber "klatsch" den Code bitte nicht einfach unformatiert in den Fließtext ;)))

Zu Ü1:
Herr Held geht vermutlich davon aus, dass beim Erstellen einer Mappe bereits genau 1 Blatt vorhanden ist (0 Blätter geht nicht). Die Einstellung kann aber auch geändert werden, so dass Du möglicherweise hinterher mehr als 5 Blätter in der Mappe hast.

Zu Ü2:
Wenn Du alle 5 Blätter umbenennen willst, muss der Zähler von 1 bis 5 laufen (der Index des ersten Blattes ist 1 - und nicht 0, wie in vielen anderen Fällen)
(Ja, es geht auch anders... aber klein anfangen ;))

Zu Ü3:
Sein Beispiel "Makro Listing 4.21: Auf allen Tabellenblättern einen Eintrag vornehmen" auf S. 82 funktioniert bei mir anscheinend nicht wie beschrieben.
Auch wenn ich die Beschreibung dessen, was der Code tun soll, nur erraten kann: Er tut vermutlich auch bei mir nicht, was er soll.
Auch eingefleischten Profis wie Herrn Held unterlaufen mal Fehler: Ist das Blatt, auf dem etwas passieren soll, NICHT angegeben, so passiert die Aktion in der Regel im gerade aktuellen (aktiven) Blatt.
Worksheets(intTab).Range("E1").Value = Date
wäre ein vollständiger(er) Bezug, so dass der Code auch weiß, in welches Blatt er etwas einfügen soll.

Zur letzten Frage:
Möglicherweise könnte der Code so aussehen:
Option Explicit

Sub AllesAufEinmal()
Dim i As Long
Dim wb As Workbook

Set wb = Workbooks.Add

Do While wb.Worksheets.Count < 5
wb.Worksheets.Add
Loop
For i = 1 To wb.Worksheets.Count
With wb.Worksheets(i)
.Name = "Nummer " & i
.Range("E1") = Date
End With
Next i

Set wb = Nothing
End Sub

Grüße
EarlFred

chris-kaiser
11.04.2012, 15:25
Hi

Über B.H keinen Kommentar ^^

zu. 1
wenn eine neue Mappe erzeugt wird hat dies automatisch zumindest eine Tabelle!
(ohne eine Tabelle keine Mappe, deshalb 1 bis 4 = 5 Tabellen oder Standard sind 3 Tabellenblätter die bei einer neuen Mappe erzeugt werden.)

zu.2
damit alle Blätter erfasst werden sollen
1 bis 5

aber du schreibst 5 mal das Datum in die gleich Zelle deines aktiven Tabellenblattes...

for intTab=1 to 5
sheets(IntTab).name="Hello World" & IntTab
sheets(IntTab).Range("E7").value=Date
next

du musst das Blatt bekanntgeben!

zu 3. (ein wenig überladen ^^ aber dafür lasse ich dein FOR drinnen)
Hier wäre das loop while von EarlFred sicherlich besser!, dafür habe ich die fast sinnlose Abfrage noch drinnen ob mehr als 5 Tabellen sind. :)

Sub itu()
Dim wb As Workbook, IntTab As Integer
Set wb = Workbooks.Add 'neue Mappe
'jetzt sollen zumindest 5 Tabellen sein
With wb
If .Sheets.Count > 5 Then 'falls mehr als 5 Tabellen sind
'dann lösche diese (in der Reihenfolge ab Blatt5)
For IntTab = Sheets.Count To 6 Step -1
'Blatt löschen
Application.DisplayAlerts = False
Sheets(IntTab).Delete
Application.DisplayAlerts = True
Next
'ansonsten
Else
'erzeuge 5 Tabellenblätter
For IntTab = .Sheets.Count To 4
.Worksheets.Add
Next
End If

'so nun Eintrag in den Zellen und umbenenen der Blätter
For IntTab = 1 To 5
.Sheets(IntTab).Range("E17").Value = Date
.Sheets(IntTab).Name = "Hello World" & IntTab
Next
End With
End Sub

]

Willy L.
11.04.2012, 17:50
Wow, in so kurzer Zeit so viele Rückmeldungen!

Zu Ü1: Klassischer Denkfehler von mir, Aflredx :eek: . Ich kann in diesem spezifischen Fall auch so argumentieren, dass ich zusätzliche sheets zum neuen workbook einfüge. Damit erübrigt sich das Grübeln zu Ü2 auch.

Zu Ü3: Beim nochmaligen Überprüfen ist mir noch aufgefallen, dass ich die "verschlimmbesserte" Code hochgeladen habe. Mein ursprünglicher Code (wie im Buch) war genau wie die von deBabba:

Sub ForNext_Uebung3_Tabellenblaetter_zaehlen()
Dim intTab As Integer

For intTab = 1 To ActiveWorkbook.Worksheets.Count
Range("E1").Value = Date
Next intTab
End Sub
Ich hatte zunächst auch das Gefühl gehabt, dass dort wahr' was mit der "Pfadangabe" zu tun hatte und probierte was mit "ActiveWorkbook.worksheet." . Auf den (im Nachhinein gesehen) simplen und logischen hint von EarlFred bzw. Chris-Kaiser kam ich nicht darauf.

Der korrekter Code sieht so aus:
Sub ForNext_Uebung3_Tabellenblaetter_zaehlen()
Dim intTab As Integer

For intTab = 1 To ActiveWorkbook.Worksheets.Count
Worksheets(intTab).Range("E1").Value = Date
Next intTab
End Sub

Eure Vorschäge zur Konsolidierung der Makros muss ich Ruhe nochmals anschauen. Da sind doch noch ein paar BasicElemente und Approaches (While, Loop, verschachtelt), die ich aufarbeiten muss...die kommen ja erst nach For...Next bzw. For...Each Unterkapitel im Buch.

Aber nochmals vielen Dank für Eure konstruktive Feedbacks! Hat mir sehr geholfen. Ich werde mich bezüglich Forum-Umgang bzw. Thread-Beschreibung ebenfalls grössere Aufmerksamkeit widmen.

Gruess
willy