Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Solved] Excel VBA automatyczne wstawianie daty (dzień + godzina)

dMarshallb 12 Feb 2021 21:25 534 9
  • #1
    dMarshallb
    Level 4  
    Witam,
    Temat może prosty, ale dla mnie, osoby która zaczyna pracę z VBA, dość ciężki :(

    Chciałbym napisać makro, które po dwukrotnym kliknięciu w wybraną komórkę z kolumn B lub C wstawił aktualną datę (dzień yyyy-mm-dd i godzinę hh-mm-ss).

    Dobrze byłoby gdyby po wprowadzeniu daty w ten sposób, zablokować możliwość nadpisania tejże daty po ponownym dwukrotnym kliknięciu w tą komórkę (z już wcześniej wprowadzoną datą).

    Z góry Bardzo Dziękuję za Waszą pomoc.
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • #2
    Maciej Gonet
    VBA, Excel specialist
    Proponuję makro zdarzeniowe BeforeDoubleClick:
    Code: vbscript
    Log in, to see the code
    Makro jest umieszczone w kodzie arkusza Arkusz1 i działa tylko w tym arkuszu. Można go skopiować również do innych arkuszy.
    Gdyby miało działać we wszystkich lub prawie wszystkich arkuszach, to lepiej przenieść je do modułu skoroszytu, ale należałoby je minimalnie zmodyfikować.
    Data z czasem zapisana w takim formacie nie jest rozpoznawana jako data, dlatego sprawdzanie wypełnienia komórki oparłem na długości tekstu, która jest stała i wynosi 19 znaków.
    Załączam plik w formacie .xls ze względu na ograniczenie tego forum. Po odczytaniu można go zapisać w formacie .xlsm.
  • #3
    dMarshallb
    Level 4  
    Witam ponownie,
    Bardzo dziękuję za błyskawiczną odpowiedz i pomoc.
    Jednak data w formacie tekstu to nie to czego szukam :(.
    Chodzi o to, że dane (daty) przedstawione w ten sposób (tekstu) nie mogę przetwarzać w dalszych czynnościach.

    Data w kolumnie B rozumiana jest jako rozpoczęcie danej czynności, a data w kolumnie C jako data zakończenia tejże czynności.
    Różnica (=C1-B1) daje mi realny czas trwania danej operacji, który służy w dalszych kalkulacjach.

    Przeszukując fora, znalazłem taki oto sposób, który się sprawdza, ale nie blokuje komórki po wstawieniu daty (przez dwukliknięcie), czyli istnieje możliwość nadpisania datu już wcześniej wprowadzonej :(

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Range("B1:C10")) Is Nothing Then
    Target.Value = Now
    Target.NumberFormat = "yyyy-mm-dd hh:mm:ss"
    End If
    End Sub

    Nie wiem czy to jest dobry sposób, być może wg Twojej wiedzy można to zrobić w jeszcze prościej.
    Jednak ważne jest dla mnie, żeby wprowadzone dane można było dalej obrabiać.

    Z góry dziękuje za poświęcenie jeszcze odrobiny czasu w mojej sprawie.
    Pozdrawiam,
  • Helpful post
    #4
    Maciej Gonet
    VBA, Excel specialist
    Podałeś taki niestandardowy format z łącznikami między elementami czasu, zamiast dwukropków, więc zrozumiałem, że to jest istotne.
    Jeśli jednak chcesz mieć "prawdziwą" datę, to uzupełnij swój kod tak:
    Code: vbscript
    Log in, to see the code
    Linijka
    Code: vbscript
    Log in, to see the code
    jest po to, żeby po wstawieniu daty komórka nie była w trybie edycji (standardowo dwuklik na komórce przywołuje ją w stan edycji).
    Wiersz
    Code: vbscript
    Log in, to see the code
    powoduje wyjście z procedury gdy komórka zawiera już datę (jakąkolwiek).
    Pamiętaj jednak, że to jest tylko zabezpieczenie przed przypadkowym dwuklikiem na komórkę już wypełnioną. Komórkę można nadal skasować i wykonać nowy dwuklik albo można ją edytować i poprawić datę lub czas na inne.
  • #5
    dMarshallb
    Level 4  
    WOW,
    Super, Działa wybornie :) :)
    Bardzo Dziękuje za pomoc :)
    Być może dla Ciebie to drobnostka, ale dla mnie ogromna pomoc.
    Jeszcze raz Dziękuję :)

    Mam jeszcze jedno pytanie.
    Czy istniałaby możliwość dodania do kodu formuły, która wyświetlałaby komunikat o błędnym wprowadzeniu daty?
    Nie chodzi mi tutaj o format daty, ale zdarzało mi się, że osoby odpowiedzialne za wprowadzanie danych (dat rozpoczęcia i zakończenia czynności) zamieniały czas rozpoczęcia i zakończenia w wyniku czego otrzymywałem, po odjęciu, wartości ujemne czasu na wykonanie danej czynności :(
    Chodzi o to, żeby data rozpoczęcia (B1) była rozumiana jako wartość mniejsza od daty zakończenia.

    W przypadku kiedy tak nie jest, pojawiło się każdorazowo okienko o błędnym wprowadzeniu dat.
    Kliknięcie OK w okienku, zamyka okienko a pracownik wie, że musi zwrócić uwagę na daty i poprawić je w sposób właściwy.

    Dziękuje za rozpatrzenie jeszcze tej dodatkowej możliwości.

    Pozdrawiam
  • Helpful post
    #6
    Maciej Gonet
    VBA, Excel specialist
    Jeśli chodzi tylko o zamianę dat pomiędzy kolumnami B i C, to nie warto wyświetlać komunikatu i przymuszać użytkownika do jakichś działań, bo to nie jest całkiem oczywiste i w efekcie możesz dostać dwie jednakowe daty, zamiast oczekiwanej zamiany.
    Proponuję dwa warianty rozwiązania.
    1. Jeśli daty rozpoczęcia i zakończenia czynności są potrzebne tylko do obliczenia różnicy między nimi, to wystarczy użyć funkcji MODUŁ.LICZBY przy tym obliczeniu, aby ewentualną wartość ujemną zamienić na dodatnią, a wprowadzonych dat nie ruszać.
    2. Jeśli daty służą również do innych celów, to można je zamienić automatycznie rozbudowując trochę kod służący do wprowadzania dat.
    Po wierszu Target.NumberFormat... należy wstawić linie:
    Code: vbscript
    Log in, to see the code
  • #7
    dMarshallb
    Level 4  
    Dziękuję za propozycje rozwiązań.
    Problem jednak jest bardziej złożony :(

    Spotkałem się bowiem z takim oto działaniem ze strony osób uzupełniających raport zmianowy:
    Sytuacja dotyczy zmiany nocnej (22:oo - 6:oo dnia kolejnego).
    Osoba uzupełniająca raport nie wystartowała czasu pracy o np. 22:30 (klikając w komórkę B1 _ rozpoczęcie pracy).
    Pod koniec zmiany, o 5:30 dnia następnego, przystąpiła do wypełniania arkuszu klikając zarówno w B1 _ rozpoczęcie, jak i C1 _ zakończenie.
    Następnie poprawiła godzinę rozpoczęcia na 22:30, ale zapomniała o zmianie daty.
    W efekcie otrzymujemy wynik ujemny, którego nie można poprawić metodami które zaproponowałeś :(.

    Nie wiem czy istnieje jeszcze jakiś inny sposób poza zwróceniem uwagi operatora na błąd podczas wprowadzania daty i niejako wymuszeniu na nim wprowadzenia korekt :(.

    Pozdrawiam.
  • Helpful post
    #8
    Maciej Gonet
    VBA, Excel specialist
    Zrozumiałem, że błąd polega na omyłkowym kliknięciu w kolumnie C zamiast w B.
    Jeśli kolumny i godziny są wprowadzone prawidłowo, a problem stwarzają daty, to obliczenie różnicy można przeprowadzić wg wzoru:
    Code: text
    Log in, to see the code

    Jeśli zakłada się możliwość ręcznego wprowadzania danych, to potencjalnych możliwości błędu jest więcej.
    Poza tym przy ręcznym wprowadzaniu danych obsługa musiałaby być przez zdarzenie Change, a nie DoubleClick.
    To już jest inne zagadnienie niż obecny temat wątku.
    Przemyśl to całościowo, załóż nowy wątek, a w nim opisz dokładnie jakie działania operatorów dopuszczasz i przed jakimi błędami chcesz się zabezpieczyć.
  • #9
    dMarshallb
    Level 4  
    OK :)
    Jeszcze raz dziękuję za pomoc.

    Zamykam temat.

    Pozdrawiam.
  • #10
    dMarshallb
    Level 4  
    OK :)
    Jeszcze raz dziękuję za pomoc.

    Zamykam temat.

    Pozdrawiam.

    Dodano po 1 [minuty]:

    Temat zamknięty.