gimli3311
Goto Top

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?

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

Content-Key: 265168

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

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

Mitglied: 116301
116301 Mar 04, 2015 at 11:14:16 (UTC)
Goto Top
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ösenface-wink

Grüße Dieter
Member: Gimli3311
Gimli3311 Mar 04, 2015 at 12:23:42 (UTC)
Goto Top
Hey Dieter,

Die Logbücher bzw. der ausgewählte Bereich wird in eine Excel-File reinkopiert. Hab hier Ca. 200 Logbücher(Dateien) die in eine Excel Datei kommen sollen. Das Problem ist die Vorlagen (Spaltenüberschriften) haben verschiedene Anzahl an Spalten und heißen auch nicht gleich.

Ich hab hier mal was zusammenprogrammiert das mir jetzt immer eine Vorlage prüft und ein Rückgabewert gibt, Falls die Vorlage übereinstimmt. Vielleicht könnt ihr euch des mal anschauen und es gibt sicher Verbesserungsmöglichkeiten:

Dim wbkScan As Workbook

Sub scanData()
'Variablen Deklarieren  
Dim strPath As String
Dim log As Boolean
Dim lngTemp As Long

'Werte zuordnen  
strPath = "I:\Logbuch\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, test As Range
Dim strFoundCellV1 As String
Dim i As Long, s As Long
Dim arrVersion1(14) As String
    
    'Prüft ob überhaupt verdacht besteht das es ein Logbuch ist  
    If log = True Then
        '--------------------------------------------Vorlage Aktuelles Logbuch----------------------------------  
        'Sheet Vorlage wird Aktiviert  
        Vorlage.Activate
        'Liest Spaltenüberschriften in Array rein ACHTUNG --> Zeile E und F wird einzell gelesen  
        For i = 1 To 14
            arrVersion1(i) = Cells(7, i).Value
        Next
        'Öffnet die gefundene Datei der ein Logbuch sein könnte  
        Set wbkScan = Workbooks.Open(strPath)
            'Aktive Sheet (gefundene Datei) wir von Zelle A1 bis A60 durchsucht  
            For Each sucheV1 In ActiveSheet.Range("A10:A60").Cells  
               'Wenn Gesuchte Text = den Vorgegebenen ist gehts weiter  
               If sucheV1.Text = arrVersion1(1) Then
                        'Makiert die Gesuchte spalte  
                        sucheV1.Activate
                            'Variable v für die Rechtsverschiebung  
                            v = 1
                            ' Schleife um die Spaltenüberschrift der Vorlage zu vergleichen  
                            For i = 2 To 14
                                ' Wenn geöffnete Datei un Vorlage gleich ist (Spaltenüberschrift)  
                                If sucheV1.Offset(0, v).Text = arrVersion1(i) Then
                                    'Wenn alle Spalten gleich sind Springe rein  
                                    If i = 14 Then
                                        'Bereich kopieren hier einfügen  
                                        'Rückgabewert an die Funktion  
                                        checkTemplate = 1
                                    End If
                                    v = v + 1
                                Else
                                    Debug.Print "Vorlage 1 ist es nicht"  
                                    'Verlassen der For-Schleife wenn Spalten nicht übereinstimmten  
                                    Exit For
                                End If
                            Next
                        Exit For
                End If
            Next
                    'Schließe datei  
                    wbkScan.Close False
        
   '------------------------------------------------Vorlage Logbuch Version 1----------------------------------  
    
    Else
        Exit Function
    End If
End Function


Gruß Gimli3311
Mitglied: 116301
Solution 116301 Mar 06, 2015 updated at 10:43:52 (UTC)
Goto Top
Hallo Gimli3311!

Hat aus Zeitgründen leider etwas länger gedauertface-wink

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:
8bc19927c257bcef5261c91461e072ce

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übschenface-wink

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
Viel Spaß beim Testenface-smile

Grüße Dieter
Member: Gimli3311
Gimli3311 Mar 06, 2015 at 10:43:36 (UTC)
Goto Top
Hey Dieter,

Einfach nur WOW face-smile

Danke das du dir die mühe gemacht hast. face-smile Habe inzwischen zwar auch was hinbekommen (läuft grad auf der VM) aber dein Code werde ich auf jeden Fall auch mal Testen, wenn nicht sogar verwenden da er viel kürzer ist (zwecks Performance) und auch "professioneller aussieht" ^^

Wenn ich was nicht verstehe melde ich mich nochmals ;)

Gruß Gimli3311
Mitglied: 116301
116301 Mar 06, 2015 at 10:54:48 (UTC)
Goto Top
Hallo Gimli3311!

Du warst aber Fixface-smile

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 istface-wink

Bin jetzt allerdings erst mal unterwegs...

Grüße Dieter