Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1368to1372
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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

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!

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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge