gimli3311
Goto Top

Zelle vergleichen

Hallo Zusammen,
Hallo jodel32,

Ich habe 2 Excel-Dateien mit Tabellen nun haben die Tabellen verschiedene Vorlagen.
Ich hab also ein aktuelle Vorlage und verschiedene ältere Vorlagen.
Nun will ich die aktuelle Vorlage mit den anderen Dateien (die unteranderem ältere Vorlagen haben, vergleichen) und die älteren Vorlagen raussortieren(bzw. überspringen).

Mein Vorgehen wäre dieses:
Öffne Logbuch_Master_Vorlage
Öffne Logbuch_xx
Wenn die Überschrift (A28) von Logbuch_xx gleich ist wie von Logbuch_Master_Vorlage (A1) dann:
Wenn die Überschrift (B28) von Logbuch_xx gleich ist wie von Logbuch_Master_Vorlage (B1) dann:
..............wenn alles übereinstimmt kopiere einen Bereich....ist schon programmiert (Danke jodel32 ;) )
Stimmt NICHT überein schließe Logbuch_xx und kehre in die Schleife zurück --> Logbuch_xx öffnen

Option Compare Text 'benötigt für einen 'like' Vergleich  

Dim fso As Object 'Variable ganz am Anfang des Codefensters stehen lassen !  
Dim wb As Workbook


Sub ImportTables()

    'Variabeln werden mit passenden Datentypen gesetzt  
     Dim rngOut As Range, f As Variant, objFoundFiles As New Collection, strFileFilter As String

    'FilesystemObject erstellen  
     Set fso = CreateObject("Scripting.Filesystemobject")  

    'Pfad in dem die *.xlsx Dateien liegen wird mit der Funktion fncBrowseForFolder ausgewählt  
    'andere Möglichkeit direkter Pfad angeben= (PATHFILES muss dann CONST gesetzt werden) "I:\Projects-Global\ITIS\IT37639_Logbuch_Zusammenfuehrung\090_Infos_Intern\Gleiche_Logbuecher_Test"  

    'Greif auf die Funktion fncBrowseForFolder zu um einen Ordner auszuwählen  
    PATHFILES = fncBrowseForFolder
    'Inputbox wird erstellt in der das Suchwort eingegeben werden soll  
    strFileFilter = InputBox("Dateinamensteileingeben :" & Chr(13) & "z.B. Eingabe_* (ohne Datei-Erweiterung, es werden nur *.xlsx, *.xlsm und *.xls Dateien gesucht)")  


    'Suche Dateien mit passenden Namen  

    enumFiles fso.GetFolder(PATHFILES), strFileFilter, objFoundFiles

    'Wenn Dateien gefunden wurden  
    If objFoundFiles.Count > 0 Then
        'Führt das Makro schneller aus und unterdrückt Meldungen  
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False

        With ActiveSheet
            'erste Ausgabezelle in neuer .xlsx-Datei festlegen  
            Set rngOut = .Range("A3")  
            'Für jede gefundene Datei in der Collection  
            For Each f In objFoundFiles
                'öffne Datei  
                Set wb = Workbooks.Open(f, ReadOnly:=True)
                'kopiere den Inhalt der Tabelle in das aktuelle Sheet  
                
                '-Vorlage vergleichen---  
                
                With wb.Sheets(1)
                    .Range("A29:N" & .Cells(Rows.Count, 4).End(xlUp).Row).Copy rngOut  
                 End With
                'schließe Dokument wieder  
                wb.Close False
                'Ausgabezelle für den nächsten Import ermitteln  
                Set rngOut = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            Next
            '----Funktionsaufruf um Leere Spalten zu löschen  
           deleteEmptyCells
            
        End With
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True

    End If

End Sub

' Öffnet das Suchfeld für die Ordnerauswahl  


Private Function fncBrowseForFolder(Optional ByVal defaultPath = "") As String  

  Dim objFlderItem As Object, objShell As Object, objFlder As Object


  Set objShell = CreateObject("Shell.Application") 'Vordefinierter Pfad einstellen zu Testzwecken (Standard--> DefaultPath)  
  Set objFlder = objShell.BrowseForFolder(0&, "Ordner auswählen...", 0&, "I:\Projects-Global\ITIS\")  

  If objFlder Is Nothing Then GoTo ErrExit

  Set objFlderItem = objFlder.Self
  fncBrowseForFolder = objFlderItem.Path

ErrExit:
  Set objShell = Nothing
  Set objFlder = Nothing
  Set objFlderItem = Nothing

End Function


Function deleteEmptyCells()

 Dim lngLetzte As Long
 Dim lngZeile As Long
 ' Bildschirmaktualisierung AUSschalten (Makro läuft schneller, Bildschirm flackert nicht)  
 Application.ScreenUpdating = False
 ' Letzte belegte Zelle in Spalte B plus 1 raussuchen und merken  
 lngLetzte = IIf(IsEmpty(Range("B65536")), Range("B65536").End(xlUp).Row + 1, 65536)  
 ' in einer Schleife von dieser Letzten bis Zeile 1 gehen - also von unten nach oben  
      For lngZeile = lngLetzte To 1 Step -1
    ' Wenn die Zelle in der ensprechenden Zeile in Spalte B leer ist  
        If Cells(lngZeile, 2) = "" Then  
    ' dann lösche die gesamte Zeile  
          Cells(lngZeile, 2).EntireRow.Delete
    ' Ende der Bedingung  
        End If
    ' Nächste Zeile mit der Bedingung vergleichen  
      Next
 ' Bildschirmaktualisierung EINschalten (nicht vergessen)  
 Application.ScreenUpdating = True


End Function

'Funktion um Dateien rekursiv zu suchen  


Sub enumFiles(ByVal rootFolder As Object, ByVal strFilter As String, ByRef col As Collection)

    On Error Resume Next
    For Each file In rootFolder.Files
        ext = LCase(fso.GetExtensionName(file.Name))
        If fso.GetBasename(file.Name) Like strFilter And (ext = "xlsx" Or ext = "xls") Then  
            col.Add file.Path
        End If
    Next
    For Each subfolder In rootFolder.SubFolders
        enumFiles subfolder, strFilter, col
    Next

End Sub

Content-Key: 264294

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

Printed on: April 24, 2024 at 18:04 o'clock

Mitglied: 116301
Solution 116301 Feb 24, 2015 updated at 10:10:46 (UTC)
Goto Top
Hallo Gimli3311!

Das Ganze noch ein wenig übersichtlicher, dann in etwa so:
Option Explicit
Option Compare Text

'Start-Pfad für Ordnerauswahl festlegen  
Private Const RootFolder = "I:\Projects-Global\ITIS\IT37639_Logbuch_Zusammenfuehrung\090_Infos_Intern\"  

Private objFso As Object, objFileList As New Collection
Private arrFileMask As Variant, intSubFolders As Integer

Public Sub ImportTables()
    Dim objWks As Worksheet, rngPaste As Range, sInput As String
    Dim strFileName As Variant, strRootFolder As String, i As Long
    
    With ActiveSheet
        'Erste Zelladresse für Import fetlegen  
        Set rngPaste = .Range("A5")  
        
        'Sheet ab Range-Paste vor Import gegebenenfalls bereinigen  
        If .UsedRange.Rows.Count >= rngPaste.Row Then
            .Rows(rngPaste.Row & ":" & .UsedRange.Rows.Count).Clear  
        End If
    End With

    'Dialog Ordnerauswahl anzeigen  
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Ordnerauswahl . . ."  
        .ButtonName = "Öffnen"  
        .InitialFileName = RootFolder
         If .Show Then
             strRootFolder = .SelectedItems(1)
         End If
    End With
    
    'Test Ordnerauswahl Leer/Abbruch  
    If strRootFolder = "" Then Exit Sub  
    
    'Abfrage Root-Ordner rekursiv durchsuchen Ja/Nein  
    intSubFolders = MsgBox("Unterordner mit einbeziehen?", vbQuestion Or vbYesNo, "Dateisuche . . .")  
    
    'Eingabe-Text  
    sInput = "Datei-Suchmuster eingeben (erlaubt *?):" & vbCr & vbCr & _  
             "Beispiele: [*.xls] [*.xls*] [*.xls;*.xlsx]"  
    
    'Eingabe Datei-Suchmuster  
    arrFileMask = Split(InputBox(sInput, "Dateisuche . . .", "*.xls*"), ";")  
    
    'Test ob Datei-Suchmuster Leer/Abbruch  
    If UBound(arrFileMask) < 0 Then Exit Sub
    
    'Object mit Dateifunktionen erzeuegen  
    Set objFso = CreateObject("Scripting.FileSystemObject")  

    'Dateiliste erstellen  
    Call FindFiles(objFso.GetFolder(strRootFolder))
    
    'Test Dateien gefunden  
    If objFileList.Count Then
        With ActiveSheet
            'Bildschirmaktualisierung Aus  
            Application.ScreenUpdating = False
        
            'Dateiliste abarbeiten und Daten importieren  
            For Each strFileName In objFileList
                'Daten importieren  
                Set objWks = Workbooks.Open(strFileName, ReadOnly:=True).Sheets(1)
                
                'Kopieren, wenn Überschriften übereinstimmen  
                If .Range("A1").Value & .Range("B1").Value Like objWks.Range("A28").Value & objWks.Range("B28").Value Then  
                    objWks.Range("A29:N" & objWks.Cells(Rows.Count, "B").End(xlUp).Row).Copy rngPaste  
                End If
                
                objWks.Parent.Close False
                
                'Nächste Zelladresse für Import festlegen  
                Set rngPaste = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            Next
            
            'Zeilen löschen wenn Spalte B = Leer (RowsCount = 1048576)  
            For i = .Cells(Rows.Count, "B").End(xlUp).Row To 5 Step -1  
                If .Cells(i, "B").Text = "" Then  
                    .Rows(i).Delete Shift:=xlUp
                End If
            Next
        End With

        'Bildschirmaktualisierung Ein  
        Application.ScreenUpdating = True
        
        MsgBox "Datenimport abgeschlossen!", vbInformation, "Datenimport . . ."  
    Else
        MsgBox "Keine Dateien gefunden!", vbInformation, "Dateisuche . . ."  
    End If
    Set objFileList = Nothing
End Sub

'Root-Ordner nach Dateien durchsuchen (rekursiv MsgBox Ja/Nein)  
Private Sub FindFiles(ByRef objFolder)
    Dim objFile As Object, objSubFolder As Object, strFileMask As Variant
    
    For Each objFile In objFolder.Files
        For Each strFileMask In arrFileMask
            If objFile.Name Like strFileMask Then
                objFileList.Add objFile.Path
            End If
        Next
    Next
    
    If intSubFolders = vbYes Then
        For Each objSubFolder In objFolder.SubFolders
            Call FindFiles(objSubFolder)
        Next
    End If
End Sub
Grüße Dieter

[edit] Geändert: FileList zurücksetzen und Löschen des Importbereichs an den Anfang gesetzt(sichtbar) [/edit]
Member: Gimli3311
Gimli3311 Feb 24, 2015 updated at 08:21:18 (UTC)
Goto Top
Vielen Dank Dieter face-smile

Funktioniert fast wie es sollte.

Ich hab da noch paar Fragen bzw. Probleme:

1. Wenn die gefundene Datei geöffnet wird erscheint diese Abfrage:
8d545fbbb240311d6d10220793aa617b

kann ich die irgendwie vermeiden oder automatisch beantworten.
Und meine Frage ist auch wieso erscheint Sie überhaupt?

2. Ich soll ja nach Dateien suchen die "Logbuch" im Namen haben und den Dateityp ".xls" oder ".xlsx"
Meine Frage ist jetzt wo gibst du im Programm an das er nach dem Dateinamen "*Logbuch*" suchen muss? Das mit den Dateitypen kann ich nachvollziehen.
EDIT: Man bin ich blöd: Ich gebe in die Inputbox dann einfach ein *Logbuch*.xls; *Logbuch*.xlsx
Hat auch ohne funktioniert ^^

3. Das Problem hatte ich schon vorher und zwar hat jedes Logbuch eine Überschrift, bei den aktuellen Logbüchern steht sie in A28 bis N28
In meinem Code kopiere ich aber erst ab Zelle A29 bis N29 wieso bekomm ich trotzdem jedes Mal die Überschrift mit.

Anmerkung: Ich hatte das Problem das wenn ich das Makro mehrmals ausgeführt habe (davor die Zeilen mit den Ergebnissen gelöscht habe) kamen die Daten mehrmals vor Beispiel:

1. Ausgeführt --> Alle Daten richtig kopiert und eingefügt
2. Ausgeführt --> Daten doppelt kopiert und eingefügt
3. Ausgeführt --> Daten dreifach kopiert und eingefügt

Lösung: Habe in Zeile 91 "Set objFileList = Nothing" gesetzt

Schon mal vielen Dank für die Hilfe face-smile
Mitglied: 116301
116301 Feb 24, 2015 at 09:53:12 (UTC)
Goto Top
Hallo

Freut mich, dass Du mitgedacht hastface-smile

Das zurücksetzen der FileList hatte ich leider nicht bedacht. Des weiteren habe ich das Löschen der Inhalte noch an den Anfang gesetzt, damit dies noch vor 'Bildschirmaktualisierung Aus' sichtbar geschieht (oben geändert) ...

3. Das Problem hatte ich schon vorher und zwar hat jedes Logbuch eine Überschrift, bei den aktuellen Logbüchern steht sie in A28 bis N28
In meinem Code kopiere ich aber erst ab Zelle A29 bis N29 wieso bekomm ich trotzdem jedes Mal die Überschrift mit.
Kann es sein, dass bei diesen Dateien in Spalte B (ab Zeile 29) nix drin steht, wenn ja, dann ändere in Codezeile 69 das "B" in eine Spaltenbezeichnung um, in der auf jeden Fall was drinsteht...

Grüße Dieter
Member: Gimli3311
Gimli3311 Feb 24, 2015 at 10:10:41 (UTC)
Goto Top
Ja will ja etwas vom VBA lernen face-smile

Das mit dem Löschen des Inhaltes hat soweit gepasst, werde ich aber ändern und an den Anfang setzen wie du es gemacht hast.

Habe das Problem gerade gelöst hatte in Zeile 46:
 .Range("A29:N" & .Cells(Rows.Count, 4).End(xlUp).Row).Copy rngOut   
bei Rows.Count 4 steht hab diese auf 1 abgeändert und jetzt geht's ;)

Danke für deine Hilfe face-smile
Gruß Sergej