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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 264294
Url: https://administrator.de/forum/zelle-vergleichen-264294.html
Ausgedruckt am: 11.01.2025 um 15:01 Uhr
4 Kommentare
Neuester Kommentar
Hallo Gimli3311!
Das Ganze noch ein wenig übersichtlicher, dann in etwa so:
Grüße Dieter
[edit] Geändert: FileList zurücksetzen und Löschen des Importbereichs an den Anfang gesetzt(sichtbar) [/edit]
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
[edit] Geändert: FileList zurücksetzen und Löschen des Importbereichs an den Anfang gesetzt(sichtbar) [/edit]
Hallo
Freut mich, dass Du mitgedacht hast
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) ...
Grüße Dieter
Freut mich, dass Du mitgedacht hast
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...In meinem Code kopiere ich aber erst ab Zelle A29 bis N29 wieso bekomm ich trotzdem jedes Mal die Überschrift mit.
Grüße Dieter