mit Makro bestimmte Zeilen übertragen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: mit Makro bestimmte Zeilen übertragen
von: Patrick
Geschrieben am: 27.11.2015 11:28:10

Hallo,
ich stehe vor folgender Aufgabe:
Mit einem Makro soll das erste Tabellenblatt nach Datumseinträgen in der Spalte M abgesucht werden. Das Datum wird in Form von TT.MM.JJJJ eingetragen. Die gefundenen Zeilen sollen dann ausgeschnitten werden und in das Tabellenblatt 2 fortlaufend eingefügt werden.
Vorraussetzungen:
1. Nur die Werte sollen übertragen werden, keine Formeln.
2. Spalte A ist in beiden Tabellen mit fortlaufenden Nummern gefüllt. Diese sollen unbeachtet bleiben.
3. Die "freien" Zeilen im Tabellenblatt 1 sollen dann verschwinden, die Tabelle sich also zusammenziehen, dass keine freien Zeilen zu sehen sind.
Kann mich hier jemand unterstützen?
MfG

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Werner
Geschrieben am: 27.11.2015 14:32:18
Hallo Patrick,
versuch mal das hier.

Public Sub Zeile_mit_Datum()
Dim wsQuelle As Worksheet
Dim wsZiel As Worksheet
Dim letzteQuelle As Long
Dim letzteZiel As Long
Dim vorhanden As Boolean
Dim x As Long
vorhanden = False
Set wsQuelle = Sheets("Tabelle1") 'Quellblatt anpassen
Set wsZiel = Sheets("Tabelle2") 'Zielblatt anpassen
letzteQuelle = wsQuelle.Cells(Rows.Count, 13).End(xlUp).Row 'letzte belegte Zeile in Spalte M  _
ggf. anpassen
letzteZiel = wsZiel.Cells(Rows.Count, 13).End(xlUp).Row + 1 'erste freie Zeile in Spalte M ggf.  _
anpassen
With wsQuelle
For x = letzteQuelle To 2 Step -1 'Prüfung bis Zeile 2, da angenommen in Zeile 1 Überschriften  _
ggf. anpassen
If IsDate(Cells(x, 13)) Then
wsZiel.Cells(letzteZiel, 1).Resize(, 13).Value = .Cells(x, 1).Resize(, 13).Value 'Übertägt  _
Spalte A bis Spalte M ggf. anpassen
.Cells(x, 1).Resize(, 13).Delete xlUp 'löscht im Quellblatt von Spalte A bis Spalte M ggf.  _
anpassen
letzteZiel = letzteZiel + 1
vorhanden = True
End If
Next x
End With
If vorhanden = False Then
MsgBox "Es gibt keine Datensätze mit " & vbLf & "einem Datum in Spalte M." _
& vbLf & vbLf & "Es wurden keine Daten kopiert!!", , "Hinweis für " & Environ("UserName")
End If
End Sub
Übertragen werden von Tabelle1 die Daten in den Spalten A bis M ins Tabellenblatt2 Spalte A bis M, wenn im Tabellenblatt1 in Spalte M ein Datum eingetragen ist.
Gruß Werner

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Patrick
Geschrieben am: 27.11.2015 15:36:15
Hallo Werner,
erstmal Danke für deine Hilfe. Da ich mich aber nicht so gut mit Makros auskenne...könntest du mir einen Gefallen tun und die Textteile in deinem Script markieren, die nicht im Makro drin stehen sollen? Also die, die als Erklärung dienen? Das wäre super.

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Werner
Geschrieben am: 27.11.2015 15:58:54
Hallo Patrick,
das kann alles so in ein Modul. Meine Erklärungen habe ich aus kommentiert, die machen keine Probleme. Das siehst du daran, dass der Text im Modul in Grün erscheint.
Das einzige was du vielleicht noch machen mußt ist die Zeilenumbrüche wie der raus zu machen (siehst du am Unterstrich). Die setzt die Forums Software nämlich selbst.
Gruß Werner

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Patrick
Geschrieben am: 02.12.2015 13:23:46
Hallo,
besten Dank. Funktioniert bestens.
Nun soll ich aber noch drei weitere Tabellenblätter einfügen, die genau so aussehen, wie das erste. Auch aus diesen sollen nun alle Zeilen mit Eintrag in Spalte M in die "finished"-Datei rübergezogen werden. Wie muss ich das bestehende Makro anpassen? Momentan sieht das Makro wie folgt aus:

Public Sub Zeile_mit_Datum()
unprotectSheets
  Dim wsQuelle As Worksheet
  Dim wsZiel As Worksheet
  Dim letzteQuelle As Long
  Dim letzteZiel As Long
  Dim vorhanden As Boolean
  Dim x As Long
  vorhanden = False
  Set wsQuelle = Sheets("Day to Day Business open")
  Set wsZiel = Sheets("finished actions")
  letzteQuelle = wsQuelle.Cells(Rows.Count, 13).End(xlUp).Row
  letzteZiel = wsZiel.Cells(Rows.Count, 13).End(xlUp).Row + 1
  With wsQuelle
  For x = letzteQuelle To 6 Step -1
  If IsDate(Cells(x, 13)) Then
  wsZiel.Cells(letzteZiel, 2).Resize(, 13).Value = .Cells(x, 2).Resize(, 13).Value
  .Cells(x, 2).Resize(, 13).Delete xlUp
  letzteZiel = letzteZiel + 1
  vorhanden = True
  End If
  Next x
  If vorhanden = False Then
  MsgBox "No finished action was" & vbLf & "found in the list." _
  & vbLf & vbLf & "No data transmitted!!", , "Hinweis für " & Environ("UserName")
  End If
  End With
  protectSheets
End Sub

Public Sub unprotectSheets()
Dim Tabellenblatt As Worksheet
For Each Tabellenblatt In ThisWorkbook.Sheets
Tabellenblatt.Unprotect "bla"
Next Tabellenblatt
End Sub

Public Sub protectSheets()
Dim Tabellenblatt As Worksheet
For Each Tabellenblatt In ThisWorkbook.Sheets
Tabellenblatt.Protect "bla"
Next Tabellenblatt
End Sub


Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Werner
Geschrieben am: 02.12.2015 17:36:45
Hallo Patrick,
das sind ein paar Infos zu wenig. Soll das Makro über alle Blätter laufen ausgenommen das Blatt in das die Daten geschrieben werden? Da könnte man dann eine Schleife über alle Blätter laufen lassen, außer dem Zielblatt.
Wenn nicht, könnte man die Namen der entsprechenden Tabellenblätter in ein Array aufnehmen und die Schleife über das Array laufen lassen. Geht aber auch nur wenn die Blattnamen gleich bleiben und nicht geändert werden.
Gruß Werner

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Werner
Geschrieben am: 02.12.2015 19:42:06
Hallo Patrick,
hab mal was gebastelt, ist aber nicht getestet, hab es nur kurz am Tablet geklimpert (hab ehrlich gesagt keinen Bock mehr jetzt noch meine Kiste anzuwerfen). Kann also nicht garantieren, dass es funktioniert.

Public Sub Zeile_mit_Datum()
 unprotectSheets
   Dim wsZiel As Worksheet
   Dim letzteQuelle As Long
   Dim letzteZiel As Long
   Dim vorhanden As Boolean
   Dim x As Long
   Dim i AS Long
   vorhanden = False
   Set wsZiel = Sheets("finished actions")
   letzte Ziel = wsZiel.Cells(Rows.Count, 13).End(xlUp).Row + 1
   For i = 2 To 5 'Blätter 2, 3, 4 und 5 an deine Bedürfnisse anpassen
   With Sheets(i)
   letzteQuelle = .Cells(Rows.Count, 13).End(xlUp).Row
   For x = letzteQuelle To 6 Step -1
   If IsDate(Cells(x, 13)) Then
   wsZiel.Cells(letzteZiel, 2).Resize(, 13).Value = .Cells(x, 2).Resize(, 13).Value
   .Cells(x, 2).Resize(, 13).Delete xlUp
   letzteZiel = letzteZiel + 1
   vorhanden = True
   End If
   Next x
   Next i
   If vorhanden = False Then
   MsgBox "No finished action was" & vbLf & "found in the list." _
   & vbLf & vbLf & "No data transmitted!!", , "Hinweis für " & Environ("UserName")
   End If
   End With
   protectSheets
 End Sub
Über die Variable i spreche ich die Blätter über ihren INDEX an. Das hat weder was mit dem zu tun, was auf dem Tabellenblattreiter steht. Wenn du im VBA-Projektexplorer oben links Schausteller dann stehen da u.a. die Tabellenplätze die es im Workbook gibt. Da steht dann z.B. Tabelle1 (Tabelle1) oder aber auch
Tabelle1 (DeinTabellenblattnamen) wenn du die Tabelle umbenannt hast. Das was vor der Klammer steht ist der interne Indexname des Tabellenblattes.
Derzeit sollten (wenn es denn funktioniert) die Daten aus den Blättern 2-3-4-5 gezogen werden. Blatt 1 und ggf. weitere Blätter bleiben außen vor.
Das müsstest du hält an deine Bedürfnisse anpassen. For i = 2 To 5 (Blatt 2,3,4,5)
For i = 3 To 4 (Blatt 3,4)
Gruß Werner

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Patrick
Geschrieben am: 02.12.2015 22:44:22
Hallo Werner,
ich bin dir so dankbar für deine Hilfe und ich komm mir selbst blöd vor, dass ich soviel fragen muss. Aber nur so lerne ich was.
Ich habe dein Makro eingearbeitet. Nur leider kommt eine Fehlermeldung: "Fehler beim Kompilieren. Next ohne For" und hervorgehoben wird die Zeile "Next i".
Ich bin jetzt mal so frei und füge die Blanko-Datei mal ein. Vielleicht hilft das ja bei der Fehlersuche.
Ich hoffe, du nimmst es mir nicht übel, dass ich schon wieder nerve :-(
https://www.herber.de/bbs/user/101977.xlsm
Gruß Patrick

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Patrick
Geschrieben am: 02.12.2015 22:48:13
Hallo Werner,
ich bin dir so dankbar für deine Hilfe und ich komm mir selbst blöd vor, dass ich soviel fragen muss. Aber nur so lerne ich was.
Ich habe dein Makro eingearbeitet. Nur leider kommt eine Fehlermeldung: "Fehler beim Kompilieren. Next ohne For" und hervorgehoben wird die Zeile "Next i".
Ich bin jetzt mal so frei und füge die Blanko-Datei mal ein. Vielleicht hilft das ja bei der Fehlersuche.
Ich hoffe, du nimmst es mir nicht übel, dass ich schon wieder nerve :-(
https://www.herber.de/bbs/user/101977.xlsm
Gruß Patrick

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Werner
Geschrieben am: 03.12.2015 11:23:35
Hallo Patrick,
so sollte es funktionieren.
### Wichtig: Das Blatt "finished action" muss zwingend das letzte Blatt sein!!!! ###
Warum kann ich dir auch nicht sagen. Eigentlich müsste das egal sein, weil ich die Blätter über ihren Code Namen anspreche. Trotzdem funktioniert es nicht, wenn das Blatt "finished action" nicht das letzte Blatt ist.
Ich hoffe du kannst damit leben. Du solltest halt nur aufpassen wenn weitere Blätter dazu kommen.
Beispiel: Du hast insgesamt 8 Blätter. Der Code soll sich aber nur auf die Blätter 1-6 auswirken. Dann im Code die Zeile For i = 1 To 4 ändern in For i = 1 To 6. Die Blätter 7 und 8 müssen dann aber zwingend die beiden letzten Blätter sein.
https://www.herber.de/bbs/user/101986.xlsm
Gruß Werner

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Werner
Geschrieben am: 03.12.2015 11:57:01
Hallo Patrick,
hab noch was vergessen. Deinen Code im Workbook bevor close habe ich fürs testen komplett aus kommentiert. Da musst du die Aus Kommentierung wieder raus machen.
Gruß Werner

Bild

Betrifft: AW: mit Makro bestimmte Zeilen übertragen
von: Patrick
Geschrieben am: 03.12.2015 12:05:43
Hi Werner,
genau so. Ich weiß nicht, wie ich dir danken soll. Du hast mir wirklich sehr geholfen.
Und ich werd mich jetzt noch mehr mit Makros auseinander setzen, damit ich es besser verstehe
und dazu lerne. Wird aber noch eine Weile dauern, bis ich das so lockern aus dem Ärmel zaubern kann
wie du.
Danke nochmals.
Gruß Patrick

Bild

Betrifft: AW: Danke für die Rückmeldung.
von: Werner
Geschrieben am: 03.12.2015 13:06:32
Hallo Patrick,
gerne doch. Aber das mit dem locker aus dem Ärmel schütteln siehst du falsch. Bin in Bezug auf VBA selbst noch ein Anfänger. Das Eine oder Andere weiß ich in Grundzügen. Für den Rest bemühe ich hier im Forum gerne die Recherche.
Dann viel Erfolg noch.
Gruß Werner

 Bild

Beiträge aus den Excel-Beispielen zum Thema "mit Makro bestimmte Zeilen übertragen"