Tabellenblätter automatisch erzeugen

Bild

Betrifft: Tabellenblätter automatisch erzeugen
von: Andy
Geschrieben am: 14.03.2005 13:29:13
Hallo Leute,
hab in eurem Forum gestöbert und bin schwer beeindruckt. Hab jetzt auch ein kleineres (oder größeres) Problem, bei dem ich absolut nicht weiter komme. Bin absoluter VBA-Laie (hab mir aber heute extra ein Buch gekauft).
Meine Frage:
Ich habe 2 Dateien. In der einen Datei befinden sich Stammdaten (Name, Personalnummer, Arbeitsstd. Montag, Dienstag etc., usw.
In die 2. Datei übernehme ich einen Teil dieser Stammdaten und führe diverse Berechnungen aus. Hierbei benötige ich für jeden Mitarbeiter ein eigenes Arbeitsblatt. Bisher habe ich immer eine entsprechende Blankovorlage kopiert und die Daten aus dem Stammblatt verknüpft.
Kann man das ganze so automatisieren, das ich per VBA aus meiner Stammdatendatei eine Abrechnungsdatei erzeuge mit variabler Anzahl der Arbeitsblätter auf Basis Mitarbeiterzahl und gleichzeitig bestimmte Stammdaten in vordefinierte Felder des Abrechnungs-Arbeitsblattes kopiere. Optimal wäre noch automatische Vergabe Dateiname für Abrechnungsdatei und Arbeitsblattname gem. Mitarbeitername. Ausserdem muss das Abrechnungs-Arbeitsblatt auf einer bestimmten Vorlage basieren.
Ich vermute mal ein bisschen viel auf einmal, bin aber für jeden Tip dankbar. Werde mich in der Zwischenzeit auch ein bisschen einlesen.
Vielen Dank an Alle schon mal vorab.
Andy

Bild

Betrifft: AW: Tabellenblätter automatisch erzeugen
von: Domke, Frank
Geschrieben am: 14.03.2005 14:49:34
Hallo Andy,
ich wünsche Dir ein angenehmes Selbstudium! Um Deine Frage(n) zu beantworten, mit VBA ist fast alles möglich. Dein Problem ist auf jeden Fall lösbar, aber aufgrund Deiner präzisen Anforderungen nicht in einem kurzen Forumseintrag zu schaffen!
Gruß
Frank.
Bild

Betrifft: AW: Tabellenblätter automatisch erzeugen
von: Volker
Geschrieben am: 14.03.2005 15:01:01
Hallo Andy,
willkommen im Forum.
Das sind gleich 3 Wünsche auf einmal;-).
Spass beiseite, das ist tatsächlich recht happig für den Anfang.
Excel Profi ist schon mal nicht schlecht. Du kannst grundsätzlich alles, was Du per Maus/Menü anstellst, auch per VBA machen.
Die automatisierung besteht halt darin, dass Du z.B. fixe Zellbezüge, Datei- oder Blattnamen und alles andere variabel machen kannst.
Dazu ein paar Schleifen und Verzweigungen, fertig ist der Lack. (Im Groben)
Bei deinen Vorkenntnissen kannst Du ganz gut mit dem Makrorekorder arbeiten und das Ergebnis anpassen.
Zellen werden über ihren Range (z.B. Range("A1")="Willi") ausgewertet/geändert/kopiert etc. Alternativ die Schreibweise mit cells(,).
Cells(1,5) entspr. Range("E1").
Angenommen deine Mitarbeiter stehen in Spalte A ab Zeile 1:
Das hier erzeugt in einem neuen Workbook ein neues Blatt pro MA mit dessen Namen.

Sub neue_MA()
Dim i As Integer
Dim std, ma, alle_ma As String
i = 1
std = ActiveWorkbook.Name
alle_ma = ActiveSheet.Name
Workbooks.Add
ma = ActiveWorkbook.Name
While Workbooks(std).Sheets(alle_ma).Cells(i, 1) <> ""
    If i <= Workbooks(ma).Sheets.Count Then
        Workbooks(ma).Sheets(i).Name = Workbooks(std).Sheets(alle_ma).Cells(i, 1)
    Else
        Workbooks(ma).Sheets.Add
        ActiveSheet.Name = Workbooks(std).Sheets(alle_ma).Cells(i, 1)
    End If
    i = i + 1
Wend
End Sub

Glaube, das reicht für den Anfang
Gruß
Volker
Bild

Betrifft: AW: Funzt nicht so ganz
von: Andy
Geschrieben am: 14.03.2005 16:01:28
Hallo Volker,
kann es sein das sich ein kleiner Fehler eingeschlichen hat.
Zunächst läuft alles richtig. Datei wird angelegt und Tabellenblatt wird mit Bezeichnung aus Feld A1 ursprüngliches Blatt angelegt.
Dann wird jedoch das Tabellenblatt aus der ursprünglichen Datei umbenannt in den Feldinhalt von A2 und dann kommt Fehlermeldung (Index außerhalb des gültigen Bereiches). Ausserdem wird in der neuen Datei noch ein 2. Tabellenblatt angelegt mit Bezeichnung "Tabelle2".
2. Frage
Kann ich statt der While-Schleife zur Prüfung ob Feld leer ist auch die UsedRange.Rows.Count verwenden um dann mit dieser Variablen die Zellbezüge, Dateinamen etc. herzustellen ?
Vielen Dank nochmal vorab.
Andy
Bild

Betrifft: AW: Funzt nicht so ganz
von: Volker
Geschrieben am: 14.03.2005 16:25:01
Hi Andy,
wenn ein Code nicht funzt, kannst Du ihn mit F8 schrittweise durchgehen, um zu sehen was passiert (und für Anfänger vor allen Dingen, was welcher Befehl macht).
Klickst Du auf den linken Rand, kannst Du einen Haltepunkt setzen, an dem die Ausführung stoppt.
Die Werte von Variablen kann man ansehen, indem man mit der Maus über den Code geht.
Einfach mal testen.
zu 2.
Schon richtig, UsedRange.Rows.count/columns liefert die Anzahl der benuzten Zeilen/Spalten. Aber eben nur die Anzahl und nicht den Index
Ist z.B: "B2:C2" der UsedRange, dh. Zeile1 und Spalte A sind leer, liefert Dir der Ausdruck für Zeile und Spalte jeweils 2.
Es kommt halt darauf an, was Du vorhast.
Mit range("A1").end(xldown).row bekommst Du z.B. die Zeilennr. der letzten nichtleeren Zelle in Spalte A vom A1 aus nach unten. Sollten Lücken da sein zählt er nur bis dahin.
also statt while/wend
letzte=range("A1").end(xldown).row
for i=1 to letzte
.....
next
Das geht auch nach oben , nach rechts und von rechts
zu 1.
hast Du den Code 1 zu 1 kopiert?
Bei läuft's tadellos.
Gruß
Volker
Bild

Betrifft: AW: Funzt doch ;-)
von: Andy
Geschrieben am: 14.03.2005 16:35:28
Sorry,
Code funzt doch. Keine Ahnung wo ich den Fehler gemacht habe. Werd jetzt darauf mal aufbauen und sehen was ich so hinkriege. Vielen Dank nochmals.
Andy
Bild

Betrifft: Gern geschehen
von: Volker
Geschrieben am: 14.03.2005 16:38:51
.
Bild

Betrifft: AW: Eine kleine Frage noch
von: Andy
Geschrieben am: 14.03.2005 18:20:52
Darf ich nochmal nerven ?
Hab den Code jetzt soweit auf meine Bedürfnisse angepasst. Das Einzige was mir jetzt noch fehlt ist die Neuanlage der Arbeitsblätter auf Basis einer Vorlage. Wo (und vor allem wie) kann ich die Vorlage für das Worksheet definieren. Hier mein Code:

Sub neue_MA()
Dim i As Integer
Dim std, ma, alle_ma As String
Dim strName As String
Const Lw = "c:\"
Const Pfad = "c:\"
i = 8
std = ActiveWorkbook.Name
alle_ma = ActiveSheet.Name
Workbooks.Add
ma = ActiveWorkbook.Name
While Workbooks(std).Sheets(alle_ma).Cells(i, 3) <> ""
    If i <= Workbooks(ma).Sheets.Count Then
        Workbooks(ma).Sheets(i).Name = Workbooks(std).Sheets(alle_ma).Cells(i, 2) & " - " & Workbooks(std).Sheets(alle_ma).Cells(i, 4) & " - " & Workbooks(std).Sheets(alle_ma).Cells(i, 3)
    Else
        Workbooks(ma).Sheets.Add
        ActiveSheet.Name = Workbooks(std).Sheets(alle_ma).Cells(i, 2) & " - " & Workbooks(std).Sheets(alle_ma).Cells(i, 4) & " - " & Workbooks(std).Sheets(alle_ma).Cells(i, 3)
    End If
        i = i + 1
Wend
strName = Workbooks(std).Sheets(alle_ma).Cells(3, 4) & "_" & Workbooks(std).Sheets(alle_ma).Cells(5, 4) & "_" & "Lohn"
ChDrive Lw
ChDir Pfad
ActiveWorkbook.SaveAs Filename:=strName, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=True
End Sub

Ein kleines Problem noch mit obigen Code:
In der neuen Datei wird ein Worksheet mit der Bezeichnung 'Tabelle1' angelegt, bevor das erste Worksheet mit den Daten aus der Ursprungsdatei angelegt wird. Hat wohl irgendwas mit dem Zähler 'i' zu tun, da meine Daten erst in Zeile 8 anfangen.
Danke vorab
Andy
Bild

Betrifft: AW: Eine kleine Frage noch
von: Volker
Geschrieben am: 14.03.2005 18:56:39
Hallo Andy,
fange mal mit den kl. Prob an:
Das i hab ich (ungeschickterweise) als Zähler für die Blätter und für den Zeilenindex der MA-Namen in Spalte C gebraucht. Wenn der 1. Name erst in C8 steht, mußt Du das natürlich anpassen:
Du nimmst eine 2. Integervariable als Zähler für den Blattindex.
In Deinem ist der um um 7 kleiner ist als i und die Du dann auch hochzählen mußt.
j=i-7
und dann sheet(j)... usw
oder Du referenzierst mit entsprechendem Offset (schwafel), im Klartext:
sheet(i-7).......usw.
Je nach Anwendung kannst Du mit mehreren Zählervariablen die tollsten Sachen zaubern, aber auch verzweifeln.
Wenn da was nicht geht, schaue ich mir die aktuellen Werte immer einzeln an.
Dieses if ist auch nur drin, weil ich nicht weiß, wieviele Blätter eine neue Mappe bei Dir hat.
Zu Deiner Vorlage eine Idee:
Du erstellt Dir eine Vorlage mit genau einem Blatt wie Du es haben willst und öffnest das am Anfang.
Dann zählst Du die MA und kopierst das eine Blatt in der Vorlage entsprechend oft.
Also statt Workbooks.Add
WorkBooks.Open.... wenn der Pfad feststeht:Makrorekorder.
Die Blätter kopieren: siehe Rekorder
Das Worksheet.add in meiner Schleife kannst Du Dir dann nat. auch sparen.
Bin etwas kurz angebunden, weil ich jetzt Feierabend mache.
Noch was: wenn Du mit dem Rekorder aufzeichnest, wird dauernd selektiert und activiert, das es eine Pracht ist, aber leider völlig unnötig.
z.B.Kopiere A1 von einer Mappe in die andere:
Workbooks("Mappe1").activate
Worksheets("Tabelle1").activate
Range("A1").select
Selection.Copy
Workbooks("Mappe2").activate
Worksheets("Tabelle1").activate
Range("A1").select
Selection.Paste
In Kurzform
Workbooks("Mappe1").("Tabelle1").Range("A1").Copy
Workbooks("Mappe2").("Tabelle1").Range("A1").Insert/Paste
oder
Workbooks("Mappe2").("Tabelle1").Range("A1")=Workbooks("Mappe2").("Tabelle1").Range("A1")
Bis Morgen
Volker
Bild

Betrifft: Danke
von: Andy
Geschrieben am: 15.03.2005 17:52:29
Hallo,
hab Dank Deiner Anregungen alles so hinbekommen wie es sein sollte. Wäre ohne Tips echt aufgeschmissen gewesen. Code ist zwar noch etwas aufgebläht aber das wird schon noch. Zumindest tut der Code das was er sollte.
Vielleicht kann ich auch mal irgendwann behilflich sein.
Danke
Andy
Bild

Betrifft: Gern geschehen
von: Volker
Geschrieben am: 15.03.2005 18:21:50
War mir ein Vergnügen.
Respekt, wie Du das als Anfänger gemacht hast.
Aber Vorsicht: Suchtgefahr. Wenn Du anfängst, Deinen Verbrauch an Toilettenpapier in Excel auszuwerten, solltest Du ne Pause machen ;-)
Bin ja selber bestenfalls fortgeschritten und stell immer wieder fest, dass man beim Helfen selber noch was lernt.
Besonders wenn es um bestimmte Syntax geht, werfen auch die Profis regelmäßig den Rekorder an, weil sich keiner die Masse der Parameter merken kann.
Gruß
Volker
Bild

Betrifft: AW: Tabellenblätter automatisch erzeugen
von: Andy
Geschrieben am: 14.03.2005 15:37:25
Danke Euch für die schnelle Antwort. Hilft mir schon viel weiter.
Hab die ersten Gehversuche mit VBA nach 'Selbststudium' ;-)) unternommen, einiges funzt, einiges treibt mich noch in den Wahnsinn.
CU
Andy
Bild

Betrifft: AW: Tabellenblätter automatisch erzeugen
von: Volker
Geschrieben am: 14.03.2005 15:59:35
Hi Andy,
erstaunlich, die meisten sind schon vor ihrem 1. Forumsbeitrag dem Wahnsinn anheim gefallen ;-)
Also ruhig fragen, aber nicht (wie manche Strategen) 200 Zeilen Code posten und dann fragen:"Was íst hier falsch"
Am besten ma teilt sein Problem auf, nach dem Motto:
"das will ich machen"
"das hab ich schon, bekomme aber diesen und jenen Fehler"
Und je präziser die Frage, desto mehr kannst Du mit der Antwort anfangen.
Gruß und Mut zur Lücke
Volker
 Bild

Beiträge aus den Excel-Beispielen zum Thema "Tabellenblätter automatisch erzeugen"