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- wymuszanie informacji o błędnym wpisie

JaroFon 20 Wrz 2015 20:12 687 13
  • #1 20 Wrz 2015 20:12
    JaroFon
    Poziom 23  

    Witam. Jak w oknie MsgBox wymusić informację jeśli w danym zakresie komórek arkusza wpiszę dane które tam nie mogą być? Chodzi o to żeby w komórkach przez pomyłkę nie pojawiło się nic innego jak tylko cyfry. Żadnych liter, znaków specjalnych, interpunkcyjnych, plusów, minusów, tylko cyfry.

    0 13
  • Pomocny post
    #2 20 Wrz 2015 20:34
    markoz7874
    Poziom 31  

    Dane->sprawdzanie poprawności->kryteria poprawności ->pełna liczba

    0
  • Pomocny post
    #3 20 Wrz 2015 21:03
    Maciej Gonet
    Poziom 32  

    A nie wystarczy sprawdzanie poprawności danych - opcja pełna liczba i podać zakres od 0 albo od 1 do ile potrzeba. Jeśli dane wprowadzane z klawiatury i użytkownik nie jest złośliwy, to powinno wystarczyć. Co innego jeśli dane są kopiowane z innych komórek, wtedy ten mechanizm nie działa. Wstawiłem do A1.
    Komunikat MsgBox można wyświetlić przy zmianie wartości komórki przez procedurę obsługi zdarzenia Change. W procedurze trzeba określić zakres komórek, w jakim ma to być sprawdzane. Jeśli to konieczne, to na przykład dla zakresu A2:A4 mógłby być taki kod:

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    W razie błędu pozostawia pustą komórkę.

    0
  • #4 21 Wrz 2015 08:43
    JaroFon
    Poziom 23  

    Sprawdzanie poprawności danych było by wystarczające jednak problem w tym że nie mogę tej opcji ustawić odgórnie, dlatego że plik w którym ma być ta opcja jest tworzony z innego głównego pliku i zakres w którym ma działać sprawdzanie danych jest ruchomy. Dlatego sprawdzanie danych musi być włączone przez makro. Zakres w którym ma być ustawione sprawdzanie danych jest poniżej. Jak w tym makro ustawić ten zakres sprawdzania danych?

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #5 21 Wrz 2015 10:31
    Maciej Gonet
    Poziom 32  

    Dzień dobry,
    A co w tym kodzie oznacza "ark"? Czy nie jest to arkusz aktywny (ActiveSheet)?
    Poza tym czy 6 to stała? Jeśli tak, to po co tak komplikować ten adres, wystarczy

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    Poza tym, jak często zmienia się wartość "dstW"?
    W sumie można makrem uruchomić też sprawdzanie poprawności danych, tylko tę procedurę należałoby uruchamiać po każdej zmianie dstW. Kod byłby taki:
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    A jeśli chodzi o tę moją propozycję kodu w procedurze obsługi zdarzenia, to procedura powinna być wpisana do modułu arkusza "ark", a w samej treści zamiast
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    należy wpisać
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    TYlko ta zmienna dstW musi być widoczna dla tego zdarzenia, więc nie może być zadeklarowana wewnątrz jakiejś procedury, tylko przed procedurami w module ogólnym jako zmienna publiczna.
    Pozdrowienia

    0
  • #6 21 Wrz 2015 12:37
    JaroFon
    Poziom 23  

    @Maciej Gonet dzięki wielkie. Makro działa idealnie. O to mi właśnie chodziło. Nie wiedziałem ze można zrobić coś takiego że jak aktywuje komórkę z zakresu to cały czas wyświetla informacje. Ale zapomniałem jeszcze o jednym. Czy możesz mi pomóc przy dodaniu do makro jeszcze jednej opcji. W tym samym zakresie potrzebuje aby dodać informacje ze jeżeli do komórki wpisze wartość od 20 tysięcy w zwysz aby mnie o tym poinformowało cze taka wartość została wpisana i abym sprawdził czy się nie pomyliłem.

    0
  • #7 21 Wrz 2015 12:45
    Maciej Gonet
    Poziom 32  

    Już się pogubiłem. Dostałeś dwie propozycje - jedną z poprawnością danych, drugą z komunikatem w MsgBox - więc którą wybrałeś i gdzie ma być to ostrzeżenie o przekroczeniu wartości 20000?

    0
  • #8 21 Wrz 2015 12:54
    JaroFon
    Poziom 23  

    Wybrałem poniższy kod. Jest jak dla mnie najbardziej idealny. I do tego kodu czy można dodać taką informacje o wpisaniu wartości 20 tysięcy i powyżej. Problem w tym że zakres w którym ma to się wszystko dziać jest na początku niewiadomych. Dopiero po wygenerowania całej listy, dstW mówi jak daleko sięga zakres. Czyli ja z głównego pliku generuje listę, lista jest wstawiania do nowego pliku i tam właśnie poniższy kod wstawia odpowiednie formatowania. Jeśli to mało to wstawię Ci cały mój kod którym to robię.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #9 21 Wrz 2015 13:52
    Maciej Gonet
    Poziom 32  

    Procedura poprawności danych może sprawdzać w komórce tylko jeden warunek i podejmować jeden rodzaj akcji w razie niespełnienia tego warunku. Tak jak jest to w tej chwili napisane wpis poprawny to liczba całkowita od 1 do 1000

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    i jeśli warunek nie jest spełniony, zgłasza błąd krytyczny (liczbę trzeba koniecznie poprawić lub powrócić do poprzedniego wpisu, aby można było iść dalej).
    Wartość graniczną można oczywiście zmienić wg potrzeb, ale teraz pojawia się nowy warunek: przekroczenie 20000, ale już nie błąd krytyczny, tylko ostrzeżenie. Tego nie da się zrobić jednocześnie w procedurze poprawności danych. Albo procedura będzie pilnowała, żeby nie wprowadzać liczb ujemnych, ułamków ani tekstów i dla takiej procedury trzeba ustalić górną granicę, której nie wolno przekroczyć (jeśli nie ma takiej granicy, można podać dowolnie dużą liczbę), albo procedura będzie sprawdzała przekroczenie granicy 20000 i wyświetlała tylko komunikat ostrzegawczy (ale wtedy ułamki i liczby ujemne trzeba wyeliminować w inny sposób). Więc należałoby połączyć dwa rozwiązania - jedno sprawdzać za pomocą procedury poprawności danych, a drugie za pomocą zdarzeń - tylko które jak? Za pomocą procedury zdarzeniowej można korygować wpisy - ułamki zaokrąglać, liczby ujemne zamieniać na najmniejszą dopuszczalną, teksty ignorować, a w razie przekroczenia 20000 uruchomić kontrolę poprawności z ostrzeżeniem. Albo odwrotnie - sprawdzać poprawność w kontroli poprawności, a przekroczenie zakresu 20000 sygnalizować MsgBoxem.
    Nie wiem, który wariant jest bardziej odpowiedni.

    0
  • #10 21 Wrz 2015 16:05
    JaroFon
    Poziom 23  

    Sprawdzanie poprawności jakie tu zostało zaproponowane zostawię bo to dobre rozwiązanie. Co do informacji o wpisie wartości powyżej 20000 to zastosowałbym MsgBox. Problem w tym że jeśli chciałbym zastosować MsgBox to muszę w arkuszu odgórnie zapodać na jakim zakresie to ma działać a niestety arkusz nie wie jaki będzie zakres dopóki nie wygeneruję listę. Ale znalazłem na to sposób. Tak na prawdę arkusz wie gdzie będzie koniec zakresu bo w komórce E2 po wygenerowaniu listy pojawi się cyfra mówiąca o tym ile jest pozycji w liście a to jest po prostu koniec zakresu. Do E2 po generacji listy wkleja się wzorzec ILE.LICZB który mówi o tym ile jest pozycji w liście. Może na podstawie tego idzie wykorzystać te dane? Próbuje coś jak poniżej ale nie wiem jak to rozwinąć tak aby poprawnie działało i informowało o wpisach od 20000 i powyżej.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #11 21 Wrz 2015 20:16
    Maciej Gonet
    Poziom 32  

    Jeśli nie ma górnego ograniczenia dla wprowadzanych liczb procedurę Walidacji można zapisać też tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Natomiast procedurę zdarzeniową sygnalizującą przekroczenie wartości 20000 umieszczamy w module arkusza. Może ona wyglądać tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Procedura uruchamia się w komórkach, w których jest ustawiona walidacja. Jeśli wprowadzona wartość przekracza 20000, wyświetlany jest komunikat ostrzeżenia. Potwierdzenie pozostawia komórkę bez zmiany, odpowiedź negatywna kasuje wpis i pozostawia pustą komórkę.

    0
  • #12 21 Wrz 2015 20:49
    JaroFon
    Poziom 23  

    @Maciej Gonet jesteś wielki. Rewelacja. O to mi chodziło. Dałem tak jak w poniższym kodzie. W MsgBox dodałem informację jaką kwotę wpisałem. Jeszcze kombinuję czy można by dodać informację jakiemu pracownikowi dałem tą kwotę powyżej 20 000. Pracownik znajduje się w kolumnie B.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #13 21 Wrz 2015 21:13
    Maciej Gonet
    Poziom 32  

    Odwołanie do komórki z kolumny B w tym samym wierszu co Target:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0