logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Excel-Visual Basic - wyszukiwanie identycznych wierszy

grzechura 27 Lut 2008 12:34 4151 9
REKLAMA
  • #1 4850873
    grzechura
    Poziom 17  
    Posty: 334
    Pomógł: 7
    Ocena: 5
    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?
  • REKLAMA
  • #2 4852436
    marek003
    Poziom 40  
    Posty: 4601
    Pomógł: 799
    Ocena: 483
    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ć.
  • REKLAMA
  • #3 4854879
    grzechura
    Poziom 17  
    Posty: 334
    Pomógł: 7
    Ocena: 5
    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...
  • #4 4854929
    marek003
    Poziom 40  
    Posty: 4601
    Pomógł: 799
    Ocena: 483
    Zamieść, jak i tak już się namęczyłeś :)

    Co robi program jak znajdzie identyczny cały wiersz?
    A jak znajdzie trzy takie same?
  • REKLAMA
  • #5 4855184
    grzechura
    Poziom 17  
    Posty: 334
    Pomógł: 7
    Ocena: 5
    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
  • #6 16267393
    wxyz1986
    Poziom 2  
    Posty: 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
  • REKLAMA
  • #8 16267507
    wxyz1986
    Poziom 2  
    Posty: 2
    Dzięki

    Ale kod zawiesza mi PC.

    Trzeba będzie nowy sprzęt kupić.
  • #9 16298205
    marek003
    Poziom 40  
    Posty: 4601
    Pomógł: 799
    Ocena: 483
    W dzisiejszych "Excelach" zamienił bym zmienne Integer na Double.
    Bo ilość wierszy może przekroczyć zakres Integer i wywali błąd.
  • #10 16298372
    cbrman
    Poziom 27  
    Posty: 441
    Pomógł: 177
    Ocena: 61
    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: text
    Zaloguj się, aby zobaczyć kod


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


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

Podsumowanie tematu

✨ Dyskusja dotyczy metody porównywania identycznych wierszy w arkuszu Excel za pomocą Visual Basic for Applications (VBA). Problem polega na sprawdzeniu, czy wszystkie komórki w dwóch wierszach są równe. Proponowane rozwiązanie to zagnieżdżone pętle: zewnętrzna iterująca po wierszach, wewnętrzna po kolumnach, z warunkiem porównującym wartości komórek (Range.Cells(wiersz, kolumna).Value). Przykładowy kod VBA porównuje 5780 wierszy po 105 kolumn, wypisując numery identycznych wierszy w dodatkowych kolumnach. Wskazano, że zmienne typu Integer mogą być niewystarczające dla dużej liczby wierszy i kolumn, dlatego zaleca się użycie typu Long lub Double. Aby przyspieszyć działanie makra, sugerowano wyłączenie odświeżania ekranu i automatycznego przeliczania formuł w Excelu podczas wykonywania skryptu. Wspomniano także o dodatku Fuzzy Lookup jako alternatywnej metodzie porównywania danych. Problemy z wydajnością i zawieszaniem się komputera podczas działania makra wskazują na wysokie wymagania obliczeniowe przy dużych zakresach danych.
Wygenerowane przez model językowy.
REKLAMA