Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Tracking-Analyse
#21
Hey,

Ja genau also das ist zwar noch nie passiert, aber schadet ja nicht das zu berücksichtigen. :)
Antworten Top
#22
Hallöchen,

hier ist jetzt erst mal der nächste Stand. Ist noch nicht 100% - siehe Hinweis mit der Verrechnung der leeren Zeilen - , aber ich mach jetzt erst mal Schluss für heute und bei Bedarf morgen weiter.

Modul Modul3
Sub Makro2() 
'Variablendeklarationen 
'Long 
Dim lLRow&, lLCol&, lRowDiff& 
    'Mit dem aktiven Blatt 
    With ActiveSheet 
      'erst mal in Spalte A und B Leerzeichen entfernen 
      .Columns(1).Replace What:=" ", Replacement:="", LookAt:=xlPart 
      .Columns(2).Replace What:=" ", Replacement:="", LookAt:=xlPart 
      'erste zu kopierende Datenspalte aktivieren 
      .Cells(1, 5).Activate 
      'Solange in der aktiven Zelle Daten stehen 
      Do While ActiveCell.Value <> "" 
        'letzte belegte zelle in Spalte B feststellen (zum spaeteren Einfuegen) 
        lLRow = .Cells(Rows.Count, 2).End(xlUp).Row 
        lLCol = ActiveCell.Column 
        'eventuelle Leerzeichen entfernen - scheinbar leere Zellen haben alle eins ... 
        .Range(ActiveCell.Resize(.UsedRange.SpecialCells(xlCellTypeLastCell).Row, 3).Address).Replace What:=" ", Replacement:="", LookAt:=xlPart 
        'differenz zwischen erster Datenzeile und letzter Datenzeile des vorigen Bereiches 
        'Hinweise: 
        'Zeile 2 muss dabei ab 2. Reihe leer sein 
        'Eventuell sind noch Zeilenkorrekturen noetig. 
        lRowDiff = .Cells(1, lLCol).End(xlDown).Row - .Cells(Rows.Count, lLCol - 3).End(xlUp).Row 
        'Wenn vorige Spalte länger ist als aktuelle, dann nur von oben aus gehen 
        If lRowDiff < 0 Then 
          lRowDiff = .Cells(1, lLCol).End(xlDown).Row - 1 
        Else 
          lRowDiff = .Cells(Rows.Count, lLCol - 3).End(xlUp).Row + 1 
        End If 
        'sicherheitshalber nachschauen, ob was zu tun ist - anhand nicht leerer Zellen 
        If WorksheetFunction.Subtotal(103, .Range(ActiveCell.Resize(.UsedRange.SpecialCells(xlCellTypeLastCell).Row, 3).Address)) > 3 Then 
          'sichtbare Zellen im Datenbereich kopieren 
          .Range(ActiveCell.Offset(lRowDiff).Resize(.Cells(Rows.Count, lLCol).End(xlUp).Row - lRowDiff, 3).Address).SpecialCells(xlVisible).Copy 
          'und an Spalte B (und C und D) anhaengen 
          .Cells(lLRow + 1, 2).PasteSpecial Paste:=xlPasteValues 
        'Ende sicherheitshalber nachschauen, ob was zu tun ist - anhand nicht leerer Zellen 
        End If 
        'naechste Zelle aktivieren - 3 Spalten weiter 
        Cells(1, lLCol).Offset(0, 3).Activate 
      'Ende Solange in der aktiven Zelle Daten stehen 
      Loop 
   'Ende Mit dem aktiven Blatt 
   End With 
End Sub 
 

.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#23
Huhu,

das sieht schon sehr gut aus, aber ja es scheint tatsächlich noch ein paar Problemchen zu geben. Mir ist aufgefallen, dass viele Leerzeilen richtig übernommen wurden aber auch einmal statt 6 Leerzeilen nur 5 kopiert wurden und teilweise wurden auch welche noch nicht übernommen. Der Feierabend sei dir selbstverständlich mehr als gegönnt, ich bin froh, dass es überhaupt schon so gut läuft
Antworten Top
#24
Hallöchen,

anbei der nächste Versuch. Die Zeilenzahl sollte jetzt passen.

Mir ist allerdings wieder ein Sonderfall eingefallen. Wenn eine oder mehrere Reihen leer sind, werden bei der nächsten Reihe mit Daten alle Leerzeilen über den Daten kopiert, außer der Zeile 2 und ohne Rücksicht darauf, wo das Ende irgendwo bei der letzten Reihe weiter links war.

Sub Makro2()
'Variablendeklarationen 
'Long 
Dim lLRow&, lLCol&, lRowDiff&
    'Mit dem aktiven Blatt 
    With ActiveSheet
      'erst mal in Spalte A und B Leerzeichen entfernen 
      .Columns(1).Replace What:=" ", Replacement:="", LookAt:=xlPart
      .Columns(2).Replace What:=" ", Replacement:="", LookAt:=xlPart
      'erste zu kopierende Datenspalte aktivieren 
      .Cells(1, 5).Activate
      'Solange in der aktiven Zelle Daten stehen 
      Do While ActiveCell.Value <> ""
        'letzte belegte zelle in Spalte B feststellen (zum spaeteren Einfuegen) 
        lLRow = .Cells(Rows.Count, 2).End(xlUp).Row
        lLCol = ActiveCell.Column
        'eventuelle Leerzeichen entfernen - scheinbar leere Zellen haben alle eins ... 
        .Range(ActiveCell.Resize(.UsedRange.SpecialCells(xlCellTypeLastCell).Row, 3).Address).Replace What:=" ", Replacement:="", LookAt:=xlPart
        'differenz zwischen erster Datenzeile und letzter Datenzeile des vorigen Bereiches 
        'Hinweise: 
        'Zeile 2 muss dabei ab 2. Reihe leer sein 
        'Eventuell sind noch Zeilenkorrekturen noetig. 
        lRowDiff = .Cells(1, lLCol).End(xlDown).Row - .Cells(Rows.Count, lLCol - 3).End(xlUp).Row
        'Wenn vorige Spalte länger ist als aktuelle, dann nur von oben aus gehen 
        If lRowDiff < 0 Then
          lRowDiff = .Cells(1, lLCol).End(xlDown).Row - 1
        Else
          lRowDiff = WorksheetFunction.Max(3, .Cells(Rows.Count, lLCol - 3).End(xlUp).Row)
        End If
        'sicherheitshalber nachschauen, ob was zu tun ist - anhand nicht leerer Zellen 
        If WorksheetFunction.Subtotal(103, .Range(ActiveCell.Resize(.UsedRange.SpecialCells(xlCellTypeLastCell).Row, 3).Address)) > 3 Then
          'sichtbare Zellen im Datenbereich kopieren 
          .Range(ActiveCell.Offset(lRowDiff).Resize(.Cells(Rows.Count, lLCol).End(xlUp).Row - lRowDiff, 3).Address).SpecialCells(xlVisible).Copy
          'und an Spalte B (und C und D) anhaengen 
          .Cells(lLRow + 1, 2).PasteSpecial Paste:=xlPasteValues
        'Ende sicherheitshalber nachschauen, ob was zu tun ist - anhand nicht leerer Zellen 
        End If
        'naechste Zelle aktivieren - 3 Spalten weiter 
        Cells(1, lLCol).Offset(0, 3).Activate
      'Ende Solange in der aktiven Zelle Daten stehen 
      Loop
   'Ende Mit dem aktiven Blatt 
   End With
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • lpterritory
Antworten Top
#25
Du bist ein Held :18:  Es klappt jetzt alles richtig, soweit ich das beurteilen kann. Mir ist allerdings aufgefallen, dass ganz am Anfang nicht der erste Wert aus Zeile 3 genommen wird, sondern irgendwie erst aus Zeile 4 (das ist allerdings nur bei der ersten kopierten Reihe dann so), aber da muss man wahrscheinlich nur irgendwo ein -1 in den Code einfügen oder?

Zu dem Sonderfall: Also das dürfte soweit eigentlich niemals auftreten denke ich, da das Programm bewusst die Koordinaten fortlaufend in unterschiedlichen Spalten nach unten hin anordnet. Es kann höchstens mal sein, dass die ersten 8-9 Spalten leer sind und der erste Wert, dann bei Spalte 10 beginnt, aber das scheint der Code ohnehin zu beachten :)

Ich danke dir wirklich vielmals für alles!!!
Antworten Top
#26
Hallöchen,

in der Zeile

lRowDiff = WorksheetFunction.Max(3, .Cells(Rows.Count, lLCol - 3).End(xlUp).Row)

musst Du aus der Max(3 eine Max(2 machen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • lpterritory
Antworten Top
#27
Hallöchen,

Ahh das war es! Jetzt funktioniert es soweit perfekt. Ich wollte jetzt im nächsten Schritt dann die Werte die drüber stehen löschen, sodass dann die kopierten Werte direkt bei Zeile 3 beginnen. Ich habe mir dafür überlegt, dass ja alle Zeilen gelöscht werden müssten, bei denen in Spalte A eine Zahl steht. Dafür habe ich dann folgenden Code, aber irgendwie scheint der nicht so richtig zu funktionieren. Ist da vielleicht ein Fehler drin?

Code:
Option Explicit

Sub Zeilen_löschen()
Dim letzte_Zeile As Long, Wiederholungen As Long
letzte_Zeile = ActiveSheet.UsedRange.Rows.Count
For Wiederholungen = 3 To letzte_Zeile
If Cells(Wiederholungen, 1) <> "" Then
Rows(Wiederholungen).ClearContents
End If
Next
On Error Resume Next
Range(Cells(1, 1), Cells(letzte_Zeile, 1)).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Merkwürdigerweise werden dann alle Zeilen gelöscht und nicht nur die, wo in Spalte A Zahlen sind.
Antworten Top
#28
Hallöchen,

Das Problem ist wohl, dass Du keine leeren Zellen hast. Da stehen Leerzeichen drin, deswegen auch der entsprechende Teil in meinem Code zum Entfernen selbiger.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#29
Hab es jetzt mal sowohl manuell versucht, indem ich die Zeilen mit den vermutlichen Leerzeichen einmal gelöscht habe, sowie mit dem Code aus deinem Makro, habe das allerdings auf alle Spalten bezogen. Doch irgendwie werden immer noch alle Zeilen ab 3 gelöscht.

Habs auch mal mit einer kleinen Beispieltabelle ausprobiert da wird auch alles gelöscht, ich muss da wohl wirklich einen Fehler in meinem Code haben, denke ich
Antworten Top
#30
Hallöchen,

wenn Deine Tabelle so aussieht wie das Muster, dass Du gepostet hast, ist das normal. Da werden die Zeilen 3 bis 829 gelöscht, weil dort in Spalte A etwas steht. Wenn Du zuerst alles kopierst und anschließend die Zeilen löschst, sollte es doch passen?
Geht übrigens auch anders und schneller, aber dazu später. Soll ja das richtige schneller gehen und nicht das falsche Smile
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


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