Mit Hilfe von Makros Arbeitsmappen erstellen, umbenennen, teilweise füllen und automa
#1
Hallo Leute,

ich bin leider nicht (mehr) so fit mit Excel und schon gar nicht mit makros, wollte aber meine Dokumentation etwas übersichtlicher gestalten. Also zum Punkt:

Ich habe in meiner ersten Arbeitsmappe eine Übersicht mit einer Liste von verschiedenen Kunden, aus dieser Liste sollte sich dann mithilfe eines Makros neue Mappen (eine pro Kunden) erstellen und nach dem Kunden benennen. Dafür hab ich diesen Code im Internet gefunden / umgebastelt: Angel

Dim Bereich As String
Dim Zelle As Range
Dim Tabelle As Worksheet
Bereich = "a2:a51"
With ActiveWorkbook
For Each Zelle In ActiveSheet.Range(Bereich).Cells
 Set Tabelle = .Sheets.Add(After:=.Sheets(Sheets.Count))
Next Zelle
End With
End Sub

So weit so gut. :20:

Jetzt hätte ich aber noch gern Blush

a) die Zellen A1-A4 jeder dieser neu erstellten Mappen gefüllt (nicht infividuell sondern überall nur die Tabellenüberschriften)
b) die Möglichkeit in die Kundenliste in der Übersichtsmappe nachträglich Namen zwischendrin einzufügen (da alphabetisch), wodurch sich gleichzeitig immer eine neue mappe mit dem jeweiligen Namen erstellt.

Also zunächst die Frage, geht das überhaupt so wie ich mir das vorstelle und kann mir dabei jemand helfen? :100:

Vielen Dank schon mal und schönen tag euch.
Top
#2
Hallo!

Zuallererst mal: Lerne bitte den Unterschied zwischen "Mappe" (=Exceldatei) und "Tabellenblatt" (=Blatt innerhalb der Datei).

Hier mal die Hilfe zum Punkt a), den Rest schaff ich nicht mehr weil ich weg muss.

Ich hab deinen Code aber etwas umgebaut, denn in der von dir präsentierten Fassung hat er zwar für jeden Kunden ein Tabellenblatt angelegt, die hießen aber dann alle nur "Tabelle2", "Tabelle3" usw.
Nun werden die Blätter mit dem Kundennamen versehen (bei evtl. doppelt vorkommenden Namen wird der Fehler allerdings nicht abgefangen!).

Code:
Sub test()
Dim Bereich As String
Dim Zeile As Integer
Dim Tabelle As Worksheet

   With ActiveWorkbook
       For Zeile = 2 To 51
           Set Tabelle = .Sheets.Add(After:=.Sheets(Sheets.Count))
           ActiveSheet.Name = Sheets("Tabelle1").Cells(Zeile, "A").Value
           ActiveSheet.Range("A1").Value = "Überschrift1"
           ActiveSheet.Range("A2").Value = "Überschrift2"
           ActiveSheet.Range("A3").Value = "Überschrift3"
           ActiveSheet.Range("A4").Value = "Überschrift4"
       Next Zeile
   End With
End Sub
Schöne Grüße
Berni
[-] Folgende(r) 1 Nutzer sagt Danke an MisterBurns für diesen Beitrag:
  • CHASiN1994
Top
#3
Wow, das ging ja schnell. Vielen Dank dir und sorry für die falsche Formulierung, wie gesagt ich hab nicht so viel ahnung.

Aber dein Code funktioniert soweit ganz gut und ich glaub ich habe auch die Funktionsweise begriffen.

Falls jetzt noch jemand eine Idee hätte wie ich das mit der Aktualisierung hinkriege, aktuell erscheint kein neues Tabellenblatt ( Idea ) wenn ich in der Übersicht eine neue Zeile einfüge, sondern es ändert sich im Prinzip nichts.
Bin für jede Hilfe sehr dankbar Angel
Top
#4
Ich hoffe ich bin jetzt nicht zu dreist in meinen Anfragen aber mir ist noch ein kleines Schmankerl eingefallen was das Programm noch besser machen würde :32: 
ich nenne es mal

c) die vierte Spalte in den erstellten Tabellenblättern hat die Überschrift "To Do's" (bei meiner ersten Anfrage waren es noch Zeilen, aber das habe ich im Quelltext geändert). Hier wäre es sehr praktisch wenn die letzte ausgefüllte Zeile dieser Spalte wiederum in das Übersichtsblatt übertragen und dementsprechend auch aktualisiert wird.

Bei meinen groben Vorstellungenm, wie diese Programmierung funktioniert bin ich zu dem Ergebnis gekommen, dass das machbar sein dürfte, wenn auch vllt etwas komplizierter und garantiert so dass ich das nicht hinkriege. Aber wenn sich jemand von euch dem annehmen könnte/wollte. Thumbsupsmileyanim
Top
#5
Zuerst mal entschuldige bitte, dass ich das mit den Überschriften durcheinandergebracht habe. Natürlich müssen die nicht in A1 bis A4 sondern von A1 bis D1. Weiß nicht wieso aber ich komme damit immer wieder durcheinander...  Dodgy

Zu b) 
Zitat:wodurch sich gleichzeitig immer eine neue mappe mit dem jeweiligen Namen erstellt.

Bist du wirklich sicher, dass du das so extrem automatisiert haben willst? Könntest du dir vorstellen, dass das neue Tabellenblatt auch durch klick auf einen Button erstellt wird? Das halte ich für etwas unproblematischer.

Zu c) Das habe ich jetzt nicht verstanden.
Die erstellten Tabellenblätter haben in Spalte D die Überschrift "To Do's" - ok, verstanden. Aber dieses Tabellenblatt ist doch sonst grundsätzlich noch leer. Also welche letzte ausgefüllte Zeile soll hier in das Übersichtsblatt übertragen werden?
Weitere Fragen:
1. auf welchen Auslöser hin soll das übertragen werden?
2. Wohin (welche Zeile/Spalte) im Übersichtsblatt soll es übertragen werden? Neben dem Kundennamen?
3. Können die Einträge aus allen Tabellenblättern gleichzeitig übertragen werden? Denn es wäre wesentlich einfacher, alle Blätter "abzugrasen" und die letzte Zeile zu übertragen. Natürlich werden damit jedesmal die Einträge auf dem Übersichtsblatt überschrieben, was aber bei unveränderten Einträgen ja egal sein sollte.

Du solltest dir übrigens wirklich überlegen, auch mit Kundennummern zu arbeiten, denn bei Namensgleichheit von Kunden hast du dann ein Problem.
Schöne Grüße
Berni
Top
#6
Hallo nochmal,

ja das mit den falschen Zellen hattest du schon richtig gemacht, ich habe nämlihc nach genau den Zellen gefragt, der Fehler lag also bei mir

zu b) von mir aus kann das auch gerne über einen button funktionieren. Zum Beispiel könnte man den Kundennamen als Linkbutton zu dem jeweiligen Tabellenblatt fungiert. Wichtig wäre eben nur, dass ich auch nachträglich zwischen den Kundennamen Zeilen einfügen kann und die Tabellenblätter die gleiche Reihenfolge haben. Im Zweifel ließe sich das aber auch manuell erledigen.

zu c)
1. ich weiss nicht genau welcher Auslöser sich da womöglich anbieten würde, bin da für jegliche vorschläge offen
2. Der Übertrag sollte dann in die Spalte Q des Übersichtsblattes in die Zeile des jeweiligen Kunden übertragen werden
3. ja genau so wäre das super
Top
#7
Hallo,

das ist mal der Code, mit dem du die Blätter anlegen und die Daten in das Übersichtsblatt übertragen kannst:

Code:
Option Explicit



Sub TabellenblattAnlegen()
Dim Zeile As Integer
Dim Tabelle As Worksheet
Dim Quelle As Worksheet
Dim letztezeile As Integer

Set Quelle = Sheets("Übersichtsblatt")
letztezeile = Quelle.Cells(Rows.Count, 1).End(xlUp).Row


   With ActiveWorkbook
       For Zeile = 2 To letztezeile
       On Error GoTo Fehler
           If Not WorksheetExists(Quelle.Cells(Zeile, "A")) Then
               Set Tabelle = .Sheets.Add(After:=.Sheets(Sheets.Count))
               ActiveSheet.Name = Quelle.Cells(Zeile, "A").Value
               ActiveSheet.Range("A1").Value = "Überschrift1"
               ActiveSheet.Range("B1").Value = "Überschrift2"
               ActiveSheet.Range("C1").Value = "Überschrift3"
               ActiveSheet.Range("D1").Value = "Überschrift4"
           End If
       Next Zeile
   End With

Quelle.Activate

Exit Sub

Fehler:
Quelle.Cells(Zeile, "A").Interior.Color = vbYellow
Resume Next


End Sub


Public Function WorksheetExists(ByVal WorksheetName As String) As Boolean
On Error Resume Next
WorksheetExists = (Sheets(WorksheetName).Name <> "")
On Error GoTo 0
End Function


Sub Übertrag()
Dim Zeile As Integer
Dim Tabelle As Worksheet
Dim Quelle As Worksheet
Dim letztezeile As Integer
Dim letztezeile2 As Integer
Dim Blattname As String

Set Quelle = Sheets("Übersichtsblatt")
letztezeile = Quelle.Cells(Rows.Count, 1).End(xlUp).Row

For Zeile = 2 To letztezeile
   Blattname = Quelle.Cells(Zeile, "A").Value
   letztezeile2 = Sheets(Blattname).Cells(Rows.Count, 4).End(xlUp).Row
   Quelle.Cells(Zeile, "Q").Value = Sheets(Blattname).Cells(letztezeile2, 4).Value
Next

End Sub

Ich würde das am einfachsten mittels Buttons ausführen. Ich habe jetzt auch eine Abfrage eingebaut, ob schon ein Tabellenblatt existiert mit dem Kundennamen. Dadurch kann auch bei nachträglich hinzukommenden Kunden ein Tabellenblatt angelegt werden. Was NICHT enthalten ist:

- Abfrage, ob der Kundenname unerlaubte Zeichen enthält (zB /)
- Neu erstellte Tabellenblätter werden immer ans Ende gestellt, eine Sortierung erscheint mir hier nicht ganz trivial. Eine Möglichkeit wäre, dass im Übersichtsblatt die Kunden alphabetisch sortiert werden. Eine Sortierung der Tabellenblätter nach Alphabet ist dann einfach einzubauen. Ich weiß aber nicht, ob das von dir gewünscht ist. Falls ja, füge diesen Code hinzu

Code:
Sub BlätterSortieren()
Dim B1 As Integer, B2 As Integer
Application.ScreenUpdating = False
For B1 = 2 To ThisWorkbook.Sheets.Count
   For B2 = B1 To ThisWorkbook.Sheets.Count
       If UCase(Sheets(B2).Name) < UCase(Sheets(B1).Name) Then Sheets(B2).Move Before:=Sheets(B1)
       Next B2
   Next B1
Application.ScreenUpdating = True
End Sub


sowie in der Prozedur "TabellenblattAnlegen" nach der Zeile "Quelle.Activate"

Code:
Quelle.Activate

Call BlätterSortieren
Schöne Grüße
Berni
[-] Folgende(r) 1 Nutzer sagt Danke an MisterBurns für diesen Beitrag:
  • CHASiN1994
Top
#8
Wow, cool funktioniert alles soweit. Vielen Dank dir. Bei den Codes steig ich zwar echt nicht mehr durch aber es funktioniert alles :100: 

Dann wünsch ich mal einen frohen Feiertag und ein schönes Wochenende und verabschiede mich hiermit bis auf weiteres ;)
Top
#9
Nachtrag:
Hab noch vergessen zu schreiben, dass für den Fall eines falschen Zeichens im Kundennamen dennoch ein Tabellenblatt angelegt wird. Es heißt dann aber einfach "TabelleX", wobei X für eine Zahl steht.
Damit das sofort ersichtlich ist, wird die betreffende Kundennummer im Übersichtsblatt gelb hinterlegt.

Freut mich übrigens, dass es funktioniert.
Schöne Grüße
Berni
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste