Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1604to1608
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
Inhaltsverzeichnis

Code durchführen ohne Sheet aktivieren

Code durchführen ohne Sheet aktivieren
30.01.2018 13:43:02
Burak
Moin Moin,
kann man aus Performance-Gründen folgenden Code auch durchführen ohne das Sheet zu aktivieren?

'Doppelte Einträge entfernen
Worksheets("Hilfstabelle").Activate
Range("B1").Select
Do Until ActiveCell.Value = ""
If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
ActiveCell.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
Freundliche Grüße
Burak Icel

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code durchführen ohne Sheet aktivieren
30.01.2018 14:08:16
Daniel
Hi
Generell muss man dazu vor jedem Zellbezug (Range, Rows, Columns, Cells) das Tabelenblatt mit angeben:
Sheets("Hilfstabelle").Range("B1")

Es darf nicht selektiert werden, sondern die Zellen müssen direkt bearbeitet werden.
Anstelle von ActiveCell muss man diese Zelle ggf in einer Variablen speichen und mit dieser arbeiten.
allerdings hast du hier dann das Problem, dass du dir ggf die Zeile mit der Variable löschst, daher solltest du dann bei doppelten Einträgen nicht die Zeile mit der Variable löschen, sondern die Zeile darunter:
für deinen Code in etwa so:
Sub test()
Dim Zelle As Range
Set Zelle = Sheets(1).Range("B1")
Do Until Zelle.Value = ""
If Zelle.Value = Zelle.Offset(1, 0).Value Then
Zelle.Offset(1, 0).EntireRow.Delete
Else
Set Zelle = Zelle.Offset(1, 0)
End If
Loop
End Sub
wobei es in deiner Excelversion auch eine Funktion zum löschen der Doppelten gibt:
Daten - Datentools - Duplikate entfernen
das würde als Code so aussehen:
Sheets("Hilfstabelle").Usedrange.RemoveDuplicates 2, xlguess

beachte, dass hierbei immer die erste Zeile von gleichen Zellen stehen bleibt.
dh wenn du willst, dass von den Duplikaten eine bestimmte Zeile erhalten bleibt, musst du dieses durch Sortieren an die erste Stelle bringen.
Gruß Daniel
Anzeige
AW: Code durchführen ohne Sheet aktivieren
30.01.2018 14:43:30
Burak
Beachte bitte, dass nicht alle Duplikate entfernt werden sollen! Nur wenn sie untereinander stehen.
Also wenn ich A1 und A3 derselbe Wert steht aber in A2 ein anderer, dann soll weder Zeile 1 noch Zeile 3 gelöscht werden.
Scheint aber in deinem mittleren Code im Post auch so zu sein!
Also danke!
AW: Code durchführen ohne Sheet aktivieren
30.01.2018 14:56:57
Werner
Hallo Burak,
wenn ich dich richtig verstanden habe dann so, ohne Schleife.
Public Sub Löschen()
Dim loLetzte As Long, loSpalte
With Worksheets("Tabelle1")
loLetzte = .Cells(.Rows.Count, 2).End(xlUp).Row
loSpalte = .Cells(2, .Columns.Count).End(xlToLeft).Column + 1
.Range(.Cells(2, loSpalte), .Cells(loLetzte, loSpalte)).FormulaLocal = _
"=WENN(B1=B2;0;ZEILE())"
.Range(.Cells(1, loSpalte), .Cells(loLetzte, loSpalte)).Value = _
.Range(.Cells(1, loSpalte), .Cells(loLetzte, loSpalte)).Value
.Cells(1, loSpalte) = 0
.Range(.Cells(1, 1), .Cells(loLetzte, loSpalte)).RemoveDuplicates _
Columns:=loSpalte, Header:=xlNo
.Columns(loSpalte).ClearContents
End With
End Sub
Gruß Werner
Anzeige
AW: Code durchführen ohne Sheet aktivieren
30.01.2018 15:13:03
Burak
Ja funktioniert auch super. Also sind Schleifen das wodurch die Performance leidet? Dein Code funktioniert etwas schneller als mit einer Schleife!
AW: Code durchführen ohne Sheet aktivieren
30.01.2018 15:19:24
Werner
Hallo Burak,
kommt natürlich immer auf die Datenmenge an. Bau mal noch ein Application.Screenupdating und Application.Calclulation = xlCalculationManual mit ein und teste noch mal. Da dürfte die Schleife auch etwas schneller sein.
Public Sub Löschen()
Dim loLetzte As Long, loSpalte
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("Tabelle1")
loLetzte = .Cells(.Rows.Count, 2).End(xlUp).Row
loSpalte = .Cells(2, .Columns.Count).End(xlToLeft).Column + 1
.Range(.Cells(2, loSpalte), .Cells(loLetzte, loSpalte)).FormulaLocal = _
"=WENN(B1=B2;0;ZEILE())"
.Range(.Cells(1, loSpalte), .Cells(loLetzte, loSpalte)).Value = _
.Range(.Cells(1, loSpalte), .Cells(loLetzte, loSpalte)).Value
.Cells(1, loSpalte) = 0
.Range(.Cells(1, 1), .Cells(loLetzte, loSpalte)).RemoveDuplicates _
Columns:=loSpalte, Header:=xlNo
.Columns(loSpalte).ClearContents
End With
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = False
End Sub
Gruß Werner
Anzeige
AW: Code durchführen ohne Sheet aktivieren
30.01.2018 15:30:53
Daniel
Hi
ja.
Das Problem ist folgendes:
Wenn du eine Excelzelle bearbeitest oder löschst, muss Excel eine Vielzahl von Aktionen ausführen.
Wenn du auf Schleifen verzichtest und die Zellen möglichst in einem Schritt bearbeitest, können diese Aktionen für alle bearbeiteten Zellen gemeinsam ausgeführt werden.
In der Schleife werden sie für jede Zelle wiederholt.
Beim Duplikate-Entfernen kommst zusätzlich hinzu, dass einige dieser Aktionen nicht durchgeführt werden, daher ist es sehr schnell und für große Datenmengen geeignet.
Gruß Daniel
AW: Code durchführen ohne Sheet aktivieren
30.01.2018 15:18:28
Daniel
HI
stimmt.
aber auch dann kannst du Duplikate-Entfernen nutzen, aber mit einem kleinen Zwischenschritt.
hierzu muss in eine Hilfsspalte am Tabellenende eine Formel, welche alle Zeilen, die gelöscht werden sollen mit einer 0 kennzeichnet und alle, die stehen bleiben müssen, mit der aktuellen Zeilennummer.
in die Überschriftenzeile (prinzipbedingt erforderlich) muss ebenfalls die 0
dann über DUPLIKATE ENTFERNEN alle Zeilen mit 0 in der Hilfsspalte löschen.
das geht auch als Makro:
With Sheets("Hilfstabelle").Usedrange
with .columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(RC2=R[1]C2,0,Row())"
.Cells(1, 1).Value = 0
.entirerow.RemoveDuplicates .column, xlno
.clearcontents
end with
End with
diese Methode ist schnell und einfach.
Du solltest sie dir merken, weil du sie im Prinzip für alle Aufgabenstellungen nach dem Prinzip:
Zeilenlöschen mit Bedingung
verwendet werden kann, du musst nur die Formel entsprechend anpassen.
Diese Methode kann man auch ohne VBA gut verwenden.
(Formel eintragen, nach unten ziehen, in die erste Zelle die 0, Duplikate entfernen)
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige