Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Generiere Hash/Prüfsumme für jede Zeile

Forumthread: Generiere Hash/Prüfsumme für jede Zeile

Generiere Hash/Prüfsumme für jede Zeile
14.07.2014 14:50:03
Robert
Hallo zusammen.
Um Tabellen zu vergleichen, möchte ich für jede Zeile einen String bilden, der mich zwei Zeilen auf 100% Übereinstimmung der Inhalte testen lässt.
Ich dachte an eine einfache Aneinanderreihung aller Zellenwerte der Zeile.
Durch mein Codekonstrukt bin ich allerdings darauf angewiesen, Workbook, Worksheet und Zeile aus Variablen zu beziehen.
Nun scheitere ich an der Formulierung von "Für jede Zelle im benutzten Bereich der Zeile s im Worksheet x des Workbook y, schreibe den Wert in einen String"
Beispiel:
For each Cell in Tabelle1.Range(Tabelle1.Cells(2,1),Tabelle1.Cells(2,7)
strgHash = strgHash & Cell.Value
Next Cell
Das funktioniert wunderbar.
Problem: Ich brauche auch das Workbook als Variable, und da streikt .Range dann.
Mein Code:
For tb = 1 To 2
' Für jede Zeile in der Tabelle
For s = starttab(tb) To endtab(tb)
' Wenn einzelne Spalte als UID, dann...
If UIDsingle Then
' ... nehme den Wert als String
strgUID = Workbooks(WB(tb)). _
Worksheets(tabe(tb)).Cells(s, UID1.ListIndex + 1)
' ansonsten kombiniere UID aus mehreren Spalten:
Else
' durchlaufe alle UIDboxen
For cob = 1 To 4
' wenn UIDBox mit Inhalt, dann ...
If Controls("UIDcomb" & cob).Text  "" Then
az = Controls("UIDcomb" & cob).ListIndex + 1
' ... füge Wert an UID an
strgUID = strgUID & Workbooks(WB(tb)). _
Worksheets(tabe(tb)).Cells(s, az)
End If
Next cob
End If
'Erstelle Hashstring aus allen Zellen der Zeile
For Each rngCell In Worksheets(tabe(tb)).Range(Worksheets(tabe(tb)).Cells(s, 1),  _
Worksheets(tabe(tb)).Cells(s, 10))
strgHash = strgHash & rngCell.Value
Next        ' Hashstring in Array
arrHash(s - starttab(tb), tb) = strgHash
' UIDstring in Array
arrUID(s - starttab(tb), tb) = strgUID
' reset UIDstring für nächste Zeile
strgUID = ""
'reset Hashstring für nächste Zeile
strgHash = ""
Next s
Next tb
Wie kann ich die gewünschte Funktion an oben markierter Stelle irgendwie realisieren?
Vielen Dank und viele Grüße
Robert

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Generiere Hash/Prüfsumme für jede Zeile
14.07.2014 15:18:46
Daniel
Hi
im Prinzip so
for Each Cell In Workbooks("WorkbookName.xlsb").Sheets("Tabellenblattname").Cells(s, 1).Resize(1, 10).cells
durch das Cells().Resize() vermeidest du das Range(Cells(), Cells()) und damit die wiederholte auflistung von Workbook und Worksheet.
Gruß Daniel

Anzeige
AW: Generiere Hash/Prüfsumme für jede Zeile
14.07.2014 15:31:00
Robert
Hallo Daniel,
Ich hab das mal der Übersichtlichkeit halber in ein Makro gepackt.
Sub rangetest()
Dim rngCell As Range
For Each rngCell In Workbooks("Tabellenvergleich.xlsm").Tabelle4.Cells(1, 2).Resize(1, 10). _
Cells
MsgBox rngCell.Value
Next
End Sub
Funktioniert leider so nicht! Das Problem scheint das selbe zu sein wie beim manuellen Eingeben mit Range()
viele Grüße
Robert

Anzeige
AW: Generiere Hash/Prüfsumme für jede Zeile
14.07.2014 16:04:33
Daniel
Hi
jedes Tabellenblatt hat zwei Namen:
a) den Codenamen
b) den Indexnamen
der Codename steht im Projektexplorerbaum vor der Klammer, der Indexname steht in der Klammer.
der Indexname ist gleichzeitig auch der Name, der auf den Tabellenblattreitern steht.
wenn du das Tabellenblatt über den Codenamen ansprichst: Tabelle1.Cells(...), dann ist zu beachten dass du hierbei immer nur auf Tabellenblätter der eigenen Datei zugreifen kannst und nicht auf Tabellenblätter anderer Dateien, es bringt daher auch nichts, das Workbook-Objekt voranszustellen.
wenn du auf Tabellenblätter anderer Dateien zugreifen willst, dann musst du über den Indexnamen gehen und diesen in der Sheets(...) oder Worksheets(...)-Funktion angeben:
Falsch:
Workbooks("Tabellenvergleich.xlsm").Tabelle4.Cells(1, 2)

Richtg:
Workbooks("Tabellenvergleich.xlsm").Sheets("Tabelle4").Cells(1, 2)
Gruß Daniel

Anzeige
AW: Generiere Hash/Prüfsumme für jede Zeile
15.07.2014 09:02:30
Robert
Hallo Daniel,
wenn du das Tabellenblatt über den Codenamen ansprichst: Tabelle1.Cells(...), dann ist zu  _
beachten dass du hierbei immer nur auf Tabellenblätter der eigenen Datei zugreifen kannst und nicht auf Tabellenblätter anderer Dateien, es bringt daher auch nichts, das Workbook-Objekt voranszustellen.
Das macht einiges Klar, vielen Dank!
Habe es dann (durch Zufall) genau so gelöst :)
Super!

Anzeige
Das hat Daniel aber nicht geschrieben, ...
14.07.2014 16:07:30
Luc:-?
…Robert!
Du verwendest in deinem OriginalCode InternNamen für die Blätter (keine Variablen) und ein InternName ist stets solitär, d.h., du kannst ihn nicht als Eigenschaft einem bestimmten Workbook zuordnen, was man auch sehr gut am Angebot des VBE-Intellisense erkennen kann! Also musst du entweder Daniels Angebot aufgreifen und mit With Workbooks(…).Worksheets(…) arbeiten, wobei statt '…' der Name, Index oder eine Variable, die Name bzw Index enthält, angegeben wird, oder eindeutige InternNamen der Blätter verwenden, die sich von Workbook zu Workbook voneinander unterscheiden. InternNamen können entsprd geändert wdn → Vorschlag: DateiKürzel+BlattIndex o.ä.
Bei Verwendung von InternNamen kann man aber nur dann zyklisch wechseln, wenn man alle relevanten Blätter zuvor mit ihren InternNamen als ObjektReferenz in Arrays auflistet.
Gruß, Luc :-?

Anzeige
AW: Das hat Daniel aber nicht geschrieben, ...
15.07.2014 07:33:10
Robert
Hallo Luc,
Ich muss gestehen, ich habe von deinem Text nur die Hälfte verstanden.
Meine Blätter und Workbooks werden vor ausführen des Codes über Comboboxen ausgewählt. Mein Code oben referenziert also den Inhalt dieser Combobox.
Ob man das jetzt als Internnamen oder als Varriable bezeichnet weiß ich nicht.
In der Beschreibung hatte ich eben WB(1), WB(2), Tabe(1) und tabe(2) als "Variablen" bezeichnet.
Ich habe das Problem jetzt nach einigem Rumprobieren so gelöst:
For Each rngCell In Workbooks(WB(tb)).Worksheets(tabe(tb)).Range(Workbooks(WB(tb)).Worksheets( _
tabe(tb)).Cells(s, 1), Workbooks(WB(tb)).Worksheets(tabe(tb)).Cells(s, endclmn(tb)))
strgHash = strgHash & rngCell.Value
Next

Sieht zwar nicht schön aus aber funktioniert.
Daniels Tipp mit dem .Resize hat mir irgendwie nur Fehler ausgespuckt.
Viele Grüße
Robert

Anzeige
AW: Das hat Daniel aber nicht geschrieben, ...
15.07.2014 09:01:47
Daniel
Ich habe dir doch geschrieben, warum!
Gruß, Daniel
;
Anzeige
Anzeige

Infobox / Tutorial

Hash/Prüfsumme für jede Zeile in Excel generieren


Schritt-für-Schritt-Anleitung

Um eine Hash-Prüfziffer für jede Zeile in Excel zu generieren, kannst du die folgende Schritt-für-Schritt-Anleitung verwenden. Wir nutzen VBA, um die Werte in den Zellen zu einer Zeichenkette zusammenzuführen und anschließend den Hashwert zu berechnen.

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu:

    • Rechtsklicke im Projekt-Explorer auf dein Projekt und wähle Einfügen > Modul.
  3. Füge den folgenden Code ein:

    Sub GeneriereHash()
       Dim wb As Workbook
       Dim ws As Worksheet
       Dim strgHash As String
       Dim rngCell As Range
       Dim s As Long
       Dim startRow As Long
       Dim endRow As Long
    
       Set wb = ThisWorkbook ' Das aktuelle Workbook
       Set ws = wb.Sheets("Tabelle1") ' Anpassung des Sheet-Namens
    
       startRow = 2  ' Startzeile
       endRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' Letzte Zeile
    
       For s = startRow To endRow
           strgHash = ""
           For Each rngCell In ws.Range(ws.Cells(s, 1), ws.Cells(s, 10)) ' Anpassen auf die Spaltenanzahl
               strgHash = strgHash & rngCell.Value
           Next rngCell
           ' Hashwert berechnen
           ws.Cells(s, 11).Value = Application.WorksheetFunction.Hash(strgHash) ' Setze den Hashwert in die 11. Spalte
       Next s
    End Sub
  4. Führe das Makro aus:

    • Drücke F5, um das Makro auszuführen und die Hashwerte zu berechnen.

Häufige Fehler und Lösungen

  • Fehler: "Objektvariable nicht festgelegt"

    • Lösung: Stelle sicher, dass du die richtigen Namen für Workbook und Worksheet verwendest. Überprüfe, ob die Blätter existieren.
  • Fehler: "Typen unverträglich"

    • Lösung: Vergewissere dich, dass die verwendete Hash-Funktion korrekt aufgerufen wird und die Eingabewerte den erwarteten Typen entsprechen.
  • Fehler: Hashwert wird nicht angezeigt

    • Lösung: Überprüfe, ob die Zellen, in die die Hashwerte geschrieben werden, korrekt referenziert sind.

Alternative Methoden

Wenn du keine VBA verwenden möchtest, kannst du auch die Excel-Funktion CONCATENATE (oder TEXTVERKETTEN in neueren Excel-Versionen) verwenden, um die Werte zu einer Zeichenkette zusammenzuführen. Anschließend kannst du eine Hash-Funktion in einer separaten Zelle anwenden.

Beispiel:

=TEXTVERKETTEN("", WAHR, A2:J2)

Praktische Beispiele

Beispiel 1: MD5 Hash berechnen Verwende eine benutzerdefinierte VBA-Funktion, um einen MD5-Hash zu generieren:

Function MD5Hash(ByVal Input As String) As String
    ' Füge hier den Code für die MD5-Hashberechnung ein
End Function

Rufe diese Funktion in einer Zelle auf:

=MD5Hash(A2)

Beispiel 2: GUID erzeugen Verwende die folgende VBA-Funktion, um eine GUID zu generieren:

Function GenerateGUID() As String
    GenerateGUID = CreateObject("Scriptlet.TypeLib").GUID
End Function

Tipps für Profis

  • Nutze die Hash-Funktion in Excel, um die Berechnung zu beschleunigen und direkte Berechnungen ohne VBA durchzuführen.
  • Versuche bei großen Datenmengen, die Berechnung in Arrays durchzuführen, um die Leistung zu verbessern.
  • Halte deine Hash-Funktion einfach und verwende nur die notwendigen Zellen, um die Effizienz zu maximieren.

FAQ: Häufige Fragen

1. Wie kann ich die Hash-Funktion in Excel verwenden? Die Hash-Funktion kann über VBA oder als benutzerdefinierte Funktion implementiert werden. Es gibt auch Add-Ins, die Hash-Funktionen bereitstellen.

2. Was ist der Unterschied zwischen MD5 und SHA-1? MD5 ist schneller, aber weniger sicher als SHA-1. Für sicherheitsrelevante Anwendungen sollte SHA-1 oder besser SHA-256 verwendet werden.

3. Kann ich Hashwerte automatisch aktualisieren? Ja, du kannst das Makro so einstellen, dass es bei jeder Änderung der Daten ausgeführt wird, indem du das Worksheet_Change-Ereignis verwendest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige