Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1180to1184
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

VBA Vergleich

VBA Vergleich
Günter
Liebe Excelfreunde,
habe euch zur Verdeutlichung meines Anliegens
eine Beispieldatei angehängt.
Hätte gerne per VBA, dass Spalte N in beiden Dateien abgeglichen
wird, und die Einträge, welche in "Alt" sind und nicht in "Neu"
in "Fehlende in Neu" geschrieben werden.
Hoffe, habe mich richtig rübergebracht.
Schönen Gruß
Günter
https://www.herber.de/bbs/user/71865.xls
AW: VBA Vergleich
12.10.2010 14:34:14
Peter
Hallo Günter,
das sollte z. B. so funktionieren:
Option Explicit
Public Sub Abgleich()
Dim WkSh_A    As Worksheet
Dim WkSh_N    As Worksheet
Dim WkSh_F    As Worksheet
Dim lZeile_A  As Long
Dim lZeile_F  As Long
Dim rZelle    As Range
   Application.ScreenUpdating = False
   
   Set WkSh_A = ThisWorkbook.Worksheets("Alt")
   Set WkSh_N = ThisWorkbook.Worksheets("Neu")
   Set WkSh_F = ThisWorkbook.Worksheets("Fehlende in Neu")
   
   lZeile_F = 12 ' die Start-Zeile in Fehlende in Neu minus 1
   
   For lZeile_A = 13 To WkSh_A.Cells(Rows.Count, 14).End(xlUp).Row
      With WkSh_N.Columns(14)
         Set rZelle = .Find(What:=WkSh_A.Range("N" & lZeile_A).Value, LookAt:=xlWhole, _
            LookIn:=xlValues)
         If rZelle Is Nothing Then
            lZeile_F = lZeile_F + 1
            WkSh_A.Rows(lZeile_A).Copy Destination:=WkSh_F.Rows(lZeile_F)
         End If
      End With
   Next lZeile_A
   
   Application.ScreenUpdating = True
End Sub
Gruß Peter
Anzeige
AW: VBA Vergleich
12.10.2010 14:39:39
Günter
Hallo Peter,
hast mir den Tag gerettet.
Funktioniert perfekt.
Vielen, vielen Dank.
Bevor ich eine Anfrage stellen, recherchiere ich natürlich
bei euch. Hier gab es viel Hilfestellung. War aber nicht
das Richtige dabei.
Schönen Gruß
Günter
AW: VBA Vergleich
18.10.2010 08:20:54
Günter
Hallo Peter,
Dein Makro läuft eigentlich am besten.
Habe für dieses Makro eine Datei mit ca. 80.000 Datensätzen.
Hierfür braucht das Makro 1,5 Stunden für den Abgleich.
Kann man da das Makro "beschleunigen"?
Schönen Gruß
Günter
For lZeile_A = 13 To WkSh_A.Cells(Rows.Count, 14).End(xlUp).Row
With WkSh_N.Columns(14)
Set rZelle = .Find(What:=WkSh_A.Range("N" & lZeile_A).Value, LookAt:=xlWhole, _
LookIn:=xlValues)
If rZelle Is Nothing Then
lZeile_F = lZeile_F + 1
WkSh_A.Rows(lZeile_A).Copy Destination:=WkSh_F.Rows(lZeile_F)
End If
End With
Next lZeile_A
Anzeige
AW: VBA Vergleich
12.10.2010 15:02:12
Tino
Hallo,
so schnell war ich mit meiner Version nicht fertig.
Sub Liste_Neu()
Dim ArrayAlt, ArrayNeu, ArrayTmp(), oDic As Object
Dim nCount As Long, lngCol As Long, lngRow As Long

Set oDic = CreateObject("Scripting.Dictionary")

With Tabelle1 'Alt 
 ArrayAlt = .Range("N13", .Cells(.Rows.Count, 14).End(xlUp)).Value2
 For nCount = 1 To Ubound(ArrayAlt)
    oDic(ArrayAlt(nCount, 1)) = 0
 Next nCount
 Erase ArrayAlt
End With

With Tabelle2 'Neu 
    ArrayNeu = .Range("A13", .Cells(.Rows.Count, 14).End(xlUp)).Value2
    Redim Preserve ArrayTmp(1 To Ubound(ArrayNeu, 2), 1 To Ubound(ArrayNeu))
    For nCount = 1 To Ubound(ArrayNeu)
        If Not oDic.exists(ArrayNeu(nCount, 14)) Then
            lngRow = lngRow + 1
            For lngCol = 1 To 14
                ArrayTmp(lngCol, lngRow) = ArrayNeu(nCount, lngCol)
            Next lngCol
        End If
    Next nCount
End With


With Tabelle3 'Fehlende in Neu 
    .Range("A13", .Cells(.Rows.Count, 14)).ClearContents
    If lngRow > 0 Then
        Redim Preserve ArrayTmp(1 To Ubound(ArrayTmp), 1 To lngRow)
        ArrayTmp = Application.Transpose(ArrayTmp)
        
        With .Range("A13").Resize(lngRow, Ubound(ArrayTmp, 2))
            .Cells = ArrayTmp
            .EntireColumn.AutoFit
        End With
    End If
End With

End Sub
Gruß Tino
Anzeige
AW: VBA Vergleich
13.10.2010 06:56:19
Günter
Guten Morgen Tino,
vielen Dank. Bin schon fast am Testen....
Gruß
Günter
AW: VBA Vergleich
13.10.2010 15:22:14
Günter
Hallo Tino,
so. Bekomme beim Test Fehlermeldung:
Laufzeitfehler '9'.
Index außerhalb des gültigen Bereichs in der Zeile:
With .Range("A13").Resize(lngRow, UBound(ArrayTmp, 2))
Hast Du eine Idee ?
Gruß
Günter
wenn Deine Datei anders ist wie Beispiel?
13.10.2010 15:54:00
Tino
Hallo,
in Deiner Datei funktioniert es, wenn Deine anders aufgebaut ist muss der Code angepasst werden.
https://www.herber.de/bbs/user/71903.xls
Gruß Tino
AW: wenn Deine Datei anders ist wie Beispiel?
13.10.2010 18:34:36
Günter
Guten Abend Tino,
vielleicht habe ich Makro auch verkehrt aufgebaut.
Probiere Dein Beispiel.
Danke und Gruß
Günter
Anzeige
AW: wenn Deine Datei anders ist wie Beispiel?
14.10.2010 07:09:58
Günter
Hallo Tino,
bekomme in der Zeile
"ArrayTmp = Application.Transpose(ArrayTmp)" Teil die Fehlermeldung: "Laufzeitfehler "13". Typen unverträglich".
Hast Du hierzu einen Tip?
Zusatz: Kopiere zum Abgleich die alte Datei und kopiere in "Alt"
und das Gleiche mach ich mit der neuen Datei für das Blatt "Neu".
Das Merkwürdige ist, einmal klapp es und bei der nächsten Abgleichsgeschicht (also neu Dateien)
funktioniert es nicht mehr.
Gruß
Günter
AW: wenn Deine Datei anders ist wie Beispiel?
14.10.2010 08:15:49
Tino
Hallo,
könnte funktionieren.
Sub Liste_Neu()
Dim ArrayAlt, ArrayNeu, ArrayTmp(), oDic As Object
Dim nCount As Long, lngCol As Long, lngRow As Long

Set oDic = CreateObject("Scripting.Dictionary")

With Tabelle1 'Alt 
 ArrayAlt = .Range("N13", .Cells(.Rows.Count, 14).End(xlUp)).Value2
 For nCount = 1 To Ubound(ArrayAlt)
    oDic(ArrayAlt(nCount, 1)) = 0
 Next nCount
 Erase ArrayAlt
End With

With Tabelle2 'Neu 
    ArrayNeu = .Range("A13", .Cells(.Rows.Count, 14).End(xlUp)).Value2
    Redim Preserve ArrayTmp(1 To Ubound(ArrayNeu, 2), 0 To Ubound(ArrayNeu))
    For nCount = 1 To Ubound(ArrayNeu)
        If Not oDic.exists(ArrayNeu(nCount, 14)) Then
            lngRow = lngRow + 1
            For lngCol = 1 To 14
                ArrayTmp(lngCol, lngRow - 1) = ArrayNeu(nCount, lngCol)
            Next lngCol
        End If
    Next nCount
End With


With Tabelle3 'Fehlende in Neu 
    .Range("A13", .Cells(.Rows.Count, 14)).ClearContents
    If lngRow > 0 Then
        Redim Preserve ArrayTmp(1 To Ubound(ArrayTmp), 0 To lngRow)
        ArrayTmp = Application.Transpose(ArrayTmp)
        With .Range("A13").Resize(lngRow, Ubound(ArrayTmp, 2))
            .Cells = ArrayTmp
            .EntireColumn.AutoFit
        End With
     .Select
    End If
End With

End Sub
Gruß Tino
Anzeige
AW: wenn Deine Datei anders ist wie Beispiel?
14.10.2010 08:55:16
Günter
Hallo Tino,
danke für Deine Mühe, kommt immer noch die gleiche
Fehlermeldung.
Denke, etwas passiert beim Kopieren und Einfügen
in "Alt" und "Neu".
Dein Beispiel läuft ohne Probleme, aber sobald ich meine
Daten einfüge, kommt die Fehlermeldung.
Gruß
Günter
AW: wenn Deine Datei anders ist wie Beispiel?
14.10.2010 09:04:51
Tino
Hallo,
na lade mal einfach solch ein Beispiel hoch wo es Probleme gibt,
vielleicht finde ich den Fehler oder den unterschied.
Gruß Tino
AW: wenn Deine Datei anders ist wie Beispiel?
14.10.2010 09:23:57
Günter
Hallo Tino,
kann leider keine Inhalt mitgeben, da sensible Daten.
Aber Du siehst, dass in einem weiteren Modul u.a.
2 Spalten kopiert werden und in Spalte N und O eingefügt
werden. Darauf hin werden Spalte N und O zusammengefügt.
Schönen Gruß
Günter
https://www.herber.de/bbs/user/71910.xls
Anzeige
AW: wenn Deine Datei anders ist wie Beispiel?
14.10.2010 09:30:40
Tino
Hallo,
sorry, damit kann ich nicht viel anfangen.
Wenn es sensible Daten sind ersetze diese durch andere, es muss nur das Problem bestehen bleiben.
Gruß Tino
AW: wenn Deine Datei anders ist wie Beispiel?
14.10.2010 10:10:23
Günter
Hallo Tino,
ist zum Verzweifeln.
Jedesmal, wenn ich die sensiblen Daten durch "Testdaten" ersetze,
funktioniert es wieder, also Dein Makro funktioniert dann super.
Denk mir, irgendwo gibt es ein Formatproblem.
Gruß
Günter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige