Excel-Visual Basic - wyszukiwanie identycznych wierszy





grzechura - 27 Lut 2008 13:34
W jaki sposob sprawdzic czy dwa wiersze sa identyczne - czyli wszystkie komorki w danych wierszach sa sobie rowne. Oczywiscie petla FOR w niej IF i potem sprawdzenie warunku, ale wlasnie jak?





marek003 - 27 Lut 2008 20:48
Nie jest to takie proste jak się wydaje jeżeli nie ma ograniczeń co do ilości wierszy i kolumn. Poza tym tych samych wierszy może być trzy lub cztery lub wszytkie i co wtedy ma robić program.
Tu wg mnie samo For i if nie wystarczy. Chociaż jak się uprzeć.

Najpierw trzeba stwierdzić ile jest wierszy i kolumn z danymi w arkuszu Tu lepiej by było wykorzystać pętle z warunkiem np Do ... Loop z While/Until.

I porównanie: zapętlona pętla w pętli przy czym jedna pętla zwiększa nr wiercza a druga nr kolumny. a w pętlach warunki
Do odczytu i porównania wykorzystaj Range.cells(wiersz,kolumna).value
I to by było tyle jeżeli by była jakaś stała. Stała liczba kolumn lub wierszy.

Ale przy nieograniczonej liczbie kolumn to trzeba by było to inaczej rozwiązać.



grzechura - 28 Lut 2008 14:54
To ze zadanie nie jest proste, to ja doskonale wiem. W przeciwnym razie nie zadalbym go:)

Liczba wierszy i kolumn, moze byc zadeklarowana ale nie musi - wtedy makro przeszukuje kazdy wiersz (65536) i porownuje ze soba cale wiersze (256 kolumn). Tak jak mowisz mozna to uproscic, podajac pewien zakres wierszy i kolumn jednak nie jest to konieczne.

Generlne po prawie 5 h roznych prob i testow problem rozwiazalem:))) Jako ciekawostek podam ze przeszukanie tablicy 5780 wierszy, kazdy wiersz ma 105 kolumn trwa ok 16h na Pentium 4.

Jezeli ktos potrzebuje to moge zamiescic to makro. Moze sie przyda komus...



marek003 - 28 Lut 2008 15:08
Zamieść, jak i tak już się namęczyłeś

Co robi program jak znajdzie identyczny cały wiersz?
A jak znajdzie trzy takie same?





grzechura - 28 Lut 2008 16:32
Program jest w stanie porownac kazdy wiersz z kazdym. Wiersz sklada sie z 105 kolumn. Do sprawdzenia jest 5780 wierszy. Parametry te definiujesz zmiennymi Nr_Zeile (wiersze) Nr_Spalte (kolumny) (z niemieckiego)
Jezeli i-ty wiersz rowny jest z j-tym, to na koncu i-tego wiersza, zostaja wypisane nr takich samych wierszy przedzielone "_:_". Zakladajac ze wiersz 1 jest rowny z 5 i 10, a wiersz 2 jest rowny z 3 to w 107 kolumnie wiersza 1 jest wpis 1_:_5 a w 108 1_:_10 a w 107 kolumnie wiersza 2 jest wpis 2_:_3.

Oto kod programu:

Sub Suche()
Dim i As Integer
Dim j As Integer
Dim Nr_Zeile As Integer
Dim Nr_Spalte As Integer
Dim spalte As Integer
Dim zeilegleich As Boolean

Nr_Zeile = 5780
Nr_Spalte = 105

For i = 2 To Nr_Zeile - 1
k = 0
For j = i + 1 To Nr_Zeile
zeilegleich = True
For spalte = 2 To Nr_Spalte
If Not (Cells(i, spalte).Value = Cells(j, spalte).Value) Then
zeilegleich = False
End If
Next spalte

If zeilegleich = True Then

Cells(i, Nr_Spalte + 2 + k) = CStr(i) + "_:_" + CStr(j)
k = k + 1
End If
Next j

Next i

End Sub