Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
904to908
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
904to908
904to908
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zellen zwischen 2 gleichen Zellen löschen

Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 19:07:35
Moritz
Hallo!
Ich habe eine Liste, wo in der ersten Spalte Namen für Produkte drin stehen und in den Spalten C und D sind Werte eingetragen. Bei jedem Produkt steht einmal oben der Name und einmal ganz unten dazwischen sind leere Zellen. In der Zeile, wo der Name des Produktes zum zweiten Mal erscheint, wird eine Summe gebildet. Es kann auch sein, dass nur ein einziges Mal ein Name drin steht, dann soll daran gar nichts gemacht werden.
Nun bräuchte ich eine Formel oder ein Makro, was die Excel-Datei durchsucht nach 2 gleichen Namen und die Zeilen vom "1." Namen bis zur letzten Zeile über der dem "2." Namen löscht.
Das Ergebnis sollte so aussehen, dass ich nur noch einmal den Namen in der Excel-Liste drin stehen habe und immer nur den "2." Namen
Kann mir vielleicht jemand helfen?
Vielen Dank schon eimal!
Moritz

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 19:13:00
Nico
vielleicht so ? das habe ich aus den Tutorials, dann mußt Du ihm nur noch sagen, daß er den zweiten Namen behalten soll... Gruß Nico

Sub Filtern()
With ActiveSheet.UsedRange
.Sort Key1:=Range("A2"), Order1:=xlDescending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
.AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Cells(1, .Columns.Count + 1), _
Unique:=True
.EntireColumn.Delete
End With
Columns.AutoFit
End Sub


AW: Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 19:26:20
Moritz
Danke für die schnelle Antwort, aber es ist leider nicht ganz was ich suche, weil das Makro einmal nicht die Namen um sortieren darf und weil es auch einfach alle Spalten durchsucht und nicht nur Spalte A.

Anzeige
AW: Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 19:43:00
Daniel
Hallo
probier mal das Makro. es macht folgendes:
1. es löscht alle Zeilen, die in Spalte A eine Leerzelle haben
2. es löscht alle Zeilen, in denen ein mehrfachvorkommender Produktname zum ersten Mal vorkommt.
das entspricht hoffentlich deinen anforderungen.
damit es richtig funktioniert, darf ein Produktname aber maximal 2x in der Liste vorkommen (muss also eindeutig sein)

Sub test()
Columns(1).Insert
With Range("a2:A" & Cells(65536, 2).End(xlUp).Row)
.FormulaR1C1 = "=IF(OR(AND(COUNTIF(R1C2:RC[1],RC[1])=1,COUNTIF(C[1],RC[1])=2),RC[1]=""""), _
TRUE,ROW())"
.Formula = .Value
.CurrentRegion.Sort , key1:=Range("A2"), order1:=xlAscending, header:=xlYes
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
.EntireColumn.Delete
End With
End Sub


Gruß, Daniel
ps. damit das Marko funktioniert, musst du nach dem Kopieren in Makroeditor in der Zeile mit
.formular1c1="..." die Zeichen Leerzeichen-Unterstrich("_")-Zeilenumbruch entfernen, sonst gibts wahrsscheinlich ne Fehlermeldung.

Anzeige
AW: Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 19:52:00
Daniel
Hi
so wie ich gerade gelesen habe hat deine Liste keine Überschriftenzeile
ich hab mein Makro aber so geschreiben, wie wenn es eine hätte, weils normalerweise so üblich ist
ohne Überschrift musst du das Makro so abändern:

Sub test()
Columns(1).Insert
With Range("a1:A" & Cells(65536, 2).End(xlUp).Row)
.FormulaR1C1 = "=IF(OR(AND(COUNTIF(R1C1:RC[1],RC[1])=1,COUNTIF(C[1],RC[1])=2),RC[1]=""""),  _
_
TRUE,ROW())"
.Formula = .Value
.CurrentRegion.Sort , key1:=Range("A1"), order1:=xlAscending, header:=xlNo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
.EntireColumn.Delete
End With
End Sub


Gruß, Daniel
noch ein Hinweis: die Spalte B sollte nicht leer sein, sonst gehts auch nicht (zumidest in der ersten Zeile sollte ein Wert drinstehen)

Anzeige
AW: Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 20:03:03
Moritz
Hey Daniel,
super Makro! Funktioniert klasse, auch wenn ich kurz gedacht habe, dass mein Excel gerade crashed, weil es soooo lange zum rechnen gebraucht hat ;-). Sind halt knapp 25.000 Zeilen. Eine klitze kleines Problem habe ich aber noch, weil ich kann es irgendwie nicht in mein Ursprungsmakro einbauen, was vorher alles passieren soll. Ich habe mal ganz unten hingeschrieben wo ich es gerne hätte.

Sub auto_open()
Dim optCalcMode As Long
Dim nRowsCnt    As Long
Dim nRow        As Long
'ggf. Laufwerk und Ordner als Vorgabe setzen
ChDrive ActiveWorkbook.Path
ChDir ActiveWorkbook.Path
'Das Dialogfenster
dateiname = Application.GetOpenFilename _
(" Alle Dateien (*.*), *.*,Micrsoft Excel-Dateien (*.xls),*.xls,")
If dateiname  False Then
ActiveWorkbook.Activate
On Error Resume Next
Workbooks.OpenText Filename:=dateiname, Origin:=xlWindows _
, StartRow:=8, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(  _
_
1, 1), Array(14, 1), Array(18, 1), Array(40, 1), Array(58, 1), _
Array(62, 1), Array(80, 1), Array(86, 1), Array(93, 1)), _
TrailingMinusNumbers:=True
'Sortieren der Daten
Columns("H:H").Select
Selection.Delete Shift:=xlToLeft
Columns("F:F").Select
Selection.Delete Shift:=xlToLeft
Columns("D:D").Select
Selection.Delete Shift:=xlToLeft
Columns("A:A").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Select
ActiveCell.FormulaR1C1 = "Uo"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Stelle"
Range("C1").Select
ActiveCell.FormulaR1C1 = "Dm"
Range("D1").Select
ActiveCell.FormulaR1C1 = "Dat"
Else
End If
'Löschen von leeren und unnützen Zeilen
With Worksheets(1)
If Application.WorksheetFunction.CountA(.Cells) > 0 Then
optCalcMode = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
nRowsCnt = .Cells.Find(What:="*", _
After:=.Range("A1"), SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row - 1
For nRow = nRowsCnt + 1 To 1 Step -1
Application.StatusBar = "Bearbeite Zeile " & nRow
If Application.WorksheetFunction.CountA( _
.Rows(nRow).EntireRow) = 0 Then
.Rows(nRow).EntireRow.Delete
End If
If Range("A" & nRow).Value = "WP-KENNUNG" Then
.Rows(nRow).EntireRow.Delete
End If
If Range("A" & nRow).Value = "------------" Then
.Rows(nRow).EntireRow.Delete
End If
If Range("E" & nRow).Value = "DEP-ART" Then
.Rows(nRow).EntireRow.Delete
End If
If Range("B" & nRow).Value = "****" Then
.Rows(nRow).EntireRow.Delete
End If
If Range("C" & nRow).Value = "" Then
.Rows(nRow).EntireRow.Delete
End If
If Range("D" & nRow).Value = "" Then
.Rows(nRow).EntireRow.Delete
End If
If Range("E" & nRow).Value = "0" Then
.Rows(nRow).EntireRow.Delete
End If
Next nRow
HIER SOLL ES EINGEBAUT WERDEN
'Worksheet umformatieren
Cells.Select
Cells.EntireColumn.AutoFit
Application.Calculation = optCalcMode
Application.ScreenUpdating = True
Range("A1").Select
End If
End With
ENDE:
Application.StatusBar = ""
End Sub


Anzeige
AW: Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 20:13:09
Daniel
Hi
das mit den 25.000 Zeilen hättest du erwähnen sollen, denn bei der Datenmenge sind einige Lösungsansätze nicht mehr praktiabel.
normalerweise ist mein Lösungsansatz einer der schellsten.
Bremser ist in diesem Fall die Zählenwenn-Funktion, die ja 250000x 250000 Zeilen prüfen muss.
hier könnte man sich aber noch was anderes einfallen lassen (vielleicht die Leerzeilen vorher löschen)
um den Speed zu erhöhen.
sorry, aber jetzt geh ich ins Wochenende.
das mit dem Einbauen in dein Makro solltest du schon selber hinbekommen, schließlich bist du ja dafür verantwortlich das alles läuft und du musst es warten und pflegen können!
Gruß, Daniel

Anzeige
need for speed
08.09.2007 02:06:00
Daniel
Hi
wenn dir mein Makro zu langsam ist, probier mal das hier.
wenn die Daten so aufgebaut sind, wie ich es verstanden habe. müsste es um einiges schneller sein.

Sub test()
Columns(1).Insert
With Range("a1:A" & Cells(65536, 2).End(xlUp).Row)
.FormulaR1C1 = "=IF(RC[1]="""",TRUE,ROW())"
.Formula = .Value
.CurrentRegion.Sort , key1:=Range("A1"), order1:=xlAscending, header:=xlNo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
With Range("a1:A" & Cells(65536, 2).End(xlUp).Row)
.FormulaR1C1 = "=IF(RC[1]=R[1]C[1],TRUE,ROW())"
.Formula = .Value
.CurrentRegion.Sort , key1:=Range("A1"), order1:=xlAscending, header:=xlNo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
.EntireColumn.Delete
End With
End Sub


Gruß, Daniel

Anzeige
AW: need for speed
08.09.2007 16:16:00
Moritz
Hallo Daniel,
kann es sein, dass im ersten Teil deines Makros die Zeilen gelöscht werden, wo in Spalte A nichts drinsteht? Wenn es so ist, dann hatte ich bereits weiter oben in meinem Makro einfach eine zusätzliche IF-Schleife eingebaut um diese Zellen zu löschen, aber vielen Dank!
Kannst Du mir noch sagen, wie ich in einer Spalte ab der 2. Zeile eine Formel vom Makro reinschreiben lasse bis zum Ende meiner Tabelle? Und zwar folgende Formel:
= TEILERGEBNIS ( 9 ; Die beiden Spalten davor )
Wie kann ich vom Makro die Zeilen noch formatieren lassen, damit die Zahlen #.##0,00 so aussehen in der Spalte und bedingt formatiert sind Rot kleiner als 0 größer Grün?
Vielen Dank!
Moritz

Anzeige
AW: need for speed
08.09.2007 17:36:13
Daniel
HI
ja, ich hab im ersten Teil meines Codes die Leerzeilen gelöscht, damit ich im 2. Teil nicht mehr Zählenwenn verwenden muss, sondern ne schnellere Formel nehmen kann, weil dann ja beide Paare direkt untereinander stehen.
wie du ne per Makro ne Formel in Zellen reinschreibst, siehst du ja in meinem Makro, das macht ja diese Zeile (hier für die Spalte A, beginnend mit Zelle A2 bis zur letzten Zeile der Tabelle, diese wird in Spalte B bzw 2 ermittelt.):
Range("a2:A" & Cells(65536, 2).End(xlUp).Row).FormulaR1C1 = "Deine Formel"
Wie der Text für "Deine Formel" lauten muss, bekommst du am besten so raus:
1. Formel ganz normal an der richtigen Stelle in Excel von Hand eintragen (so kann man sie auch gleich testen)
2. die Zelle mit der Formel markieren und in den VBA-Editor ins Direkt-Fenster wechseln.
3. dort eintippen: ?selection.formular1c1
4. du erhälst den Formeltext in internationaler Schreibweise und im Z1S1-Format
5. diesen Formeltext trägst du dann im Makro für "Deine Formel" ein.
6. wenn der Formeltext Anführungszeichen enthält, müssen diese im Makrocode verdoppelt werden, damit Excel weiß, dass sie zur Formel gehören und nicht das Ende eines Teilstrings sind.
Beispiel:
Anzeige der Formel: =IF(RC[-2]="","Leerzelle","Wert vorhanden")
Schreibweise im code: .FormulaR1C1 = "=IF(RC[-2]="""",""Leerzelle"",""Wert vorhanden"")"
den Rest deiner Fragen bekommst du beantwortet, wenn du die Aktionen mal durchführst, und dabei den Makrorekorder mitlaufen lässt.
Du kannst den so erzeugten Code zwar sicherlich nicht 1:1 verwenden, aber du siehst, wie die Befehle aussehen und welche Parameter du setzen kannst.
Gruß, Daniel

Anzeige
AW: need for speed
08.09.2007 17:45:33
Moritz
Hey!
Danke für die Antwort. Ich werde es jetzt mal alles probieren =)!
Viele Grüße
Moritz

AW: Zellen zwischen 2 gleichen Zellen löschen
07.09.2007 19:44:00
Moritz
Vielleicht noch eine Sache die Namen sind Alphabetisch von A bis Z in Spalte A sortiert. Also wenn das Makro in A1 einen Namen findet und den 2. gleichen Namen dazu sucht braucht es immer nur so weit suchen bis es einen anderen Namen findet und dann soll es mit dem neuen Namen weiter suchen usw...

249 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige