VBA Zeilen in andere Tab kopieren
Hallo zusammen,
ohne Eure Unterstützung will es einfach nicht funktionieren!!!
Suche in Tab1 Spalte D nach "K/E" (wenn gefunden) dann kopiere die Nummer aus Spalte A in Tab2 in die Spalte mit den ensprechenden Tagen (siehe Bild Tab2). Nummer "809306" in die Spalte >1000 Tage.
Next "K/E.
Alle "K/E" gefunden und kopiert, weiter mit "K/M" (siehe Tab 3)
Suche in Tab1 Spalte D nach "K/M" (wenn gefunden) dann kopiere die Nummer aus Spalte A in Tab3 in die Spalte mit den ensprechenden Tagen (siehe Bild Tab3). Nummer "801561" und "802277" in die Spalte 101 - 249 Tage.
Next "K/M.
Bild für die Erweiterung
Hier Bild Tab Extra 2
Ergebnis Code 2
ohne Eure Unterstützung will es einfach nicht funktionieren!!!
Suche in Tab1 Spalte D nach "K/E" (wenn gefunden) dann kopiere die Nummer aus Spalte A in Tab2 in die Spalte mit den ensprechenden Tagen (siehe Bild Tab2). Nummer "809306" in die Spalte >1000 Tage.
Next "K/E.
Alle "K/E" gefunden und kopiert, weiter mit "K/M" (siehe Tab 3)
Suche in Tab1 Spalte D nach "K/M" (wenn gefunden) dann kopiere die Nummer aus Spalte A in Tab3 in die Spalte mit den ensprechenden Tagen (siehe Bild Tab3). Nummer "801561" und "802277" in die Spalte 101 - 249 Tage.
Next "K/M.
Bild für die Erweiterung
Hier Bild Tab Extra 2
Ergebnis Code 2
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148030
Url: https://administrator.de/contentid/148030
Ausgedruckt am: 26.11.2024 um 17:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo matester!
Versuch es damit:
Da die Überschriften in den Zieltabellen für die Einordnung lt Tageanzahl nur bedingt auswertbar sind, habe ich die entsprechende Funktionaliltät (entsprechend der Vorlage gilt für jede der beide Zieltabellen die selbe Spaltenzuordnung) in der Zeile 26 mit Konstanten hinterlegt.
Ab Zeile 33 kann (derzeit nur angedeutet) auf die Tatsache reagiert werden, dass der "Berich" weder "K/E" noch "K/M" ist; falls solche Quellzeilen einfach zu ignorieren wären, müssten nur die Zeilen 32 und 33 entfernt werden.
Es wird vermutlich noch erforderlich sein, vorweg die Einträge ab Zeile 2 der Zieltabellen zu löschen, da die neuen Einträge immer unterhalb schon bestehendere Inhalte hinzugefügt werden. Eine passende Codezeile könnte im einfachsten Fall so aussehen:
Grüße
bastla
Versuch es damit:
Sub Zuordnen()
QTabelle = "Tab1"
QAbZeile = 2 'Daten ab Zeile 2 in
QSpalte = 1 'Spalte "A"
With Worksheets(QTabelle) 'Quelltabelle vorgeben
QZeile = QAbZeile 'in "AbZeile" beginnen
Nr = .Cells(QZeile, QSpalte).Value 'Nr auslesen
Do While Nr <> "" 'Schleife, solange noch Daten vorhanden sind
'Kennzeichen "Berich" prüfen und entsprechende Tabelle zuordnen
Berich = .Cells(QZeile, QSpalte + 3).Value
Select Case Berich
Case "K/E"
ZTabelle = "Tab2"
Case "K/M"
ZTabelle = "Tab3"
Case Else
ZTabelle = ""
End Select
If ZTabelle <> "" Then 'passendes Kennzeichen gefunden
Tage = Val(.Cells(QZeile, QSpalte + 2).Value) 'Tageanzahl lesen
'Zugeordnete Spalte lt Tageanzahl ermitteln
ZSpalte = Switch(Tage <= 100, "B", Tage < 250, "C", Tage <= 500, "D", Tage <= 750, "E", Tage <= 1000, "F", Tage > 1000, "G")
'Nächste freie Zelle in der entsprechenden Spalte suchen
ZZeile = Worksheets(ZTabelle).Cells(65536, ZSpalte).End(xlUp).Row + 1
Worksheets(ZTabelle).Cells(ZZeile, ZSpalte).Value = Nr 'Nr eintragen
Else ' passendes Kennzeichen nicht gefunden
MsgBox "Für Nr " & Nr & " (siehe Zeile " & QZeile & ") konnte keine Zuordnung zu einer Zieltabelle vorgenommen werden!"
'Exit Sub 'Abbruch
End If
QZeile = QZeile + 1 'nächste Datenteile
Nr = .Cells(QZeile, QSpalte).Value 'Nr auslesen
Loop
End With
MsgBox "Fertig."
End Sub
Ab Zeile 33 kann (derzeit nur angedeutet) auf die Tatsache reagiert werden, dass der "Berich" weder "K/E" noch "K/M" ist; falls solche Quellzeilen einfach zu ignorieren wären, müssten nur die Zeilen 32 und 33 entfernt werden.
Es wird vermutlich noch erforderlich sein, vorweg die Einträge ab Zeile 2 der Zieltabellen zu löschen, da die neuen Einträge immer unterhalb schon bestehendere Inhalte hinzugefügt werden. Eine passende Codezeile könnte im einfachsten Fall so aussehen:
Worksheets("Tab2").Range("A2:G65536").ClearContents
bastla
Hallo matester!
Die Fragen 1 und 3 (geht es hier um Anzahlen?) sind in der aktuellen Formulierung für mich leider nicht verständlich ...
Zu 2)
Das Gerüst zum Auslesen aller unterschiedlichen Einträge in Spalte D und Erstellen zugeordneter Tabellen könnte etwa so aussehen:
Für jeden unterschiedlichen Eintrag in Spalte D wird (falls noch nicht vorhanden) ein Tabellenblatt hinzugefügt und nach dem Eintrag benannt. Da "K/E" kein zulässiger Tabellenname ist, wird "/" durch "_" ersetzt. In weiterer Folge kann dann das erste Script oben so angepasst werden, dass die Zieltabelle direkt aus dem aus Spalte D ausgelesenen Kennzeichen ermittelt wird.
Kurz zu einem Teilaspekt meines Ansatzes:
Zum Sammeln aller unterschiedlichen Kennzeichen in einem String werden diese durch "#" (kann auch ein anderes, nicht in den Kennzeichen-Werten vorkommendes Zeichen sein) begrenzt hinzugefügt, sodass für das Beispiel mit "K/E", "K/M" und "K/L" nach dem Durchlaufen aller nicht-leeren Zellen in Spalte D (ab Zeile 2) der Inhalt der Variablen "Kennzeichen" "#K_E#K_M#K_L#" lauten würde (die "/" wurden bereits umgewandelt). Die Abgrenzung durch "#" nach beiden Seiten ist erforderlich, damit nicht Teilstrings gefunden und damit einzelne Werte ausgelassen werden - Beispiel: Wenn ein Kennzeichen "K_E2" bereits vorhanden wäre, würde bei einem einfachen Vergleich mit "K_E" das Ergebnis lauten: "schon vorhanden, wird nicht hinzugefügt"; wird aber "#K_E2#" mit "#K_E#" verglichen, gibt es keine Übereinstimmung.
Grüße
bastla
Die Fragen 1 und 3 (geht es hier um Anzahlen?) sind in der aktuellen Formulierung für mich leider nicht verständlich ...
Zu 2)
Das Gerüst zum Auslesen aller unterschiedlichen Einträge in Spalte D und Erstellen zugeordneter Tabellen könnte etwa so aussehen:
Sub Erstellen()
QTabelle = "Tab1"
QAbZeile = 2 'Daten ab Zeile 2 in
QSpalte = "D"
'Kennzeichen auslesen
Kennzeichen = "#" 'Variable vorbelegen, damit auch der erste Eintrag "links" abgegrenzt ist
With Worksheets(QTabelle) 'Quelltabelle vorgeben
QZeile = QAbZeile 'in "AbZeile" beginnen
K = .Cells(QZeile, QSpalte).Value 'Kennzeichen auslesen
Do While K <> "" 'Schleife, solange noch Daten vorhanden sind
If InStr(Kennzeichen, "#" & K & "#") = 0 Then 'noch nicht in den gesammelten Kennzeichen enthalten
Kennzeichen = Kennzeichen & Replace(K, "/", "_") & "#" 'aktuelles Kennzeichen hinzufügen (dabei "/" durch "_" ersetzen)
End If
QZeile = QZeile + 1 'nächste Datenteile
K = .Cells(QZeile, QSpalte).Value 'Kennzeichen auslesen
Loop
End With
'Tabellen erstellen
Kenn = Split(Mid(Kennzeichen, 2, Len(Kennzeichen) - 2), "#") 'Array erzeugen (vorweg die Begrenzungszeichen an Anfang und Ende eliminieren)
For Each SheetName In Kenn 'alle Kennzeichen durchgehen
IsNew = True 'Schalter; zeigt an, ob Tabellenblatt erstellt werden kann
For Each ExistingSheet In Worksheets 'alle bestehenden Tabellenblätter durchgehen und ...
If LCase(ExistingSheet.Name) = LCase(SheetName) Then '... überprüfen, ob ein gleichnamiges Blatt bereits vorhanden ist
IsNew = False 'Falls ja: Schalter setzen und ...
Exit For '... Überprüfung abbrechen
End If
Next
If IsNew Then 'Wenn Blatt mit dem geprüften Namen noch nicht vorhanden ist, ...
Set NewSheet = Worksheets.Add(After:=Sheets(Sheets.Count)) '... neues Tabellenblatt am Ende der Mappe hinzufügen und ...
NewSheet.Name = SheetName '... entsprechend benennen
End If
Next
Set NewSheet = Nothing
End Sub
Kurz zu einem Teilaspekt meines Ansatzes:
Zum Sammeln aller unterschiedlichen Kennzeichen in einem String werden diese durch "#" (kann auch ein anderes, nicht in den Kennzeichen-Werten vorkommendes Zeichen sein) begrenzt hinzugefügt, sodass für das Beispiel mit "K/E", "K/M" und "K/L" nach dem Durchlaufen aller nicht-leeren Zellen in Spalte D (ab Zeile 2) der Inhalt der Variablen "Kennzeichen" "#K_E#K_M#K_L#" lauten würde (die "/" wurden bereits umgewandelt). Die Abgrenzung durch "#" nach beiden Seiten ist erforderlich, damit nicht Teilstrings gefunden und damit einzelne Werte ausgelassen werden - Beispiel: Wenn ein Kennzeichen "K_E2" bereits vorhanden wäre, würde bei einem einfachen Vergleich mit "K_E" das Ergebnis lauten: "schon vorhanden, wird nicht hinzugefügt"; wird aber "#K_E2#" mit "#K_E#" verglichen, gibt es keine Übereinstimmung.
Grüße
bastla
Hallo bastla!
Den Teil mit dem Testen/Erstellen des jeweiligen Sheets, könnte man der Einfachheit halber auch so machen:
Gruß Dieter
Den Teil mit dem Testen/Erstellen des jeweiligen Sheets, könnte man der Einfachheit halber auch so machen:
'Snip......
For Each SheetName In Kenn
Set NewSheet = Nothing
On Error Resume Next: Set NewSheet = Sheets(SheetName): On Error GoTo 0
If NewSheet Is Nothing Then
Set NewSheet = Worksheets.Add(After:=Sheets(Sheets.Count)): NewSheet.Name = SheetName
End If
Next
'Snip......
Gruß Dieter
Hallo matester!
Ich nehme an, mit den Infos aus Deinem anderen Thread sind für Dich inzwischen alle 3 Teilbereiche lösbar - falls ja, könntest Du beide Beiträge als "erledigt" kennzeichnen ...
[Edit] Danke [/Edit]
Grüße
bastla
Ich nehme an, mit den Infos aus Deinem anderen Thread sind für Dich inzwischen alle 3 Teilbereiche lösbar - falls ja, könntest Du beide Beiträge als "erledigt" kennzeichnen ...
[Edit] Danke [/Edit]
Grüße
bastla