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

Datenabgleich über zwei Spalten

Datenabgleich über zwei Spalten
Sinan
Guten Morgen miteinander,
ich habe ein Problem beim Abgleich von Daten und weiss leider nicht mehr weiter… ich habe geringe VBA-Kenntnisse, und kann nur vermuten, dass mein Problem mit einem Array-Konstrukt funktionieren kann.
Die Aufgabe ist eine Tabelle X mit ca. 5000 Werten mit etwa 300 Tabellen abzugleichen, in welchen immer nur eine Teilmenge von Tabelle X vorhanden ist und Daten aus Tabelle X zu übernehmen. Alle Dateien befinden sich im gleichen Verzeichnis.
Folgende Ausgangssituation:
1x Tabelle X mit Spalten A, B, C und 5000 Zeilen (Bestandsliste), alle drei Spalten alphanumerisch
300x Tabellen Y mit Spalte A, B, C und unterschiedlicher Anzahl Zeilen, alle drei Spalten alphanumerisch
Der Wert in Spalte C in Tabelle Y soll immer mit dem Wert aus Spalte C in Tabelle X ersetzt werden, wenn der Match zutrifft.
Wenn
Wert in TabelleY.SpalteA = Wert in TabelleX.SpalteA UND Wert in TabelleY.SpalteB = Wert in TabelleX.SpalteB
Dann
Wert TabelleY.SpalteC = Wert in TabelleX.SpalteC
Sonst
Nächster Wert bzw. nichts…
Hat jemand eine Idee? Wäre echt superhilfreich…
Sinan

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Datenabgleich über zwei Spalten
24.08.2012 10:35:06
Josef

Hallo Sinan,
Verständnisfrage: Mit TabelleX/Y meinst du wohl DateiX/Y, oder?
Auf welchem Tabellenblatt (Name) stehe die Daten in DateiY, auf welchem in DateiX?

« Gruß Sepp »

AW: Datenabgleich über zwei Spalten
24.08.2012 11:05:26
Sinan
Hallo Sepp,
ich habe es wohl doch nicht so gut erklärt, wie ich dachte :(. Danke aber für das schnelle Feedback :)
Mit Tabelle meine ich tatsächlich Datei X und Datei(en) Y. Auch ist in beiden Dateien immer das Tabellenblatt namens "Tabelle 1" betroffen. So etwa?
Für alle DateienY in Verzeichnis
Wenn
Wert in DateiY.Tabelle1.SpalteA = Wert in DateiX.Tabelle1.SpalteA UND
Wert in DateiY.Tabelle1.SpalteB = Wert in DateiX.Tabelle1.SpalteB
Dann
Wert DateiY.Tabelle1.SpalteC = Wert in DateiX.Tabelle1.SpalteC
Sonst
Nächster Wert/nichts…
Nächste DateiY
hoffe das hilft...
In jedem Fall danke ich dir schon jetzt.
Viele Grüsse,
Sinan

Anzeige
AW: Datenabgleich über zwei Spalten
24.08.2012 11:13:21
Josef

Hallo Sinan,
der Code gehört in ein allgemeines Modul der DateiX.
Die Datei muss im selben Verzeichnis wie die Y-dateien liegen!
' **********************************************************************
' Modul: basMain Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub GetData()
  Dim objWB As Workbook, objSH As Worksheet
  Dim rngAll As Range, rng As Range
  Dim objFSO As Object, objFile As Object, objFolder As Object
  Dim vntRet As Variant
  Dim lngCalc As Long, lngCount As Long, lngC As Long
  
  On Error GoTo ErrExit
  
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    lngCalc = .Calculation
    .Calculation = xlCalculationManual
    .DisplayAlerts = False
  End With
  
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objFolder = objFSO.GetFolder(ThisWorkbook.Path)
  Set objSH = ThisWorkbook.Sheets("Tabelle1")
  
  lngCount = objFolder.Files.Count
  
  For Each objFile In objFolder.Files
    lngC = lngC + 1
    Application.StatusBar = "Bearbeite Datei " & lngC & " von " & lngCount & " - Bitte Warten!"
    If LCase(objFile.Name) Like "*.xls*" And Not LCase(objFile.Name) Like "*~$*" Then
      If LCase(objFile.Path) <> LCase(ThisWorkbook.FullName) Then
        Set rngAll = Nothing
        Set objWB = Workbooks.Open(objFile.Path, False)
        If SheetExist("Tabelle1", objWB) Then
          On Error Resume Next
          Set rngAll = objWB.Sheets("Tabelle1").Columns(1).SpecialCells(xlCellTypeConstants)
          On Error GoTo 0
          If Not rngAll Is Nothing Then
            For Each rng In rngAll
              vntRet = Application.Match(rng, objSH.Columns(1), 0)
              If IsNumeric(vntRet) Then
                If rng.Offset(0, 1) = objSH.Cells(vntRet, 2) Then
                  rng.Offset(0, 2) = objSH.Cells(vntRet, 3)
                End If
              End If
            Next
          End If
        End If
        objWB.Close True
      End If
    End If
  Next
  
  ErrExit:
  
  With Err
    If .Number <> 0 Then
      MsgBox "Fehler in Prozedur:" & vbTab & "'GetData'" & vbLf & String(60, "_") & _
        vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
        "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
        .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
        "VBA - Fehler in Modul - Modul2"
      .Clear
    End If
  End With
  
  On Error GoTo 0
  
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = lngCalc
    .DisplayAlerts = True
    .Application.StatusBar = False
  End With
  
  Set rngAll = Nothing
  Set rng = Nothing
  Set objSH = Nothing
  Set objWB = Nothing
  Set objFolder = Nothing
  Set objFile = Nothing
  Set objFSO = Nothing
End Sub


Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If Wb Is Nothing Then Set Wb = ThisWorkbook
  For Each wks In Wb.Worksheets
    If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function



« Gruß Sepp »

Anzeige
AW: Datenabgleich über zwei Spalten
24.08.2012 13:39:41
Sinan
Hallo Sepp,
danke vielmals... das ist ja der absolute Hammer?!? Wie schnell hast du denn den Code aus dem Ärmel gezaubert? Sehr geil, deine Hilfe... wirklich, ganz grossen Dank! :)
Ich habe versucht deinen Code nachzuvollziehen und habe diesen einmal in ein Modul eingebaut und laufen lassen. Hat funktioniert, aber leider nicht so wie ich wollte und aber auch nur deswegen nicht, weil ich der Einfachheit halber nicht die ganze Wahrheit geschrieben hatte:
In der Datei Y entspricht die zu matchende Spalte A in Wirklichkeit der Spalte S und Spalte B der Spalte T und Spalte C der Spalte AA.
DateiX.SpalteA = DateiY.Spalte S
DateiX.SpalteB = DateiY.Spalte T
DateiX.SpalteC = DateiY.Spalte AA
Habe es nicht verkomplizieren wollen und darum nicht erwähnt. Ich dachte, ich könnte es relativ easy abändern... ich kann es natürlich nicht! Eigentlich müsste das aber doch "relativ" easy durch die Offset-Zahl anzupassen sein? Jedoch habe ich eines auch noch nicht verstanden: die Prüfung, ob der Zellinhalt ein numerischer Wert ist? Wozu ist das gut? Zumal die Zellwerte alle nur einen String-Wert enthalten? Kannst du mir dazu bitte eine kleine Info geben? Alle Werte in den Spalten A,B,C bzw. S, T und AA enthalten String-Werte (alphanumerisch)...
Hier ist der besprochene Abschnitt (der Match findet ja hier statt)
If IsNumeric(vntRet) Then
If rng.Offset(0, 1) = objSH.Cells(vntRet, 2) Then
rng.Offset(0, 2) = objSH.Cells(vntRet, 3)
End If
End If
Vielen Dank und viele Grüsse,
Sinan

Anzeige
AW: Datenabgleich über zwei Spalten
24.08.2012 14:03:13
Josef

Hallo Sinan,
hier der angepasste Code mit ein paar Kommentaren.
' **********************************************************************
' Modul: basMain Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub GetData()
  Dim objWB As Workbook, objSH As Worksheet
  Dim rngAll As Range, rng As Range
  Dim objFSO As Object, objFile As Object, objFolder As Object
  Dim vntRet As Variant
  Dim lngCalc As Long, lngCount As Long, lngC As Long
  
  'Fehlerbehandlung
  On Error GoTo ErrExit
  
  'EXCEL 'ruhig' stellen
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    lngCalc = .Calculation
    .Calculation = xlCalculationManual
    .DisplayAlerts = False
  End With
  
  Set objFSO = CreateObject("Scripting.FileSystemObject") 'FileSystemObject erstellen
  Set objFolder = objFSO.GetFolder(ThisWorkbook.Path) 'Ordner-Object erstellen
  Set objSH = ThisWorkbook.Sheets("Tabelle1") 'Tabelle1 in dieser Mappe
  
  lngCount = objFolder.Files.Count
  
  For Each objFile In objFolder.Files 'Dateien im Ordner durchlaufen
    lngC = lngC + 1
    Application.StatusBar = "Bearbeite Datei " & lngC & " von " & lngCount & " - Bitte Warten!"
    If LCase(objFile.Name) Like "*.xls*" And Not LCase(objFile.Name) Like "*~$*" Then 'Dateinamen (Erweiterung) prüfen
      If LCase(objFile.Path) <> LCase(ThisWorkbook.FullName) Then 'Wenn Datei ist NICHT diese Datei
        Set rngAll = Nothing
        Set objWB = Workbooks.Open(objFile.Path, False) 'Datei öffnen
        If SheetExist("Tabelle1", objWB) Then 'Wenn 'Tabelle1' in Datei enthalten
          On Error Resume Next
          Set rngAll = objWB.Sheets("Tabelle1").Columns(1).SpecialCells(xlCellTypeConstants) 'betroffene Zellen ermitteln
          On Error GoTo 0
          If Not rngAll Is Nothing Then 'Zellen durchlaufen
            For Each rng In rngAll
              'Match = Vergleich(Wert aus Zelle, Spalte S in Datei)
              vntRet = Application.Match(rng, objSH.Columns(19), 0) '.Columns(19) = Spalte S
              If IsNumeric(vntRet) Then 'wenn der Vergleich eine Zahl = Zeile zurückliefert
                If rng.Offset(0, 1) = objSH.Cells(vntRet, 20) Then '20 = Spalt T
                  rng.Offset(0, 2) = objSH.Cells(vntRet, 27) '27 = Spalte AA
                End If
              End If
            Next
          End If
        End If
        objWB.Close True 'datei schließen
      End If
    End If
  Next
  
  'Fehlerbehandlung
  ErrExit:
  
  With Err
    If .Number <> 0 Then
      MsgBox "Fehler in Prozedur:" & vbTab & "'GetData'" & vbLf & String(60, "_") & _
        vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
        "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
        .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
        "VBA - Fehler in Modul - Modul2"
      .Clear
    End If
  End With
  
  On Error GoTo 0
  
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = lngCalc
    .DisplayAlerts = True
    .Application.StatusBar = False
  End With
  
  Set rngAll = Nothing
  Set rng = Nothing
  Set objSH = Nothing
  Set objWB = Nothing
  Set objFolder = Nothing
  Set objFile = Nothing
  Set objFSO = Nothing
End Sub


Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If Wb Is Nothing Then Set Wb = ThisWorkbook
  For Each wks In Wb.Worksheets
    If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function


PS: Mit 'IsNumeric()' wird nicht geprüft ob der Zellinhalt eine Zahl ist, sondern ob der Vergleich eine Zahl (=Zeilennummer) liefert und damit einen Treffer ergeben hat.

« Gruß Sepp »

Anzeige
AW: Datenabgleich über zwei Spalten
24.08.2012 16:15:17
Sinan
Hallo Sepp,
ich war leider noch etwas länger in einem Meeting, daher die kleine Verspätung. Ich bin dir für deine Unterstützung wirklich sehr dankbar, auch für deine Kommentare in deiner zweiten Script-Version. Du hast sehr gut damit gehandelt und auch wohl geahnt, dass ich einiges noch nicht ganz verstanden hatte. Jetzt ist mir auch einiges klarer. Allerdings funktioniert das leider irgendwie immer noch nicht, und ich weiss nicht warum? Zur Erinnerung Spalte C von Datei X soll in Spalte AA in Datei Y gesetzt werden, wenn match vorhanden.
Ich habe mal zwei Beispiel-Dateien angefertigt. So sehen die im Original aus, nur eben noch etwas ausführlicher. Kannst du da bitte mal einen Blick drauf werfen und mir bitte ein kurzes Feedback geben?
https://www.herber.de/bbs/user/81562.xlsx
https://www.herber.de/bbs/user/81563.xlsx
PS: ein Feedback erhältst du von mir in jedem Fall, gerade gehts bei mir aber ein bissel turbulent zu. :)
Viele Grüsse,
Sinan

Anzeige
AW: Datenabgleich über zwei Spalten
24.08.2012 18:24:15
Josef

Hallo Sinan,
das konnte nicht funktionieren, weil ich davon ausging, dass die Werte in Spalte A eindeutig sind.
Hab den Code jetzt umgestellt und es sollte laufen.
https://www.herber.de/bbs/user/81570.xlsm

« Gruß Sepp »

Anzeige
AW: Datenabgleich über zwei Spalten
24.08.2012 18:34:09
Sinan
Juhuuuuu! Funzt!!!
Danke Sepp, du bist so geil!!!! Geht wunderbar und den Code kann ich auch nachvollziehen...
Vielen Dank, dass du dir soviel Zeit genommen hast, um mir zu helfen!
Wünsche dir ein superschönes Wochenende!!!
Sinan

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige