Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel-Visual Basic - wyszukiwanie identycznych wierszy

27 Lut 2008 12:34 3830 9
  • Poziom 17  
    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?
  • Poziom 40  
    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ć.
  • Poziom 17  
    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...
  • Poziom 40  
    Zamieść, jak i tak już się namęczyłeś :)

    Co robi program jak znajdzie identyczny cały wiersz?
    A jak znajdzie trzy takie same?
  • Poziom 17  
    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
  • Poziom 2  
    Witam

    Próbowałem zastosować ten kod ale otrzymuje informacje "varaible not defined i k= 0 jest podświetlone. Czy możecie pomóc.

    Dim i As Integer
    Dim j As Integer
    Dim Nr_wiersza As Integer
    Dim Nr_kolumny As Integer
    Dim kolumna As Integer
    Dim wiersz As Boolean

    Nr_wiersza = 5780
    Nr_kolumny = 6

    For i = 2 To Nr_wiersza - 1
    k = 0
    For j = i + 1 To Nr_wiersza
    wiersz = True
    For kolumna = 2 To Nr_kolumny
    If Not (Cells(i, kolumna).Value = Cells(j, kolumna).Value) Then
    wiersz = False
    End If
    Next kolumna


    If wiersz = True Then

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

    Next i
  • Poziom 2  
    Dzięki

    Ale kod zawiesza mi PC.

    Trzeba będzie nowy sprzęt kupić.
  • Poziom 40  
    W dzisiejszych "Excelach" zamienił bym zmienne Integer na Double.
    Bo ilość wierszy może przekroczyć zakres Integer i wywali błąd.
  • Poziom 27  
    Wystarczy zmiana typu zmiennych na long.

    @wxyz1986
    na początku makra wyłącz odświeżanie ekranu oraz automatyczne przeliczanie formuł (jeśli masz) a makro powinno przyspieszyć
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Na końcu kodu oczywiście nie zapomnij ponownie włączyć tych właściwości
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Można jeszcze spróbować użyć dodatku Fuzzy Lookup