Live-Forum - Die aktuellen Beiträge
Datum
Titel
18.04.2024 18:04:29
18.04.2024 16:33:24
Anzeige
Archiv - Navigation
1548to1552
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

Tabellen per Makro generieren

Tabellen per Makro generieren
05.04.2017 18:17:52
Janiina
Hallo wehrte Community,
ich habe ein vielleicht ungewöhnliches Vorhaben.
Ich möchte aus so etwas wie einer Matrix-Tabelle per Macro weiter Tabellen generieren.
Die Matrix enthält 3 Kategorien denen unterschiedliche Namen zugeordnet werden sowie Jahre (Spalten), in denen diese Angebote werden.
Ich möchte nun das für jedes Jahr und jede Kategorie eine Tabelle bei Klick auf "generiere" automatisch in einem neuem Arbeitsblatt generiert wird.
Jahre können dynamisch dazu kommen oder sich ändern, genauso wie neue Namen.
Am besten seht Ihr dazu die beigefügte Beispiel-Datei.

Die Datei https://www.herber.de/bbs/user/112671.xlsm wurde aus Datenschutzgründen gelöscht


Hier habe ich in Tabellenblatt3 das Ergebnis des aktuellen Standes der Matrix-Tabelle festgehalten. Dies soll per Klick auf „generiere“ automatisiert werden und in Tabellenblatt2 erscheinen.
Ist das überhaupt mit humanem Aufwand möglich? Funktioniert sowas? Jemand Ansätze?
VG

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellen per Makro generieren
05.04.2017 21:21:44
Uduuh
Hallo,
klar geht das!
Private Sub CommandButton1_Click()
Dim varr, i As Long, j As Long, wks As Worksheet, strName As String
varr = Tabelle1.ListObjects(1).Range
For i = 2 To UBound(varr)
For j = 3 To UBound(varr, 2)
If LCase(varr(i, j)) = "x" Then
strName = Join(Array(varr(1, j), varr(i, 1), varr(i, 2)), "_")
On Error Resume Next
Set wks = Worksheets(strName)
On Error GoTo 0
If wks Is Nothing Then
Worksheets.Add.Name = strName
End If
End If
Next j
Next i
End Sub
Gruß aus’m Pott
Udo

AW: Tabellen per Makro generieren
06.04.2017 14:15:49
Janiina
Hallo,
danke für die Antowrt. Leider kommt das meiner angestrebten Lösung nicht nahe. Anstelle der Arbeitsblätter möchte ich auf einem Arbeitsblatt diese Tabellen generieren, wie im Arbeitsblatt3 einmal per händisch gemacht.
Anzeige
AW: Tabellen per Makro generieren
06.04.2017 21:51:00
Uduuh
Hallo,
sorry, da kann ich dir nicht helfen. Mit diesen Tabellen (Listobjects) arbeite ich nicht.
Bin wohl zu alt dafür ;-)
Gruß aus’m Pott
Udo

AW: Tabellen per Makro generieren
07.04.2017 10:45:01
Dieter
Hallo Janiina,
ich hab das mal als Einstiegsübung in ListObjekte programmiert:

Sub Generieren()
Dim aktLO As ListObject ' aktuell zu bearbeitendes ListObjekt
Dim anfZeileLO As Long  ' Anfangszeile des nächsten zu generierenden ListObjektes
Dim anfKat(1 To 3) As Long
Dim endKat(1 To 3) As Long
Dim j As Long
Dim k As Long
Dim Kat(1 To 3) As String
Dim listBereich As Range
Dim lo As ListObject
Dim loExistiert As Boolean
Dim loQuelle As ListObject
Dim jahr As Long
Dim spJahr As Long   ' Jahresspalte
Dim stil(0 To 2) As String
Dim wb As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim zeile As Long
Dim zelle As Range
Kat(1) = "AUTO"
Kat(2) = "FLUGZEUG"
Kat(3) = "SCHIFF"
stil(0) = "TableStyleMedium9"
stil(1) = "TableStyleMedium4"
stil(2) = "TableStyleMedium7"
Set wb = ThisWorkbook
Set ws1 = wb.Worksheets(1)
Set ws2 = wb.Worksheets(2)
' Vorhandene ListObjekte löschen
For Each lo In ws2.ListObjects
lo.Delete
Next lo
ws2.UsedRange.ClearContents
Set loQuelle = ws1.ListObjects(1)
Set listBereich = loQuelle.DataBodyRange
'Grenzen der Kategorien bestimmen
For k = 1 To 3
For j = 1 To listBereich.Rows.Count
If listBereich.Columns(1).Cells(j) = Kat(k) Then
anfKat(k) = j
Exit For
End If
Next j
Next k
endKat(1) = anfKat(2) - 1
endKat(2) = anfKat(3) - 1
endKat(3) = listBereich.Rows.Count
anfZeileLO = 1
For spJahr = 3 To loQuelle.ListColumns.Count
jahr = loQuelle.HeaderRowRange.Cells(spJahr)
For k = 1 To 3
For zeile = anfKat(k) To endKat(k)
If listBereich.Cells(zeile, spJahr) = "X" Then
If loExistiert Then
' Dem vorhandenen ListObject aktLO eine weitere Zeile beifügen
aktLO.Resize Range:=ws2.Cells(anfZeileLO, "A").Resize(aktLO.ListRows.Count + 2, 7)
aktLO.DataBodyRange.Cells(aktLO.ListRows.Count, 1) = Kat(k)
aktLO.DataBodyRange.Cells(aktLO.ListRows.Count, 2) = listBereich.Cells(zeile, 2)
Else
' ListObject aktLO erzeugen und lfd. Element beifügen
ws2.Cells(anfZeileLO, "A") = jahr
ws2.Cells(anfZeileLO, "B") = "Name"
ws2.Cells(anfZeileLO, "C") = "Info"
For j = 2 To 5
ws2.Cells(anfZeileLO, j + 2) = "Info" & j
Next j
ws2.Cells(anfZeileLO + 1, "A") = Kat(k)
ws2.Cells(anfZeileLO + 1, "B") = listBereich.Cells(zeile, 2)
Set aktLO = ws2.ListObjects.Add(SourceType:=xlSrcRange, _
Source:=ws2.Cells(anfZeileLO, "A").Resize(2, 7), _
XlListObjectHasHeaders:=xlYes)
aktLO.TableStyle = stil((spJahr - 3) Mod 3)
loExistiert = True
End If
End If
Next zeile
If loExistiert Then
anfZeileLO = aktLO.Range.Row + aktLO.Range.Rows.Count + 1
End If
loExistiert = False
Next k
anfZeileLO = anfZeileLO + 1
Next spJahr
ws2.Activate
End Sub

Die Arbeitsmappe findest du hier
https://www.herber.de/bbs/user/112718.xlsm
Viele Grüße (auch aus dem Pott)
Dieter
Anzeige
AW: Tabellen per Makro generieren
07.04.2017 12:23:36
Janiina
Wow, vielen Dank!
Da will ich hin. Nur die Kategorien funktionieren nicht so ganz. Wenn ich z.B in meiner Matrix nur AUTO angebe, generiert er was anderes.
AW: Tabellen per Makro generieren
07.04.2017 20:49:07
Dieter
Hallo Janiina,
ich war davon ausgegangen, dass die 3 Kategorien immer vorhanden sind.
Jetzt habe ich das Programm so ergänzt, dass die Anzahl der Kategorien beliebig sein kann.

Sub Generieren_V2()
Dim aktKat As String
Dim aktLO As ListObject ' aktuell zu bearbeitendes ListObjekt
Dim anfZeileLO As Long  ' Anfangszeile des nächsten zu generierenden ListObjektes
Dim anfKat() As Long
Dim anzKat As Long      ' Anzahl der vorhandenen Kategorien
Dim endKat() As Long
Dim j As Long
Dim k As Long
Dim Kat() As String
Dim listBereich As Range
Dim lo As ListObject
Dim loExistiert As Boolean
Dim loQuelle As ListObject
Dim jahr As Long
Dim spJahr As Long   ' Jahresspalte
Dim stil(0 To 2) As String
Dim wb As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim zeile As Long
Dim zelle As Range
stil(0) = "TableStyleMedium9"
stil(1) = "TableStyleMedium4"
stil(2) = "TableStyleMedium7"
Set wb = ThisWorkbook
Set ws1 = wb.Worksheets(1)
Set ws2 = wb.Worksheets(2)
' Vorhandene ListObjekte löschen
For Each lo In ws2.ListObjects
lo.Delete
Next lo
ws2.UsedRange.ClearContents
Set loQuelle = ws1.ListObjects(1)
Set listBereich = loQuelle.DataBodyRange
' Anzahl der Kategorien bestimmen
For j = 1 To listBereich.Rows.Count
If listBereich.Columns(1).Cells(j)  aktKat Then
anzKat = anzKat + 1
ReDim Preserve Kat(1 To anzKat)
ReDim Preserve anfKat(1 To anzKat)
ReDim Preserve endKat(1 To anzKat)
Kat(anzKat) = listBereich.Columns(1).Cells(j)
aktKat = listBereich.Columns(1).Cells(j)
anfKat(anzKat) = j
End If
Next j
For j = 1 To anzKat - 1
endKat(j) = anfKat(j + 1) - 1
Next j
endKat(anzKat) = listBereich.Rows.Count
anfZeileLO = 1
For spJahr = 3 To loQuelle.ListColumns.Count
jahr = loQuelle.HeaderRowRange.Cells(spJahr)
For k = 1 To anzKat
For zeile = anfKat(k) To endKat(k)
If listBereich.Cells(zeile, spJahr) = "X" Then
If loExistiert Then
' Dem vorhandenen ListObject aktLO eine weitere Zeile beifügen
aktLO.Resize Range:=ws2.Cells(anfZeileLO, "A").Resize(aktLO.ListRows.Count + 2, 7)
aktLO.DataBodyRange.Cells(aktLO.ListRows.Count, 1) = Kat(k)
aktLO.DataBodyRange.Cells(aktLO.ListRows.Count, 2) = listBereich.Cells(zeile, 2)
Else
' ListObject aktLO erzeugen und lfd. Element beifügen
ws2.Cells(anfZeileLO, "A") = jahr
ws2.Cells(anfZeileLO, "B") = "Name"
ws2.Cells(anfZeileLO, "C") = "Info"
For j = 2 To 5
ws2.Cells(anfZeileLO, j + 2) = "Info" & j
Next j
ws2.Cells(anfZeileLO + 1, "A") = Kat(k)
ws2.Cells(anfZeileLO + 1, "B") = listBereich.Cells(zeile, 2)
Set aktLO = ws2.ListObjects.Add(SourceType:=xlSrcRange, _
Source:=ws2.Cells(anfZeileLO, "A").Resize(2, 7), _
XlListObjectHasHeaders:=xlYes)
aktLO.TableStyle = stil((spJahr - 3) Mod 3)
loExistiert = True
End If
End If
Next zeile
If loExistiert Then
anfZeileLO = aktLO.Range.Row + aktLO.Range.Rows.Count + 1
End If
loExistiert = False
Next k
anfZeileLO = anfZeileLO + 1
Next spJahr
ws2.Activate
End Sub

Ich lade die Arbeitsmappe auch noch einmal hoch:
https://www.herber.de/bbs/user/112735.xlsm
Viele Grüße
Dieter
Anzeige
AW: Tabellen per Makro generieren
09.04.2017 16:16:58
Janiina
Hallo Dieter, nun ist es so wie von mir beschrieben. Besten Dank.
Was mir nun Gebrauch auffällt ist, dass wenn ich in den generierten Tabellen arbeite und unter Info Infos eintrage, nicht mehr neu generieren kann, da die sonst überschrieben werden. Ich muss mir also vorher genausten. Also kann ich die Generieren-Funktion quasi nur einmal Nutzen. Sollte bis auf Weiteres auch reichen...
Gibt es denn eine Möglichkeit nur die Zeilen zu generieren die noch nicht bestehen bzw. bestehende nur zu löschen wenn das X entfernt wurden ist. Also vorweg einmal die vorhandenen Tabellen auslesen. Da kommt wahrscheinlich eine Menge durcheinander.
Ich wünsche einen schönen Sonntag und guten Start in die kommende Woche.
Anzeige
AW: Tabellen per Makro generieren
10.04.2017 11:25:08
Dieter
Hallo Janiina,
das lässt sich alles machen, wie das so ist, wenn man mit VBA angefangen hat, die Wünsche werden immer größer. Es wird mir aber zu arbeitsintensiv. Ich denke du hast jetzt mindestens eine Grundlage, an der du weiterarbeiten kannst. Eine Alternative wäre, die Anfrage als nicht erledigt zu kennzeichnen.
Ich wünsche auf jeden Fall viel Erfolg
Dieter

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige