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 [VB] - MsgBox przy większej wartości w kolumnie E niż D

Alvares83 10 Cze 2011 09:02 4864 8
REKLAMA
  • #1 9595757
    Alvares83
    Poziom 10  
    Posty: 36
    Ocena: 3
    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ć?
  • REKLAMA
  • #2 9597492
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    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...
  • REKLAMA
  • #3 9597564
    Alvares83
    Poziom 10  
    Posty: 36
    Ocena: 3
    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".
  • #4 9601824
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    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: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 9601963
    Alvares83
    Poziom 10  
    Posty: 36
    Ocena: 3
    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ą.
  • Pomocny post
    #6 9602108
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Chyba złapałem. Moim zdaniem nie powinna to być procedura zdarzeniowa, a zwykłe makro. Jeśli chodzi o coś takiego:
    Excel [VB] - MsgBox przy większej wartości w kolumnie E niż D

    Spróbuj w ten sposób
    Kod: text
    Zaloguj się, aby zobaczyć kod
    Można też zdefiniować zakres i posłużyć się pętlą For Each kom in zakres.
  • #7 9602675
    Alvares83
    Poziom 10  
    Posty: 36
    Ocena: 3
    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?
  • REKLAMA
  • #8 9602846
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Czyli nie złapałem ;)

    Excel [VB] - MsgBox przy większej wartości w kolumnie E niż D
    Zaznaczasz kod i wybierasz z listy "Listing kodu". Lub odwrotnie, wstawiasz znaczniki i kod wklejasz pomiędzy...
  • #9 9602875
    Alvares83
    Poziom 10  
    Posty: 36
    Ocena: 3
    Jeszcze raz wielkie dzięki ;)

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukuje sposobu na automatyczne powiadamianie w Excelu za pomocą MsgBox, gdy wartość w kolumnie E jest większa niż odpowiadająca jej wartość w kolumnie D. W odpowiedziach zasugerowano m.in. użycie procedury zdarzeniowej Worksheet_Change oraz pętli do przeszukiwania wierszy. Użytkownik zauważył, że dotychczasowe rozwiązania były ograniczone do pojedynczego wiersza lub wymagały dodatkowych warunków, co było niepraktyczne. Ostatecznie, po modyfikacjach, użytkownik uzyskał działający kod, który nie wymagał uruchamiania makra po każdej zmianie danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA