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

Excel [VB] porównanie komórek w dwóch wierszach

Alvares83 10 Cze 2011 09:02 3394 8
  • #1 10 Cze 2011 09:02
    Alvares83
    Poziom 9  

    W kolumnie D i E (około 100 wierszy) mam wartości liczbowe (formatowane jako liczby), które są wynikiem innych działań (dokładnie suma.warunków). Szukam sposobu aby Excel poinformował mnie (najlepiej poprzez msgbox) gdy wartość w danej komórce w kolumnie E będzię większa od odpowiadającej jej wierszem komórce w kolumnie D.
    Znalazłem coś takiego:

    Cytat:
    Private Sub Worksheet_Change(ByVal Target As Range)

    pocoto = "ble"
    wiersz = Range("B3", "B222") _
    .Find(what:=pocoto).Row

    Do Until Start = wiersz
    With Sheets("KONTRAHENT")
    If Cells(wiersz, "d") < Cells(wiersz, "e") Then
    szukanywiersz = wiersz
    Exit Do
    Else
    Start = wiersz
    wiersz = Range("B" & Start, "B222") _
    .Find(what:=pocoto).Row
    End If
    End With
    Loop

    If IsEmpty(szukanywiersz) Then
    MsgBox "Nie znaleziono"
    Else
    MsgBox "Sprawdz " & Cells(szukanywiersz, "C")

    End If

    End Sub



    Działa to poprawnie (choć podaje tylko jeden wiersz nawet gdy warunek spełnia kilka wierszy) ale uwarunkowane jest kolumną B, co jest mi niepotrzebne, a wręcz przeszkadza. Ma ktoś pomysł jak to zmodyfikować?

    0 8
  • #2 10 Cze 2011 19:24
    adamas_nt
    Moderator Programowanie

    Alvares83 napisał:
    Działa to poprawnie (choć podaje tylko jeden wiersz nawet gdy warunek spełnia kilka wierszy) ale uwarunkowane jest kolumną B, co jest mi niepotrzebne, a wręcz przeszkadza. Ma ktoś pomysł jak to zmodyfikować?
    Należałoby wstawić jakiś licznik przebiegów, usunąć polecenie opuszczenia pętli i zmodyfikować zakresy. Szczególnie zmienna "wiesz", która otrzymuje wartość wiersza zawierającego określony ciąg (w przykładzie "ble") w kolumnie B, a w Twoim przypadku, zdaje się, zupełnie zbędna.

    Jeśli porównanie ma odbywać się przy zdarzeniu "Change" opisz dokładniej: jakiego zakresu dotyczy zmiana, co z czym ma być porównywane...

    0
  • #3 10 Cze 2011 19:45
    Alvares83
    Poziom 9  

    Np. w arkuszu 3 w C3 jest tekst "paliwo", w D3 jest funkcja suma.warunków zliczająca odpowiednie dane z arkusza 1 (zwroty kosztów paliwa), w E3 jest funkcja suma.warunków zliczająca odpowiednie dane z arkusza 2 (koszty poniesione). W kolumnie C prócz paliwa jest jeszcze 100 innych rzeczy do rozliczania, i komórki w kolumnach D i E posiadają funkcje suma.warunków do zliczania odpowiednich danych. Chciałbym aby gdy wartość np E78 (koszty poniesione na jedzenie) będzie większa od D78 (zwrot kosztów jedzenie) to excel poinformuje mnie o tym poprzez message :)

    Add:

    adamas_nt napisał:

    Jeśli porównanie ma odbywać się przy zdarzeniu "Change" opisz dokładniej: jakiego zakresu dotyczy zmiana, co z czym ma być porównywane...
    Masz racje, moje nie dopatrzenie, już zmieniłem na "Calculate".

    0
  • #4 11 Cze 2011 23:46
    adamas_nt
    Moderator Programowanie

    W takim przypadku oprogramowane powinny być zakresy, do których wpisujesz dane mające wpływ na wartości w E78 i D78 przy zdarzeniu Change (w przykładzie A2:B200). Natomiast analizowane te dwie komórki wynikowe. Np

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #5 12 Cze 2011 00:55
    Alvares83
    Poziom 9  

    Podany kod działa tylko dla wiersza 78, a ja wierszy do sprawdzania mam 100 (przecież nie bedę pisał formuły dla wszystkich stu wierszy).

    Zanim znalazłem makro z pętlą używałem:

    Cytat:
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim zakres As Range
    Dim kom As Range
    Set zakres = Range("bw1:bw999")
    If Not zakres Is Nothing Then
    For Each kom In zakres
    If kom < kom.Offset(0, 1) Then
    MsgBox "komunikat"
    End If
    Next
    End If
    End Sub
    jednak w msgbox nie mam info w jakim wierszu spełniony jest warunek, więc musiałem jakoś najpierw znaleźć wiersz.

    Na chwilę obecną mój kod wygląda następująco:
    Cytat:
    Private Sub Worksheet_Calculate()
    pocoto = "ble"
    wiersz = Range("Bz1", "Bz2222") _
    .Find(what:=pocoto).Row
    Do Until Start = wiersz
    If Cells(wiersz, "bw") < Cells(wiersz, "bx") Then
    szukanywiersz = wiersz
    Exit Do
    Else
    Start = wiersz
    wiersz = Range("Bz" & Start, "Bz2222") _
    .Find(what:=pocoto).Row
    End If
    Loop
    If szukanywiersz > 0 Then
    MsgBox "Sprawdz " & Cells(szukanywiersz, "bv")
    Else 'docelowo zostanie usunięte
    MsgBox "jest ok"
    End If
    End Sub
    ale dalej nie wiem jak pozbyć warunkowania inną (BZ) kolumną.

    0
  • Pomocny post
    #6 12 Cze 2011 08:05
    adamas_nt
    Moderator Programowanie

    Chyba złapałem. Moim zdaniem nie powinna to być procedura zdarzeniowa, a zwykłe makro. Jeśli chodzi o coś takiego:
    Excel [VB] porównanie komórek w dwóch wierszach

    Spróbuj w ten sposób

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Można też zdefiniować zakres i posłużyć się pętlą For Each kom in zakres.

    0
  • #7 12 Cze 2011 12:07
    Alvares83
    Poziom 9  

    1. Makro odpada ponieważ po każdej dodanej wartości wchodzącej w wynik komórek w kolumnach BW i BX musiałbym uruchamiać makro.
    2. Podane przez Ciebie makro dalej uzależnione jest od kolumny bz, co mi przeszkadzało, więc wywaliłem pierwsze if, a kolumne w while wstawiłem BV (jeśli nie ma wartośći w BV, to nie ma co liczyć w BW i BX).
    3. Nie potrzebuję wiedzieć za każdym razem że "jest ok", więc zmodyfikowałem trzecie if i wywaliłem else.

    Na chwilę obecną kod wygląda tak:

    Cytat:
    Private Sub Worksheet_Calculate()

    wiersz = 2

    While Cells(wiersz, "bv") <> ""

    If Cells(wiersz, "bw") < Cells(wiersz, "bx") Then
    MsgBox "Sprawdz " & Cells(wiersz, "bv")
    licznik = licznik + 1

    End If

    wiersz = wiersz + 1

    Wend

    If licznik > 0 Then

    MsgBox "Liczba znalezionych: " & licznik

    End If

    End Sub
    i jak narazie działa bez zastrzeżeń. Wielkie podziękowania dla adamasa.

    P.S. w jaki sposób "cytujesz" kod Visual Basic że wygląda tak jak wygląda?

    0
  • #8 12 Cze 2011 12:49
    adamas_nt
    Moderator Programowanie

    Czyli nie złapałem ;)

    Excel [VB] porównanie komórek w dwóch wierszach
    Zaznaczasz kod i wybierasz z listy "Listing kodu". Lub odwrotnie, wstawiasz znaczniki i kod wklejasz pomiędzy...

    0
  • #9 12 Cze 2011 12:57
    Alvares83
    Poziom 9  

    Jeszcze raz wielkie dzięki ;)

    0