Zelle Suchen und Vergleichen
Guten Morgen Zusammen,
ich bin es mal wieder und komm seid gestern Mittag mal wieder nicht voran.
Was hab ich vor:
Ich will ein bestimmten Bereich auslesen. Das Problem: Es gibt verschiedene Vorlagen.
Mein Lösungsweg: Habe ein Excel-Sheet erstellt das die Vorlagen beinhaltet. Also die Überschriften dieser Vorlagen.
Bsp.: Nr| Datum| Inputgeber usw. die Nächste Vorlage fängt dann z.B. so an: Datum| Nr | Verantwortlicher|....
Da es keine fest definierte Spalte gibt wo die Überschrift immer steht hab ich mit .find nach Nr gesucht wenn es diese Zelle gefunden hat habe ich die Zellennummer mit AddressLocal in eine String Variable kopiert da bei der Range Variable ein Fehler kam. Nun würde ich gerne Die ZellenNr. eine Spalte nach rechts verschieben und die Zelle dann mit der zweiten Zelle der Vorlage vergleichen. Dies immer wieder bis die nächste Spalte leer ist. Wenn dann alle Spalten gleich sind will ich wieder zu der ZellenNr springen die ich mit AddressLocal ausgelesen habe und von dort alle Werte Unterhalb kopieren bis keine Werte mehr vorhanden sind.
Falls ich mit .find nichts finde überprüfe ich die andere Vorlage auf die aktuelle Excel-Datei aber dies kann ich ja dann von oben fast 1:1 übernehmen.
Ich schreib zur Übersicht nochmal mein geplantes vorgehen in Stichwörtern auf
Sub:
- Übergabe der Parameter Path und Log(True/False) Wert an die Funktion
Funktion:
1 Prüft ob Log True oder False -> Wenn False Abbruch der Funktion
2True: Lies in der Sheet der ersten Vorlageversion den Wert aus
3 Öffne die Excel-Datei
4 Markiere den Bereich A1:N100
5 .Find nach erste Zell der Vorlageversion
6. Wenn gefunden Schreibe die Zellen Nr in ein String/Range
7. Von der ZellenNr eins nach rechts springen
8. Wert der Zelle mit dem Wert der zweiten Vorlagenspalte vergleichen
9. So lange wiederholen bis Wert der Vorlagenspalte leer ist
10. Wenn alle Zellen übereinstimmten Rückgabewert = 1
11. Wenn eine Zelle nicht übereinstimmt nächste Vorlagen Version prüfen
Habe da auch schon ein Code der aber bei Nr.6 bzw. 7 aufhört
Meine Fragen wären jetzt:
1. Kann ich das überhaupt so umsetzten oder habt ihr vielleicht ein besseren/einfacheren Weg
2. Kann ich die gefundene ZellenNr. überhaupt übertragen und dann weitermachen heißt dann mit Offset(0,1) eine Zelle nach rechts springen?
Schon mal jetzt vielen Danke für Anregungen, Tipps oder Code ;)
Gruß Gimli3311
ich bin es mal wieder und komm seid gestern Mittag mal wieder nicht voran.
Was hab ich vor:
Ich will ein bestimmten Bereich auslesen. Das Problem: Es gibt verschiedene Vorlagen.
Mein Lösungsweg: Habe ein Excel-Sheet erstellt das die Vorlagen beinhaltet. Also die Überschriften dieser Vorlagen.
Bsp.: Nr| Datum| Inputgeber usw. die Nächste Vorlage fängt dann z.B. so an: Datum| Nr | Verantwortlicher|....
Da es keine fest definierte Spalte gibt wo die Überschrift immer steht hab ich mit .find nach Nr gesucht wenn es diese Zelle gefunden hat habe ich die Zellennummer mit AddressLocal in eine String Variable kopiert da bei der Range Variable ein Fehler kam. Nun würde ich gerne Die ZellenNr. eine Spalte nach rechts verschieben und die Zelle dann mit der zweiten Zelle der Vorlage vergleichen. Dies immer wieder bis die nächste Spalte leer ist. Wenn dann alle Spalten gleich sind will ich wieder zu der ZellenNr springen die ich mit AddressLocal ausgelesen habe und von dort alle Werte Unterhalb kopieren bis keine Werte mehr vorhanden sind.
Falls ich mit .find nichts finde überprüfe ich die andere Vorlage auf die aktuelle Excel-Datei aber dies kann ich ja dann von oben fast 1:1 übernehmen.
Ich schreib zur Übersicht nochmal mein geplantes vorgehen in Stichwörtern auf
Sub:
- Übergabe der Parameter Path und Log(True/False) Wert an die Funktion
Funktion:
1 Prüft ob Log True oder False -> Wenn False Abbruch der Funktion
2True: Lies in der Sheet der ersten Vorlageversion den Wert aus
3 Öffne die Excel-Datei
4 Markiere den Bereich A1:N100
5 .Find nach erste Zell der Vorlageversion
6. Wenn gefunden Schreibe die Zellen Nr in ein String/Range
7. Von der ZellenNr eins nach rechts springen
8. Wert der Zelle mit dem Wert der zweiten Vorlagenspalte vergleichen
9. So lange wiederholen bis Wert der Vorlagenspalte leer ist
10. Wenn alle Zellen übereinstimmten Rückgabewert = 1
11. Wenn eine Zelle nicht übereinstimmt nächste Vorlagen Version prüfen
Habe da auch schon ein Code der aber bei Nr.6 bzw. 7 aufhört
Meine Fragen wären jetzt:
1. Kann ich das überhaupt so umsetzten oder habt ihr vielleicht ein besseren/einfacheren Weg
2. Kann ich die gefundene ZellenNr. überhaupt übertragen und dann weitermachen heißt dann mit Offset(0,1) eine Zelle nach rechts springen?
Sub scanData()
'Variablen Deklarieren
Dim strPath As String
Dim log As Boolean
Dim lngTemp As Long
'Werte zuordnen
strPath = "I:\Projects-Global\ITIS\IT37639_Logbuch_Zusammenfuehrung\090_Infos_Intern\Gleiche_Logbuecher_Test\IT37660_Logbuch.xlsx"
log = True
'Funktion ausführen
lngTemp = checkTemplate(strPath, log)
End Sub
Function checkTemplate(strPath As String, log As Boolean) As Long
'Variablen Deklarieren
Dim strSucheV1 As String
Dim sucheV1 As Range
Dim strFoundCellV1 As String
'Prüft ob überhaupt verdacht besteht das es ein Logbuch ist
If log = True Then
'Sheet Vorlage wird Aktiviert
Vorlage.Activate
'Liest den Wert in Zelle A7 aus
strSucheV1 = Cells(7, 1).Value
'Öffnet die gefundene Datei der ein Logbuch sein könnte
Set wbkScan = Workbooks.Open(strPath)
'Aktive Sheet (gefundene Datei) wir von Zelle A1 bis N100 durchsucht
With ActiveSheet.Range("A1:N100")
'Durchsucht nach strSucheV1
Set sucheV1 = .Find(strSucheV1, LookIn:=xlValues)
'Wenn was gefunden wurde springe in die If wenn nicht aus der If
If Not sucheV1 Is Nothing Then
'Schreibe ZellenNr in Variable
strFoundCellV1 = sucheV1.AddressLocal
If strFoundCellV1 = Cells(7, 2).Value Then
'Gegeben Aus Testzwecken
MsgBox "Zeile Zwei stimmt auch überein"
End If
End If
'Schließe datei
wbkScan.Close False
End With
Else
Exit Function
End If
End Function
Schon mal jetzt vielen Danke für Anregungen, Tipps oder Code ;)
Gruß Gimli3311
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 265168
Url: https://administrator.de/forum/zelle-suchen-und-vergleichen-265168.html
Ausgedruckt am: 11.01.2025 um 15:01 Uhr
5 Kommentare
Neuester Kommentar
Hallo Gimli3311!
Ja, müssen denn die Log-Dateien in unterschiedliche Vorlagen kopiert werden oder ist das nur Dein Plan, weil sich die Überschriften in der Reihenfolge unterscheiden und sich womöglich auch in verschieden Zeilen befinden. Sofern zumindest die Anzahl der Überschriften übereinstimmt, ließe sich diese Problem auch programmtechnisch lösen
Grüße Dieter
Ja, müssen denn die Log-Dateien in unterschiedliche Vorlagen kopiert werden oder ist das nur Dein Plan, weil sich die Überschriften in der Reihenfolge unterscheiden und sich womöglich auch in verschieden Zeilen befinden. Sofern zumindest die Anzahl der Überschriften übereinstimmt, ließe sich diese Problem auch programmtechnisch lösen
Grüße Dieter
Hallo Gimli3311!
Hat aus Zeitgründen leider etwas länger gedauert
Hiermal ein Code der alle Log-Sheet-Inhalte kopiert, dessen Überschriftsmerkmale mit einem bestimmten Log-Typ übereinstimmen. Dazu wird ein seperates (verstecktes) Tabellenblatt (Log-Settings) benötigt, dass wie folgt aufgebaut ist:
Im Block [Template] stehen zwecks Spaltenzuordnungs-Übersicht die Überschriften, wie sie in der Vorlage stehen.
Ab Block [Log-Type 1] stehen dann die Überschriften, wie sie in den unterschiedlichen Logs vorliegen. Bei einer 1:1-Kopie sind das dann die gleichen Überschriften in gleicher Reihenfolge, wie im Block [Template] und die Spaltenzuordnungen in der Zeile darunter ebenfalls in der Reihenfolge 1:1.
Die Überschriften in den Log-Dateien müssen immer ab der Spalte(A) angegeben werden, allerdings nur soweit, wie in der Zeile darunter noch eine Spaltenzuordnung eingetragen ist/wird. Ein Vergleich beginnt bei Spalte(A) und endet an der letzten Überschrift einer Überschriftszeile in Log-Type.
Sofern bei den Spaltenzuordnungen nicht alle Spalten vom Template (A:N) vergeben sind, bleiben diese Spalten beim Datenimport Leer und die Überschriftsspalten, die keine Spaltenzuordnung beinhalten werden einfach übersprungen.
Wurde eine Spaltenzuordnung doppelt vergeben oder liegt sie außerhalb des Überschriftenbereichs im Template (A:N), dann wird eine entsprechende Meldung mit der jeweiligen Zell-Adresse in die Log-Datei geschrieben und wenn keine Log-Type-Übereinstimmung gefunden wurde, dann wird eine Meldung mit dem Dateinamen der Log-Datei in die Log-Datei geschrieben. Die Ausgabe in die Log-Datei kannst Du nach Belieben aufhübschen
Zu erwähnen sei noch, dass aufgund der beliebigen Spaltenzuordnungen keine kompletten Zellen kopiert werden können, sondern nur die Zell-Werte in der Vorlage im Standardformat eingefügt werden.
Der folgende Code durchsucht das übergebene Log-Sheet-Objekt nach einem zutreffenden Log-Type-Muster und fügt die Log-Daten bei einer Übereinstimmung an dem übergebenen Range-Paste-Object ein. Eventuelle Unstimmigkeiten, sind am Ende in der Log-Datei zu finden:
Viel Spaß beim Testen
Grüße Dieter
Hat aus Zeitgründen leider etwas länger gedauert
Hiermal ein Code der alle Log-Sheet-Inhalte kopiert, dessen Überschriftsmerkmale mit einem bestimmten Log-Typ übereinstimmen. Dazu wird ein seperates (verstecktes) Tabellenblatt (Log-Settings) benötigt, dass wie folgt aufgebaut ist:
Im Block [Template] stehen zwecks Spaltenzuordnungs-Übersicht die Überschriften, wie sie in der Vorlage stehen.
Ab Block [Log-Type 1] stehen dann die Überschriften, wie sie in den unterschiedlichen Logs vorliegen. Bei einer 1:1-Kopie sind das dann die gleichen Überschriften in gleicher Reihenfolge, wie im Block [Template] und die Spaltenzuordnungen in der Zeile darunter ebenfalls in der Reihenfolge 1:1.
Die Überschriften in den Log-Dateien müssen immer ab der Spalte(A) angegeben werden, allerdings nur soweit, wie in der Zeile darunter noch eine Spaltenzuordnung eingetragen ist/wird. Ein Vergleich beginnt bei Spalte(A) und endet an der letzten Überschrift einer Überschriftszeile in Log-Type.
Sofern bei den Spaltenzuordnungen nicht alle Spalten vom Template (A:N) vergeben sind, bleiben diese Spalten beim Datenimport Leer und die Überschriftsspalten, die keine Spaltenzuordnung beinhalten werden einfach übersprungen.
Wurde eine Spaltenzuordnung doppelt vergeben oder liegt sie außerhalb des Überschriftenbereichs im Template (A:N), dann wird eine entsprechende Meldung mit der jeweiligen Zell-Adresse in die Log-Datei geschrieben und wenn keine Log-Type-Übereinstimmung gefunden wurde, dann wird eine Meldung mit dem Dateinamen der Log-Datei in die Log-Datei geschrieben. Die Ausgabe in die Log-Datei kannst Du nach Belieben aufhübschen
Zu erwähnen sei noch, dass aufgund der beliebigen Spaltenzuordnungen keine kompletten Zellen kopiert werden können, sondern nur die Zell-Werte in der Vorlage im Standardformat eingefügt werden.
Der folgende Code durchsucht das übergebene Log-Sheet-Objekt nach einem zutreffenden Log-Type-Muster und fügt die Log-Daten bei einer Übereinstimmung an dem übergebenen Range-Paste-Object ein. Eventuelle Unstimmigkeiten, sind am Ende in der Log-Datei zu finden:
Option Explicit
Option Compare Text
Private Const RowTemplate = 2 'Sheet Log-Settings: Überschriftzeile Log-Vorlage
Private Const RowLogPos1 = 5 'Sheet Log-Settings: Überschriftzeile Log-Type 1
Private Const OfsLogNext = 4 'Sheet Log-Settings: Überschriftzeile Log-Type n
Private Const LogMsg1 = "Keine Log-Type-Übereinstimmung gefunden: "
Private Const LogMsg2 = "Zielspalte doppelt vergeben - Log-Settings Zelladresse: "
Private Const LogMsg3 = "Ungültige Spaltenangabe - Log-Settings Zelladresse: "
Private Const LogFile = "I:\Projects-Global\ITIS\IT37639_Logbuch_Zusammenfuehrung\090_Infos_Intern\Gleiche_Logbuecher_Test\Log.txt"
Private Sub Test()
Dim objWks As Worksheet, objLogFile As Object, rngPaste As Range, strFileName As Variant
strFileName = "I:\Projects-Global\ITIS\IT37639_Logbuch_Zusammenfuehrung\090_Infos_Intern\Gleiche_Logbuecher_Test\IT37660_Logbuch.xlsx"
With CreateObject("Scripting.FileSystemObject")
Set objLogFile = .CreateTextFile(LogFile)
End With
Application.ScreenUpdating = False
With Sheets("Vorlage")
Set rngPaste = .Range("A5")
'For Each strFileName In objFileList
Set objWks = Workbooks.Open(strFileName, ReadOnly:=True).Sheets(1)
Call CopyLogData(objWks, rngPaste, objLogFile)
objWks.Parent.Close False
'Set rngPaste = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
'Next
objLogFile.Close
End With
Application.ScreenUpdating = True
MsgBox "Fertig!"
End Sub
Private Sub CopyLogData(ByRef objWksLog, ByRef rngPaste, ByRef objLogFile)
Dim objWks As Worksheet, objValues As Object, rngHeader1 As Range, rngCompT As Range
Dim rngCompL As Range, rngFound As Range, arrInit As Variant, arrValues As Variant
Dim strCol As String, strLogCol As String, intColsCount As Long, intRowsCount As Long, i As Long
Set objWks = ThisWorkbook.Sheets("Log-Settings")
Set rngHeader1 = objWks.Cells(RowLogPos1, "A")
Do While rngHeader1.Text <> ""
Set rngFound = objWksLog.Columns(1).Find(rngHeader1.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not rngFound Is Nothing Then
Set rngCompT = Range(rngHeader1, rngHeader1.End(xlToRight))
Set rngCompL = rngFound.Resize(1, rngCompT.Columns.Count)
If CompareHeader(rngCompT.Value, rngCompL.Value) Then
Set objValues = CreateObject("Scripting.Dictionary")
intColsCount = objWks.Cells(RowTemplate, "A").End(xlToRight).Column
intRowsCount = objWksLog.Cells(Rows.Count, "A").End(xlUp).Row - rngFound.Row
If intRowsCount > 0 Then
ReDim arrInit(intRowsCount - 1)
For i = 1 To intColsCount
objValues.Add Chr(Asc("@") + i), arrInit
Next
For i = 0 To rngCompT.Columns.Count - 1
strCol = UCase(rngHeader1.Offset(1, i).Text)
If strCol <> "" Then
If objValues.Exists(strCol) Then
If InStr(strLogCol, "[" & strCol & "]") < 1 Then
arrValues = rngFound.Offset(1, i).Resize(intRowsCount, 1).Value
objValues.Item(strCol) = WorksheetFunction.Transpose(arrValues)
strLogCol = strLogCol & "[" & strCol & "]"
Else
objLogFile.WriteLine LogMsg2 & rngHeader1.Offset(1, i).Address
End If
Else
objLogFile.WriteLine LogMsg3 & rngHeader1.Offset(1, i).Address
End If
End If
Next
End If
Exit Do
End If
End If
Set rngHeader1 = rngHeader1.Offset(OfsLogNext, 0)
Loop
If objValues Is Nothing Then
objLogFile.WriteLine LogMsg1 & objWksLog.Parent.FullName
ElseIf intRowsCount > 0 Then
arrValues = WorksheetFunction.Transpose(objValues.Items)
rngPaste.Resize(UBound(arrValues, 1), UBound(arrValues, 2)).Value = arrValues
End If
End Sub
Private Function CompareHeader(ByRef aValues1, ByRef aValues2) As Boolean
Dim c As Long
CompareHeader = True
For c = 1 To UBound(aValues1, 2)
If Not aValues1(1, c) Like aValues2(1, c) Then
CompareHeader = False: Exit For
End If
Next
End Function
Grüße Dieter
Hallo Gimli3311!
Du warst aber Fix
Bin jetzt allerdings erst mal unterwegs...
Grüße Dieter
Du warst aber Fix
Wenn ich was nicht verstehe melde ich mich nochmals ;)
Ich gehe mal davon aus, dass Du einiges nicht verstehst, insofern ruhig nachfragen, wenn was unklar istBin jetzt allerdings erst mal unterwegs...
Grüße Dieter