84 Aufrufe
Gefragt in Windows 10 von
Hallo miteinander,

ich stecke noch etwas in Kinderschuhen mit VBA, habe durch googlen schon ein paar Dinge heraussgefunden. Jedoch bin ich auf der Suche nach einer einfachen Abfrage. Folgendes:

alle paar Wochen bekomme ich mehrere aktualisierte Listen mit Namen, Vornamen und Klasse. Ich würde gerne eine VBA Abfrage machen, die 2-3 Tabellenblätter durchsucht, und eine aktualisierte Liste in einer Tabelle erstellt.

Die Tabellen sehen wie folgt aus:

Spalte B - Name

Spalte C - Vorname   

Spalte G - Klasse

das Selbe gibt es dann noch auf einem weiteren Tabellenblatt.

Jetzt sollte die Abfrage alle nötigen Tabellenblätter durchsuchen, und auf einem neuen Tabblatt eine Tabelle erstellen, sortiert nach Prio 1: Klasse, dann Nachname, dann Vorname

Jedoch hätte ich gerne in folgender Formatierung:

Spalte B - Klasse

Spalte C - Name

Spalte D - Vorname

Wäre ein Traum, wenn mir da jemand helfen könnte, sonst ist das jedesmal ein wenig mühsam.

Liebe Grüße Andy

4 Antworten

0 Punkte
Beantwortet von m-o Profi (21.9k Punkte)

Hallo Andy,

kopiere das folgende Makro in ein Standard-Modul deiner Arbeitsmappe. Bevor du das Makro ausprobierst, musst die Namen der Tabellen, die in der betreffenden Arbeitsmappe sind, im Makro anpassen. Wenn z.B. alle Tabelle in der Arbeitsmappe durchlaufen werden sollen, kann man das entsprechend einfacher machen.

Für die Liste wird automatisch ein neues Tabellenblatt angelegt.

Sub liste()
Dim strListe As String
Dim arrDaten As Variant
Dim arrTabellen As String
Dim t As Long
Dim i As Long
Dim lngLetzte As Long
Dim lngZeile As Long
Dim bExists As Boolean
Dim Antwort

'Tabellenblätter definieren, aus denen die Gesamtliste erstellt werden soll
'Namen anpassen
arrListe = Array("Tabelle2", "Tabelle3")

'Name für Übersichtsliste erstellen
If Month(Now) < 10 Then
  strName = "Liste " & Year(Now) & "-0" & Month(Now) & "-" & Day(Now)
 Else
  strName = "Liste " & Year(Now) & "-" & Month(Now) & "-" & Day(Now)
End If

'Prüfen, ob Tabellenblatt für Übersichtsliste bereits besteht
For i = 1 To ThisWorkbook.Worksheets.Count
  If ThisWorkbook.Worksheets(i).Name = strName Then
    'Marker, dass Tabellenblatt existiert
    bExists = True
    'Schleife verlassen
    Exit For
  End If
Next i
 
'Falls Tabellenblatt noch nicht existiert, dann Tabellenblatt erstellen
If bExists = True Then
  'Fragen was passieren soll
  Antwort = MsgBox("Achtung! Die Tabelle " & strName & " existiert bereits! Soll die Liste neu erstellt werden?", 36, "Liste existiert schon")
  If Antwort = vbNo Then
       'Makro beenden, falls liste nicht neu erstellt werden soll
       Exit Sub
    Else
        Application.DisplayAlerts = False             'keine Nachfrage anzeigen
        Worksheets(strName).Delete                    'vorhandenes Arbeitsblatt löschen
        Application.DisplayAlerts = True              'Nachfrage wieder aktivieren
  End If
End If
        
Worksheets.Add Before:=Worksheets(1)          'Arbeitsblatt vor dem ersten Blatt einfügen
With ActiveSheet
  .Name = strName                    'Arbeitsblatt benennen
  'Überschriften erstellen
  .Range("B1") = "Klasse"
  .Range("C1") = "Name"
  .Range("D1") = "Vorname"
  'Überschriften formatieren
  With .Range("B1:D1")
     .Font.Bold = True   'Fett
     .HorizontalAlignment = xlCenter  'zentriert
  End With
End With
   
'erste Einfügezeile für die Liste festlegen
lngZeile = 2

'Tabellenblätter mit den zu kopierenden Daten durchlaufen
For t = 0 To UBound(arrListe)               'Zählung fängt hier bei Null an
  With ThisWorkbook.Worksheets(arrListe(t))
    lngLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
    'Array Redimensionieren
    ReDim arrDaten(lngLetzte - 1, 7)  'ohne 1. Zeile und Spalten A - G
    'Daten aus Tabellenblatt einlesen
    arrDaten = .Range("A2:G" & lngLetzte)
  End With
  'Daten in Gesamtliste eintragen
  With ThisWorkbook.Worksheets(strName)
    'Array mit Daten aus Arbeitsblatt durchlaufen
    For i = 1 To UBound(arrDaten, 1)
      .Cells(lngZeile, 2) = arrDaten(i, 7)    'Spalte B = Klasse
      .Cells(lngZeile, 3) = arrDaten(i, 2)    'Spalte C = Name
      .Cells(lngZeile, 4) = arrDaten(i, 3)    'Spalte D = Vorname
      lngZeile = lngZeile + 1                 'Zähler für Einfügezeile erhöhen
    Next i
  End With
Next t

'Nun die Daten sortieren
With ThisWorkbook.Worksheets(strName)
  .Sort.SortFields.Clear
  .Sort.SortFields.Add Key:=Range("B2:B" & lngZeile - 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  .Sort.SortFields.Add Key:=Range("C2:C" & lngZeile - 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  .Sort.SortFields.Add Key:=Range("D2:D" & lngZeile - 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
   With .Sort
        .SetRange Range("B1:D" & lngZeile - 1)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End With

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von
Hallo M.O.

enstschuldige die lange Zeit meiner Rückmeldung. Grandios was du gemacht hast. Vielen Dank.

Eine Frage bzw. Ergänzung bräuchte ich noch:

Ich bräuchte eine Abfrage die ich konfigurieren kann und zwar:

aus besagten Listen soll eine neue erstellt werden, wenn in Spalte "I", bzw. "J", bzw "K" bzw. "L". bzw. "M" ein "A" oder "B" oder "B+" oder "G" (oder Kombinationen aus allem) steht.

Also der Sinn ist, Kinder melden sich für Baustein "A" am Montag (Spalte "I") an, diese sind in einer langen Liste gemischt mit allen anderen Infos. Jetzt will ich aus dieser Liste eine Liste erstellen, mit allen "A"-Kindern Montags. Das natürlich dann auch mit Baustein "B" etc.

Wäre ein Traum, wenn du mir dabei nochmal helfen könntest.

Gruß Andy
0 Punkte
Beantwortet von m-o Profi (21.9k Punkte)

Hallo Andy,

könntest du mal eine kleine Beispieldatei - natürlich ohne echte Daten - zur Verfügung stellen, in der du auch vielleicht mal darstellst, wie das Ergebnis aussehen soll? Wie du eine Beispieldatei hier hochladen kannst, kannst du hier nachlesen: Beschreibung

Gruß

M.O.

0 Punkte
Beantwortet von

https://supportnet.de/forum/?qa=blob&qa_blobid=681031268572918950

Also folgende zwei Funktionen benötigen ich:

1. einmal aus beiden Tabellenblättern kombiniert eine automatische Erstellung neuer Listen nach Klassen. Also je Klassenstufe eine Tabelle (sortiert nach Vornamen).

2. aus der Tabelle "GTS Betr. (2022-23)" eine Abfrage aller Kinder, die z.B. montags (Spalte "I") Baustein B ("B") gebucht haben. das für jeden Tag einzeln, und jede Bausteinkombination (A, B, AB, B+, G, GB, etc.)

Ich hoffe, das ist so etwas klarer. Ich dank dir schon mal!

Gruß Andy

...