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 Makro Data i Godzina - Blokada przed zmianami

Raazor 17 Lip 2017 10:40 3273 12
REKLAMA
  • #1 16592209
    Raazor
    Poziom 11  
    Posty: 6
    Witam, uruchomiłem w arkuszu makro, które po wpisaniu wartości w kolumnach 5,6,7,8 wpisuje automatycznie Datę w kolumnie "B" i Godzinę w kolumnie "C":

    Private Sub WorkSheet_Change(ByVal Target As Range)
    Dim i As Integer

    i = Target.Row
    If Target.Column = 5 Or Target.Column = 6 Or Target.Column = 7 Or Target.Column = 8 Then
    If Target.Cells <> a Then
    Range("B" & i).Value = Date
    Range("C" & i).Value = Time()
    End If
    End If

    End Sub

    Co zrobić, aby po po zmianie wartości w kolumnach 5,6,7,8; Data i godzina w kolumnach B i C pozostała niezmieniona.
  • REKLAMA
  • Pomocny post
    #2 16593100
    lanzul
    Poziom 30  
    Posty: 1023
    Pomógł: 199
    Ocena: 123
    Raazor napisał:
    Co zrobić, aby po po zmianie wartości w kolumnach 5,6,7,8; Data i godzina w kolumnach B i C pozostała niezmieniona.

    Odpowiadając tak na "sucho" ... trzeba do kodu dodać coś takiego:

    Wariant I
    Kod: text
    Zaloguj się, aby zobaczyć kod

    lub coś takiego:

    Wariant II
    Kod: text
    Zaloguj się, aby zobaczyć kod

    W I przypadku pominięte zostanie wpisywanie daty i godziny, jeśli obydwie komórki "B" i "C" będą niepuste
    W II przypadku pominięte zostanie wpisywanie daty i godziny, jeśli któraś z komórek "B" lub "C" będzie niepusta

    Zależy co się chce osiągnąć ostatecznie.

    Uwagi:
    1. Zapis "If Target.Column = 5 Or Target.Column = 6 Or Target.Column = 7 Or Target.Column = 8 Then" można skrócić do "If Target.Column >= 5 And Target.Column <= 8 Then"
    2. Brak deklaracji zmiennej "a" - no chyba, że jest to zmienna modułowa lub publiczna - tak na marginesie, to co to w ogóle jest to "a" ?
    3. Do procedury powinno się dodać "Application.EnableEvents = False" i "Application.EnableEvents = True" - nie będzie zbędnych "skoków" po wpisywaniu daty i godziny
    4. Zmienną "i = Target.Row" powinno się przesunąć pod "If Target.Cells <> a Then"
    5. Poza tym wystarczy samo "If Target <> a Then" - "Cells" jest odniesieniem do wszystkich komórek arkusza - chyba, że ma to jakieś "odniesienie" do innej części kodu, to wtedy trzeba "przemyśleć"
    6. Przydałoby się "On Error"

    zatem mogłoby to (choć nie musi) wyglądać całościowo tak, dla wariantu I:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #3 16593450
    Raazor
    Poziom 11  
    Posty: 6
    lanzul, zastosowałem makro które napisałeś dla wariantu I, Jest to właśnie to czego chciałem. Dziękuję bardzo.
    Dodano po 11 [godziny] 37 [minuty]:
    lanzul, czy mógłbyś poprawić aby wstawiało Datę w komórkach w zakresie od B11 do B2000 i Godzinę od C11 do C2000.
  • REKLAMA
  • Pomocny post
    #4 16595222
    lanzul
    Poziom 30  
    Posty: 1023
    Pomógł: 199
    Ocena: 123
    Raazor napisał:
    ... "a" czy mógłbyś poprawić aby wstawiało Datę w komórkach w zakresie od B11 do B2000 i Godzinę od C11 do C2000

    1. "a" co to jest to "a" w "If Target <> a" ?
    2. "zbiorczo", tj. hurtem (?), czy sukcesywnie w miarę wpisywania danych w tym samym wierszu w zakresie kolumn 5 do 8 ?

    ps: trzeba by wstawić kontrolę zmiennej "i" (wierszy)
  • #5 16595281
    Raazor
    Poziom 11  
    Posty: 6
    Sukcesywnie w miarę wpisywania danych w tym samym wierszu w zakresie kolumn 5 do 8.
  • REKLAMA
  • Pomocny post
    #6 16595366
    lanzul
    Poziom 30  
    Posty: 1023
    Pomógł: 199
    Ocena: 123
    Raazor napisał:
    Sukcesywnie w miarę wpisywania danych w tym samym wierszu w zakresie kolumn 5 do 8

    "a" co to jest to "a" w "If Target <> a" ?

    Tutaj też trzeba by chyba coś zmienić, bo wychodzi na to, że dwa razy jest sprawdzane, czy jakaś ".Value = "" ", czy też czemuś się równa jednak.
    W załączonym do tematu kodzie "a" zawsze jest 'puste', gdyż nigdzie nie ma żadnego przypisania jakiejkolwiek wartości, a nawet deklaracji i przy "Option Explicit" wszystko 'staje dęba'.
  • #7 16595526
    Raazor
    Poziom 11  
    Posty: 6
    Przepraszam że zawracałem Ci głowę, ale tylko dlatego że jestem bardzo cienki w temacie makr. Chciałem coś zrobić w swojej tabeli wykorzystując makro do Daty i Godziny. I tak bardzo dużo mi pomogłeś, bo według mnie, laika, bardzo dobrze to działa. Próbowałem sam kombinować aby zliczało to w określonym zakresie, ale cóż, nie powiodło się. Jeszcze raz wielkie dzięki lanzul.
  • #8 16595750
    lanzul
    Poziom 30  
    Posty: 1023
    Pomógł: 199
    Ocena: 123
    'A' jaki ma to związek z moim pytaniem o 'A' ... ?

    tajemnicA ???

    Zmodyfikuj sobie kod w taki sposób, jak poniżej (chociaż pewnie można na wiele innych):
    Kod: text
    Zaloguj się, aby zobaczyć kod

    "i = Target.Row" z powrotem idzie na początek przed linię z pierwszym "If"

    Jeśli "a" jest zbędne, to zakomentuj poniższe linie lub je usuń:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #9 16595857
    Raazor
    Poziom 11  
    Posty: 6
    Dziękuję lanzul, wszystko jest ok.
  • REKLAMA
  • #10 17017127
    Raazor
    Poziom 11  
    Posty: 6
    Witam

    Zastosowałem poniższy kod w arkuszu excela 2007, który automatycznie wstawia mi datę i godzinę . Jest ok. Jednak czy mógłby ktoś mi pomóc i tak zmodyfikował kod, aby komórki w których jest data i godzina, blokowane były przed edycją, np. hasłem. Kiedy próbowałem włączyć ochronę arkusza to wyskakuje komunikat Błąd !. Z góry dziękuję za pomoc.


    Private Sub WorkSheet_Change(ByVal Target As Range)
    Dim i As Integer

    On Error GoTo koniec
    i = Target.Row
    If (Target.Column >= 5 And Target.Column <= 6) And (i >= 5 And i <= 5000) Then
    If Range("B" & i).Value = "" And Range("C" & i).Value = "" Then
    Application.EnableEvents = False
    Range("B" & i).Value = Date
    Range("C" & i).Value = Time()
    Application.EnableEvents = True
    End If
    End If

    Exit Sub
    koniec: MsgBox "Błąd !"
    End Sub
  • #11 17019930
    lanzul
    Poziom 30  
    Posty: 1023
    Pomógł: 199
    Ocena: 123
    Wariant z blokowaniem zakresu komórek przy otwieraniu i zamykaniu zeszytu.
    1. Na wszelki wypadek w procedurze 'Private Sub WorkSheet_Change(ByVal Target As Range)', w danym arkuszu, zmienić deklarację zmiennej z 'Dim i As Integer' na 'Dim i As Long'
    2. W module 'ThisWorkbook' wkleić kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Odpowiednio ustawiając wartości argumentów można sterować blokowaniem/odblokowaniem elementów arkusza.
    Powyżej odblokowane wszystko z wyjątkiem usuwania kolumn, wierszy i zawartości blokowanych komórek.
    3. W edytorze vba ustawic blokadę i hasło na przegląd makr
    Excel Makro Data i Godzina - Blokada przed zmianamiBlokada ed...ra vba.jpg (21.72 kB)Musisz być zalogowany, aby pobrać ten załącznik.
  • #12 17831919
    STORNO
    Poziom 10  
    Posty: 6
    Ocena: 1
    Jest super rozwiązanie dla mnie ale nie działa mi korzystając z poniższego KODU. Dalej wyskakuje mi błąd.
    Proszę o pomoc.

    Option Explicit

    Private Sub WorkSheet_Change(ByVal Target As Range)
    Dim i As Long

    i = Target.Row
    If (Target.Column >= 5 And Target.Column <= 6) And (i >= 5 And i <= 5000) Then
    If Range("B" & i).Value = "" And Range("C" & i).Value = "" Then
    Application.EnableEvents = False
    Range("B" & i).Value = Date
    Range("C" & i).Value = Time()
    Application.EnableEvents = True
    End If
    End If

    End Sub

    Private Sub bumtarara_bumtarara()
    Const hdfghdf As String = "12345678" 'Hasło - zmienić sobie

    With ThisWorkbook
    With .Sheets("Arkusz1")
    'Opcja 'UserInterFaceOnly:=True' umożliwia swobodne działanie makr przy zablokowanym arkuszu
    .Protect Password:=hdfghdf, _
    DrawingObjects:=False, _
    Contents:=True, _
    Scenarios:=False, _
    UserInterFaceOnly:=True, _
    AllowFormattingCells:=True, _
    AllowFormattingColumns:=True, _
    AllowFormattingRows:=True, _
    AllowInsertingColumns:=True, _
    AllowInsertingRows:=True, _
    AllowInsertingHyperlinks:=True, _
    AllowDeletingColumns:=False, _
    AllowDeletingRows:=False, _
    AllowSorting:=True, _
    AllowFiltering:=True, _
    AllowUsingPivotTables:=True
    .Cells.Locked = False 'Wypróbować sobie, czy wszystkie inne, jak poniższe, mają być stale odblokowane
    .Range("B5:C5000").Locked = True 'Obszar zablokowanych komórek
    End With
    End With
    End Sub

    Dodano po 24 [minuty]:

    Nie dział przy chronionym arkuszu.
  • #13 17832170
    clubs
    Poziom 38  
    Posty: 2219
    Pomógł: 629
    Ocena: 406
    To dodaj przy 'WorkSheet_Change'
    Kod: Dos
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Użytkownik uruchomił makro w Excelu, które automatycznie wstawia datę i godzinę do kolumn B i C po zmianie wartości w kolumnach 5-8. Aby zablokować edycję tych komórek po ich wypełnieniu, zaproponowano modyfikacje kodu, w tym dodanie warunków sprawdzających, czy komórki B i C są puste przed ich wypełnieniem. Użytkownik poprosił o dalsze zmiany, aby ograniczyć działanie makra do zakresu od B11 do B2000 oraz o wprowadzenie hasła do ochrony tych komórek. W odpowiedziach zasugerowano również użycie opcji `UserInterFaceOnly` w celu umożliwienia działania makr przy zablokowanym arkuszu.
Wygenerowane przez model językowy.
REKLAMA