tom77777
Goto Top

Excel Makro zum Einfügen von Daten aus anderen Excel Dateien

Hallo,
ich bin neu hier im Forum und kenne mich leider nicht so gut mit Excel/VBA aus.

Im Zuge eines Versuchs während meines Maschinenbaustudiums muss wöchentlich Excel Ausleitungen von anderen Programmen in eine Masterdatei einfügen. Es gibt jeweils 2 Ausleitungen welche unterschiedliche Daten enthalten.
Um dies für meine Nachfolger möglichst einfach zu gestalten, möchte ich gerne ein Makro in die Masterdatei einfügen.

Mein Problem/ Anliegen:
Ich habe eine bestehende Excel Datei "A", diese bestehende Datei besitzt in den ersten zehn Zeilen einen Kopf, bzw. Auswertungsformeln, in [A13:A276] sind Einträge vorhanden. Die Einträge sind z.B. AB123F, B354CD usw..

Weiter rechts, also in Spalte B:F sollen Daten von zwei anderen Excel Dateien, "B" und "C" importiert werden.
Ab Spalte G sind manuell eingetragene Werte, welche [A13:A276] zugeordnet sind, diese dürfen nicht verloren gehen, oder umsortiert werden.

Die Werte der Spalten B und D sollen von Excel Datei "B" und die Werte der Spalten C, E, F sollen von Excel Datei "C" importiert werden.

Die Excel Dateien "B" und "C" sollten die bereits vorhandenen Einträge von "A" enthalten, können unter Umständen aber auch abweichen.

Es sollen also Daten entsprechend den Einträgen in der Spalte A, der Masterdatei "A" eingelesen werden. Wenn in "A" [A13], AB123F enthalten ist, sollen die Dateien "B" und "C" durchsucht werden. Bei Übereinstimmung soll die jeweilige Zeile, somit auch die jeweilige Spalte ausgelesen und in die passende Zeile der Masterdatei eingefügt werden.

In der Datei "B" stehen in den Spalten D und E die relevanten Einträge, in der Datei "C" in den Spalten E, J, und K.


Es ist wichtig dass die Reihenfolge der Einträge in der Spalte A bei "A", "B" und "C" übereinstimmt, da ansonsten die Zuordnung der manuell eingetragenen Daten nicht mehr übereinstimmt.

Bei Abweichung wäre es gut wenn eine Fehlermeldung erscheint.

Die beiden Excel Dateien "B" und "C" möchte ich gerne manuell, über ein Suchfenster auswählen.


Vielen vielen Dank für die Hilfe und schöne Grüße aus Bayern
Tom

Content-Key: 254018

Url: https://administrator.de/contentid/254018

Printed on: April 23, 2024 at 09:04 o'clock

Mitglied: 116301
116301 Nov 07, 2014 at 11:38:49 (UTC)
Goto Top
Hallo Tom!

Es ist wichtig dass die Reihenfolge der Einträge in der Spalte A bei "A", "B" und "C" übereinstimmt, da ansonsten die Zuordnung der manuell eingetragenen Daten nicht mehr übereinstimmt.
Soll heißen, dass die Sucheinträge in den Dateien A/B/C die gleiche Zeilennummer haben müssen oder wie ist das zu verstehen?

Grüße Dieter
Member: Tom77777
Tom77777 Nov 07, 2014 at 13:30:54 (UTC)
Goto Top
Hallo Dieter,
Danke für deine Antwort!
Es ist nur wichtig dass die Einträge den richtigen Zeilen in Dokument A, der Masterdatei zugeordnet werden.
Datei A: zum Beispiel Motor 1 mit Einträgen in der selben Zeile weiter rechts, die zu dem Motor gehören.
Datei B: in irgend einer Zeile steht Motor 1, mit entsprechenden Einträgen in der selben Zeile weiter rechts.
Datei C: analog zu Datei B

-> Einträge sollen den richtigen Zeilen zugeordnet werden.

Viele Grüße
Tom
Mitglied: 116301
Solution 116301 Nov 07, 2014, updated at Nov 12, 2014 at 09:21:47 (UTC)
Goto Top
Hallo Tom!

OK, unter der Annahme, dass sich die Daten in allen Arbeitsmappen im Sheet(1) befinden, sollte es mit diesem Code funktionieren:
Option Explicit

Private Const RowStartA = 13                'Daten ab Zeile 13  

Private Const ColDataA = "B:F"              'Daten(A): B:F  
Private Const ColDataB = "D,B,E,D"          'Daten(B): D->B, E->D  
Private Const ColDataC = "E,C,J,E,K,F"      'Daten(C): E->C, J->E, K->F  

Public Sub DataImport()
    Dim oWkbB As Workbook, oWkbC As Workbook
    Dim oWksA As Worksheet, oWksB As Worksheet, oWksC As Worksheet
    Dim sFileB As Variant, sFileC As Variant
    Dim oCell As Range, oCells As Range, oFound As Range
    
    'Wahlweise einen anderen Ordnerpfad in Form "X:\Folder" angeben  
    ChDir ThisWorkbook.Path
    
    'Import-Dateiauswahl(B/C) *.xlsx-Dateien, bei Bedarf entsprechend anpassen  
    sFileB = Application.GetOpenFilename("Excel-Datei(B) (*.xlsx), *.xlsx")  
    sFileC = Application.GetOpenFilename("Excel-Datei(C) (*.xlsx), *.xlsx")  
    
    If sFileB = False Or sFileC = False Then
        MsgBox "Dateiauswahl unvollständig!", vbInformation, "Dateiauswahl . . ."  
        Exit Sub
    End If
    
    Set oWkbB = GetObject(sFileB)           'Set/Open Datei(B)  
    Set oWkbC = GetObject(sFileC)           'Set/Open Datei(C)  
    
    Set oWksA = ThisWorkbook.Sheets(1)      'Set Workbook(A)-Sheet1  
    Set oWksB = oWkbB.Sheets(1)             'Set Workbook(B)-Sheet1  
    Set oWksC = oWkbC.Sheets(1)             'Set Workbook(C)-Sheet1  

    With oWksA  'Daten-Bereich festlegen (A13:A??)  
          Set oCells = .Range(.Cells(RowStartA, "A"), .Cells(RowStartA, "A").End(xlDown))  
    End With

    Application.ScreenUpdating = False
    
    For Each oCell In oCells    'Alle Zellen(A13:A??) durchlaufen  
        If oCell.Text <> "" Then  
            With oWksA.Rows(oCell.Row)  'Aktuelle Zeile Spalte(B:F) Inhalte löschen  
                .Columns(ColDataA).ClearContents
            End With
            
            With oWksB.Columns("A:A")   'Datei(B) Spalte A durchsuchen  
                Set oFound = .Find(oCell.Text, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
            End With
        
            If Not oFound Is Nothing Then   'Datei(B): Wenn gefunden Daten kopieren  
                Call GetValues(oWksA, oWksB, ColDataB, oCell.Row, oFound.Row)
            End If
            
            With oWksC.Columns("A:A")   'Datei(C) Spalte A durchsuchen  
                Set oFound = .Find(oCell.Text, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
            End With
            
            If Not oFound Is Nothing Then   'Datei(C): Wenn gefunden Daten kopieren  
                Call GetValues(oWksA, oWksC, ColDataC, oCell.Row, oFound.Row)
            End If
        End If
    Next
    
    oWkbB.Close False   'Datei(B) schließen (speichern=False)  
    oWkbC.Close False   'Datei(C) schließen (speichern=False)  
    
    Application.ScreenUpdating = True
    
    MsgBox "Fertig!", vbInformation, "Datenimport . . ."  
End Sub

Private Sub GetValues(ByRef oWksA, ByRef oWksX, ByRef sCols, ByVal iRowA As Long, ByVal iRowX As Long)
    Dim aColumns As Variant, i As Integer
    
    aColumns = Split(sCols, ",")  
    
    With oWksX.Rows(iRowX)
        For i = 0 To UBound(aColumns) Step 2
            oWksA.Cells(iRowA, aColumns(i + 1)).Value = .Columns(aColumns(i)).Value
        Next
    End With
End Sub
Wobei, bei erfolgloser Suche anstatt einer MsgBox die betroffenen Zellen (B:F) Leer sindface-wink

Grüße Dieter
Member: Tom77777
Tom77777 Nov 12, 2014 at 09:23:25 (UTC)
Goto Top
Hallo Dieter,
vielen Dank für deine Antwort.
Das Makro funktioniert ohne Probleme ;)

Viele Grüße
Tom