Excel VBA

Hallo Thomas,
hier die Auflösung (dabei ist allerdings zu beachten, dass die Quelle richtig sortiert sein muss - erst nach Telefonnummer + darin dann nach ID, weil das Makro nicht selbst ermittelt, welches die niedrigste ID ist, sondern nur die Zeile stehen lässt, die er zuerst findet + alle restlichen Dublikate rausschmeißt):

Sub DoppelteAde()
Dim arr As Variant
Dim Dic As Object
Dim i As Long

Set Dic = CreateObject(„Scripting.Dictionary“)

With Worksheets(„Quelle“) 'ANPASSEN
arr = .Range(„A1:B“ & .Cells(.Rows.Count, 1).End(xlUp).Row)
End With

For i = 1 To UBound(arr)
If arr(i, 2) „“ Then
If Not Dic.Exists(arr(i, 2)) Then
Dic(arr(i, 2)) = arr(i, 1)
End If
End If
Next

With Worksheets(„Ziel“) 'ANPASSEN
If Dic.Count > 0 Then
.Range(„A1“).Resize(Dic.Count) = _
TransposeDim(Dic.Items)
.Range(„B1“).Resize(Dic.Count) = _
TransposeDim(Dic.Keys)
End If
End With
End Sub

Private Function TransposeDim(v As Variant) As Variant
Dim i As Long
Dim tempArray As Variant
Debug.Print Join(v, „,“)
ReDim tempArray(1 To UBound(v) + 1, 1 To 1)
For i = 0 To UBound(v)
tempArray(i + 1, 1) = v(i)
Next
TransposeDim = tempArray
End Function

LG von Dani
P.S.: Vielen Dank noch mal für deine Mühe: Ohne dich hätten wir die Lösung nicht gefunden !!!

Sub DoppelteInSpalteBLöschen()


’ Prozedure am 15.07.2009 von Schwarz H.-J. erstellt

Dim i As Integer
Dim j As Integer
Dim erster
Dim zweiter

Range(„B2“).Select
'zuerst mal sortieren
'nach Größe der Nummer in Spalte 2
ActiveSheet.UsedRange.Sort Key1:=Range(„B1“), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
'jetzt die doppelten finden und löschen
i = Cells(65536, 2).End(xlUp).Row
For j = 2 To i
zweiter = Cells(j, 2).Value
Debug.Print zweiter
erster = Cells(j - 1, 2).Value
Debug.Print erster
If zweiter = erster And erster „“ Then
Debug.Print Cells(j, 2)
Rows(j).Delete
i = i - 1
j = j - 1
End If

Next j

’ und wieder nach der Größe in Spalte 1 ordnen
Range(„A1“).Select
ActiveSheet.UsedRange.Sort Key1:=Range(„a1“), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

End Sub
das hier ist eine neue Lösung, die ich mir f+ür Dich ausgedacht hatte, leider konnte ich aber erst heute mailen. Sorry, dasss gedauert hat - aber vielleicht hilft es dir: übrigens, ne Lösung für access habe ich auch.

Jürgen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Jürgen,
danke für deine Mühe!
Ich habe jetzt auch dein Makro probiert, aber er bringt mir Laufzeitfehler 1004: Anwendungs- oder objektdefinierter Fehler.
Beim Debuggen marktiert er diese Zeilen:

ActiveSheet.UsedRange.Sort Key1:=Range(„B1“),
Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

LG von Dani

Sub GleicheEinträgeInSpalteBLöschen()

’ Löscht gleiche Einträge in Spalte B, egal wie oft der Eintrag vorhanden ist;
’ läßt die mit der kleinsten Nummer in A stehen;
’ ordnet danach in Spalte A aufsteigend
’ getestet auf Excel 2003;
’ Prozedure am 15.07.2009 von Schwarz H.-J. erstellt
’ Verweise: VisualBasicForApplications,MicrosoftExcel11.0,OLEAutomation,MicrosoftOffice11.0

Dim i As Integer
Dim j As Integer
Dim erster
Dim zweiter

Range(„B2“).Select
'zuerst mal sortieren
'nach Größe der Nummer in Spalte 2
'dann liegen die doppelten Einträge genau hintereinander
ActiveSheet.UsedRange.Sort Key1:=Range(„B1“), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
'jetzt die doppelten finden und löschen
'funktioniert auch bei mehreren gleichen Eintragungen, nicht nur bei doppelten
i = Cells(65536, 2).End(xlUp).Row
For j = 2 To i
zweiter = Cells(j, 2).Value
’ Debug.Print zweiter
erster = Cells(j - 1, 2).Value
’ Debug.Print erster
If zweiter = erster And erster „“ Then
’ Debug.Print Cells(j, 2)
Rows(j).Delete
i = i - 1
j = j - 1
End If

Next j

’ und wieder nach der Größe in Spalte 1 ordnen
Range(„A1“).Select
ActiveSheet.UsedRange.Sort Key1:=Range(„a1“), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

End Sub

Hallo Dani,

ich habe es gerade noch mal überarbeitet und getestet; bei mir läuft es einwandfrei, löscht auch mehrere gleiche Eintragungen. Vielleicht schaust du mal oben (neue Fassung) nach, ob du alle verweise gesetzt hast.
Achtung: In Spalte a und Spalte b müssen die Eintragungen sein! Zelle B2 muß gefüllt sein!
Grüße

jürgen

PS: Bin gerade dabei, in Access das Tool herauszusuchen. Da hatte ich es schon mal geschrieben (getestet für Internetprojekt, bei dem ca. 50000 neue Eintragungen/ Stunde kamen)

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Daniela,
ich gehe davon aus, dass du noch nicht Excel2007 benutzt, in den früheren Versionen gibt es ein LIMIT für die Transpose-Funktion von 5461 Einträgen. Du solltest also die Transpose-Funktion nachbilden. Hier mal ein Beispiel:

Public Function ArrayTransponieren(ByVal Arr As Variant) As Variant
Dim vDaten As Variant
Dim lIndex1 As Long, lIndex2 As Long
ReDim vDaten(LBound(Arr, 2) To UBound(Arr, 2), LBound(Arr, 1) To UBound(Arr, 1))
For lIndex1 = LBound(Arr, 1) To UBound(Arr, 1)
For lIndex2 = LBound(Arr, 2) To UBound(Arr, 2)
vDaten(lIndex2, lIndex1) = Arr(lIndex1, lIndex2)
Next lIndex2
Next lIndex1
ArrayTransponieren = vDaten
End Function

Diesen Code einfach hinter Deinem o.g. Code anfügen und statt „WorksheetFunction.Transpose“ einfach „ArrayTransponieren“ verwenden.

Beste Grüße
Gerd

Vielen Dank, Gerd, für deine Hilfe !!!

Hallo Bodo,
wie kann ich sie dir schicken - gibt es hier irgendwo die
Möglichkeit einen Anhang beizufügen?
LG von Dani

Liebe Dani,
sende bitte eine mail mit Anhang an die Adresse [email protected]. Dann sehen wir weiter!
Gruß
Bodo

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

Hallo Daniela!

Die Fehlermeldung bedeutet, dass dein Makro aus Excel etwas ausließt und diese Information in eine Variable (Platzhalter) packt. Hierbei passt die Information nicht in die Variable und deshalb gibt es die Meldung.
Z.B. Aus der Zelle wird eine Zahl ausgelesen, aber die Variable ist als Zeichen definiert - das für zu solch einer Fehlermeldung.

Außerdem sind 40000 Datensätze noch nicht viel. Das Problem wird sein, dass ungefähr nach 5000 Datensätzen der Fehler zu suchen ist.

D.h., du hast nach deiner Datenübernahme irgendwo ab dem 5000sten Datensatz falsche Zeichen enthalten, die dein Makro nicht richtig lesen kann.

Wenn du den VBA-Editor kennst, dann könntest du mit einer kleinen Zählschleife, die z.B. nach dem 4999 Datensatz hält und dir die Möglichkeit gibt das Makro zeilenweise für die nachfolgenden Datensätze zu durchlaufen. Somit würdest du dann auf den Fehler stoßen.

Vielleicht bekommst du es hin oder du hast es schon - ich war ein paar Tage nicht da, deshalb meine späte Antwort. Wenn du aber noch Hilfe brauchst, dann bräuchte ich die Datensätze (?), um es selber zu testen.

Gruß Ersin.

//+++++++++++++++++++++++++++++++++++++++++++++++++++

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Grüezi Daniela

Danke für die Rückmeldung und fein, dass ihr weiter dran geblieben seid! :smile:

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Jürgen,
hast du es denn schon gefunden?
LG von Dani

PS: Bin gerade dabei, in Access das Tool herauszusuchen. Da
hatte ich es schon mal geschrieben (getestet für
Internetprojekt, bei dem ca. 50000 neue Eintragungen/ Stunde
kamen)

Hallo Dani,

ganz herzlichen Dank für die lösung des Problems. Ich habe heute noch einmal angefangen, darüber nachzudenken und habe dann erst Deine zweite email gesehen. Da unser Keller im juli voll Wasser gelaufen ist, bin ich überhaupt nicht mehr dazu gekommen, mich um anderesw zu kümmern. Jetzt ist aber wieder alles ok. klasse, dass du eine lösung gefunden hast.
liebe Grüße
bodo