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

VBA: Automatyczne wstawianie daty i godziny w D1 i J1 po zmianie H1 i M1

drak_2 21 Lip 2025 14:52 318 4
REKLAMA
  • #1 21612715
    drak_2
    Poziom 6  
    Posty: 3
    Piszę z problemem dotyczącym programowania w VBA (jestem zielony w tym temacie). Sprawa wygląda następująco, chcę, aby po wpisaniu wartości w komórce H1 w komórce D1 wpisywała się aktualna data i godzina, następnie po wpisaniu wartości w komórce M1 pokazywała się data i godzina w komórce J1 i dalej w pozostałych komórkach ta sama reguła. Udało mi się znaleźć kod, który rozwiązuje połowę mojego problemu, tzn. po wpisaniu wartości w komórkę H1 w komórce D1 pojawia się data, ale niestety nie umiem tego powtórzyć dalej :/

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("H:H")) Is Nothing Or Cells(Target.Row, 1) <> "" Then Exit Sub
    Cells(Target.Row, 4) = Now
    End Sub

    AI: Czy możesz podać dokładną listę wszystkich par komórek, dla których chcesz, żeby po wpisaniu wartości w jednej komórce automatycznie pojawiała się data i godzina w drugiej? Chodzi tylko o H1→D1 i M1→J1, czy jest więcej takich par?
    Nie, nie ma więcej takich par.
    AI: Czy ta reguła ma działać tylko dla pierwszego wiersza (np. H1, M1), czy dla całych kolumn (np. każda zmiana w kolumnie H wpisuje datę w kolumnie D w tym samym wierszu)?
    Ma działać dla całych kolumn
  • REKLAMA
  • Pomocny post
    #2 21612935
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Twój opis jest niezbyt precyzyjny. Nie wiadomo, co ma się stać, gdy raz wpisana wartość w kolumnie H lub M zostanie później zmieniona lub skasowana. Nie wiadomo, czy wpis w kolumnach H lub M może być dowolny, czy ma być jakoś walidowany (założyłem, że dowolny).
    Założyłem, że wpis będzie dokonywany zawsze w jednej komórce.
    Nie wiem, czy istotna jest kolejność wpisu. Wprawdzie użyłeś słowa "następnie", ale nie jestem pewien czy chodzi faktycznie o następstwo w czasie, czy to tylko taka konstrukcja zdania. Gdyby chodziło o następstwo w czasie, to co w przypadku, gdy wpis byłby najpierw w kolumnie M?
    Założyłem na razie, że kolejność wpisów nie jest istotna.

    Propozycja kodu jest taka:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Wyjaśnienie użytych konstrukcji.
    Najpierw ograniczam Target do kolumn H lub M.
    Jeśli Target nie należy do żadnej z nich, zakończ procedurę.
    Jeśli Target obejmuje kilka komórek, zakończ procedurę.
    Wyłącz obsługę zdarzeń na czas wykonywania procedury (chodzi o to, żeby procedura nie wzbudzała się ponownie po wpisie daty/czasu).
    W zależności od tego, czy Target jest w kolumnie H czy M, wpisz datę/czas do odpowiedniej kolumny (przesunięcia adresów są rożne, więc nie można tego połączyć).
    Po wpisaniu daty dopasuj szerokość kolumny.
    Załączniki:
    • Wstaw_daty.zip (12.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #3 21613640
    drak_2
    Poziom 6  
    Posty: 3
    Na wstępie dziękuję za pomoc. Masz rację, mogłem dodać więcej szczegółów, co z pewnością ułatwiłoby zadanie, niemniej jednak kod działa tak, jak chciałem. Mam jeszcze pytanie, czy kod da się jeszcze zmodyfikować, aby nie dało się edytować/usunąć daty z komórek w kolumnach D i J?
  • REKLAMA
  • Pomocny post
    #4 21614233
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Wypada zacząć od tego, że Excel nie jest twierdzą szyfrów i wszystkie zabezpieczenia są tu raczej symboliczne, to znaczy mają uświadomić użytkownikowi, że robi coś, czego robić nie powinien. Natomiast jeśli użytkownik jest zdeterminowany, to zawsze może znaleźć obejście, żeby coś niedozwolonego zrobić. W przypadku gdy zabezpieczenie bazuje na VBA, wystarczy wyłączyć makra i zabezpieczenie nie będzie działać.

    To, co napisałeś, ponownie nie jest jasne. Czy chodzi o zabezpieczenie dat w kolumnach D i J tylko przed bezpośrednią ręczną modyfikacją lub usunięciem, czy także o uniemożliwienie modyfikacji pośredniej - poprzez nowe wpisy w kolumnach H lub M? Przyjąłem, że chodzi o jakąkolwiek modyfikację, to znaczy gdy raz wpisana zostanie data do kolumny D lub J, to ma tam pozostać na stałe.

    Przesyłam dwie propozycje rozwiązania w osobnych plikach.
    W pierwszym pliku jest wykorzystany mechanizm ochrony arkusza. Jest to mechanizm Excela sterowany przez VBA. Hasło do ochrony arkusza jest "xxx". Ochrona jest włączana przy otwieraniu skoroszytu. Można ją jednak łatwo wyłączyć gdy poda się hasło. Chronione są komórki zawierające daty w kolumnach D i J. Można również zastosować ochronę symboliczną bez hasła.
    Stosowanie ochrony arkusza ogranicza w pewnym stopniu jego funkcjonalność, trzeba sprawdzić czy to, co poza tym wpisywaniem dat chcesz robić w arkuszu, da się wykonać.

    W drugim pliku jest zastosowany mechanizm cofania edycji (Application.Undo). Jeśli użytkownik wykonał edycję w kolumnach D lub J, a wcześniej w komórce była data, to ta edycja jest cofana. Również przy automatycznym wpisywaniu daty po edycji w kolumnach H lub M, wpis daty następuje wtedy gdy wcześniej w odpowiednich komórkach kolumn D lub J nie było daty.
    Załączniki:
    • Wstaw_daty2.zip (29.87 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #5 21622983
    drak_2
    Poziom 6  
    Posty: 3
    >>21614233 Jeszcze raz dziękuję za pomoc, wszystko działa tak, jak chciałem :). W kolejnych postach postaram się być bardziej precyzyjny.
REKLAMA