Microsoft Excel

Herbers Excel/VBA-Archiv

Daten_bereinigen

Betrifft: Daten_bereinigen von: Lammi
Geschrieben am: 10.08.2014 07:20:08

Hallo zusammen,

ich muss immer wieder größere Datenmengen bearbeiten.
In den Datensätzen habe ich aber häufig Daten die ich nicht benötige.

Diese Datenspalten oder auch Datenzeilen möchte ich mittels eines Makros löschen.
Basis ist ein Arbeitsblatt welches die Daten enthält und ein Arbeitsblatt welches die Merkmale der zu löschenden Datensätze aufführt.

Die Merkmale ob Zielen- oder Spaltenlöschung stattfindet habe ich im Arbeitsblatt : Daten_bereinigen ausgewiesen!

Alle Merkmale können an beliebiger Stelle stehen.

https://www.herber.de/bbs/user/91995.xlsx

Gruß
Lemmi

  

Betrifft: AW: Daten_bereinigen von: Hajo_Zi
Geschrieben am: 10.08.2014 07:41:12

wann steht ein wert in einer Zeile und wann in einer Spalte. Bei mir steht er immer in einer Zeile und auch in einer Spalte.

Gruß Hajo


  

Betrifft: AW: Daten_bereinigen von: Lammi
Geschrieben am: 10.08.2014 08:10:39

Hallo Hajo,

alle Merkmale die gelöscht werden sollen stehen im Arbeitsblatt Daten_bereinigen.
Beispiel: in A1 (Zeile) es wird aaa aufgeführt.
Beispiel: in B1 (Spalten) er wird Datenreihe10 aufgeführt.

Schritt 1:
Das Makro sucht zeilenweise die Daten ab und löscht die Zeile 12 ( mit aaa),13 (mit aaaa) und 18 (mit 100). die Datenreihe10 ist zu diesem Zeitpunkt nur teileweise gelöscht.
Schritt 2:
Im nächsten Arbeitsschritt wird Spaltenweise geprüft.
Spalte J (Datenreihe10) ist im Arbeitsbaltt Daten_bereinigen hinterlegt und soll dann vollständig
gelöscht werden.


Gruß
Lemmi


  

Betrifft: AW: Daten_bereinigen von: Spenski
Geschrieben am: 10.08.2014 08:25:08

Also meinst du Zelle und nicht zeile???

Gruss


  

Betrifft: meinen post nicht beachten owt. von: Spenski
Geschrieben am: 10.08.2014 08:30:29




  

Betrifft: AW: meinen post nicht beachten owt. von: Lammi
Geschrieben am: 10.08.2014 08:58:31

Hallo Spenski,

also wenn Zeile eine "falschen" Inhalt aufweist soll die Zeile gelöscht werden.

Gruß
Lemmi


  

Betrifft: noch mal überdenken? von: Erich G.
Geschrieben am: 10.08.2014 11:07:07

Hi La/emmi,
das ist nicht so ganz klar geworden.

Diese Daten seien mal vorgegebenen:

Daten

 ABCDE
1Datenreihe1Datenreihe2Datenreihe3Datenreihe4Datenreihe5
211111
32xxxxx2MMMMM2
433333


Daten_bereinigen

 AB
1ZeileSpalte
2xxxxxMMMMM


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

Dann wird beim zeilenweisen Bearbeiten xxxxx in Zeile 3 gefunden, und diese Zeile wird gelöscht.
Danach wird spaltenweise bearbeitet. MMMMM kann nicht gefunden werden - wurde ja gelöscht, also bleibt Spalte D ungelöscht. Soll dat?

Alternative: Vor dem Löschen der zu löschenden Zeilen wird geprüft, welche Spalten zu löschen sein werden.
Dann werden am Ende Zeile 3 und Spalte D gelöscht.

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: AW: noch mal überdenken? von: Lammi
Geschrieben am: 10.08.2014 12:12:23

Hallo Erich,

"....MMMMM kann nicht gefunden werden - wurde ja gelöscht, also bleibt Spalte D ungelöscht. Soll dat?"
Ja, das würde dann so sein.

Eine Sache die ich vielecht nicht bedacht habe!

Im Regelfall werden ich wohl in der Spalte nur Kopfzeilen hinterlegen, also müßte dies dann Datenreihe 4 unter Arbeisblatt Daten_bereinigen (Spalte) heißen!


Gruß
Lemmi


  

Betrifft: Codevorschlag von: Erich G.
Geschrieben am: 10.08.2014 12:30:23

Hi Lemmi,
probier das mal aus - da hast du alle Möglichkeiten, und alles wird gefunden:

Option Explicit

Sub SelektivLoeschen()
   Dim arLR, arLC, arQ, rr As Long, cc As Long, ii As Long, rngR As Range, rngC As Range
   
   With Sheets("Daten_bereinigen")
     arLR = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row)
     arLC = .Cells(1, 2).Resize(.Cells(.Rows.Count, 2).End(xlUp).Row)
   End With

   With Sheets("Daten")
      arQ = .Cells(1, 1).CurrentRegion
      For rr = 1 To UBound(arQ)
         For cc = 1 To UBound(arQ, 2)
            For ii = 1 To UBound(arLR)
               If Not IsEmpty(arLR(ii, 1)) Then
                  If arQ(rr, cc) = arLR(ii, 1) Then
                     If rngR Is Nothing Then
                        Set rngR = .Rows(rr)
                     Else
                        Set rngR = Union(rngR, .Rows(rr))
                     End If
                  End If
               End If
            Next ii
            For ii = 1 To UBound(arLC)
               If Not IsEmpty(arLC(ii, 1)) Then
                  If arQ(rr, cc) = arLC(ii, 1) Then
                     If rngC Is Nothing Then
                        Set rngC = .Columns(cc)
                     Else
                        Set rngC = Union(rngC, .Columns(cc))
                     End If
                  End If
               End If
            Next ii
         Next cc
      Next rr
   End With
   If Not rngR Is Nothing Then rngR.Delete
   If Not rngC Is Nothing Then rngC.Delete
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich und: Schönen Restsonntag noch!


  

Betrifft: AW: Codevorschlag von: Spenski
Geschrieben am: 10.08.2014 12:42:02

hallo erich

der code buggt noch wenn man bei spalte oder zeile nix einträgt

gruss


  

Betrifft: AW: Codevorschlag von: Lammi
Geschrieben am: 10.08.2014 15:46:43

Hallo Erich,

alles bestens!

Wie muss ich die Zeilen ändern wenn ich das aktive Arbeitsblatt ansprechen will
---
with Sheets("Daten")....

Gruß
Lammi


  

Betrifft: ActiveSheet und ohne Zeile/Spalte von: Erich G.
Geschrieben am: 10.08.2014 16:59:18

Hi zusammen,
hier habe ich das ActiveSheet (von dem ich abrate - da hat man sich schnell mal was
auf dem falschen Sheet zerschossen...) mal reingeschrieben.
Abgeprüft wird auch, ob in Zeile bzw. Spalte etwas steht:

Sub SelektivLoeschen2()
   Dim arLR, arLC, arQ, rr As Long, cc As Long, ii As Long, rngR As Range, rngC As Range
   
   With Sheets("Daten_bereinigen")
     arLR = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row)
     arLC = .Cells(1, 2).Resize(.Cells(.Rows.Count, 2).End(xlUp).Row)
   End With

   With ActiveSheet                          ' Sheets("Daten")
      arQ = .Cells(1, 1).CurrentRegion
      For rr = 1 To UBound(arQ)
         For cc = 1 To UBound(arQ, 2)
            If IsArray(arLR) Then
               For ii = 2 To UBound(arLR)
                  If Not IsEmpty(arLR(ii, 1)) Then
                     If arQ(rr, cc) = arLR(ii, 1) Then
                        If rngR Is Nothing Then
                           Set rngR = .Rows(rr)
                        Else
                           Set rngR = Union(rngR, .Rows(rr))
                        End If
                     End If
                  End If
               Next ii
            End If
            If IsArray(arLC) Then
               For ii = 2 To UBound(arLC)
                  If Not IsEmpty(arLC(ii, 1)) Then
                     If arQ(rr, cc) = arLC(ii, 1) Then
                        If rngC Is Nothing Then
                           Set rngC = .Columns(cc)
                        Else
                           Set rngC = Union(rngC, .Columns(cc))
                        End If
                     End If
                  End If
               Next ii
            End If
         Next cc
      Next rr
   End With
   If Not rngR Is Nothing Then rngR.Delete
   If Not rngC Is Nothing Then rngC.Delete
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: AW: ActiveSheet und ohne Zeile/Spalte von: Lammi
Geschrieben am: 13.08.2014 17:10:13

Hallo Erich,

vielen Dank für die Hilfe!

Ich habe das Makro eingesetzt udn festtellen müssen das ich eine erweiterte Abfragen!
Dazu eröffne ich einen neunen Beitrag.

Gruß
Lammi


  

Betrifft: AW: Daten_bereinigen von: Daniel
Geschrieben am: 10.08.2014 20:53:09

HI

wenn in den Daten keine Wahrheitswerte stehen und keine Formeln, dann probier mal das:

Sub test()
Dim Zelle As Range
Dim shD As Worksheet
Dim shDber As Worksheet
Set shD = Sheets("daten")
Set shDber = Sheets("Daten_bereinigen")

'--- Zeilen löschen
If shDber.Cells(2, 1).Value <> "" Then
    For Each Zelle In Range(shDber.Cells(2, 1), shDber.Cells(1, 1).End(xlDown))
        shD.Cells.Replace Zelle.Value, True, xlWhole
    Next
    On Error Resume Next
    shD.Cells.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
    On Error GoTo 0
End If

'--- Spalten löschen
If shDber.Cells(2, 2) <> "" Then
    For Each Zelle In Range(shDber.Cells(2, 2), shDber.Cells(1, 2).End(xlDown))
        shD.Rows(1).Replace Zelle.Value, True, xlWhole
    Next
    On Error Resume Next
    shD.Rows(1).SpecialCells(xlCellTypeConstants, 4).EntireColumn.Delete
End If
End Sub
Gruß Daniel


  

Betrifft: AW: Daten_bereinigen von: Lammi
Geschrieben am: 13.08.2014 17:11:34

Hallo Daniel,

vielen Dank für die Hilfe!

Ich habe das Makro eingesetzt und festtellen müssen, dass ich eine erweiterte Abfragen duchführen muss!
Dazu eröffne ich einen neunen Beitrag.

Gruß
Lammi