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.

Excel Makro Data i Godzina - Blokada przed zmianami

Raazor 17 Jul 2017 10:40 2313 12
  • #1
    Raazor
    Level 9  
    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.
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • Helpful post
    #2
    lanzul
    Level 30  
    Raazor wrote:
    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
    Code: vba
    Log in, to see the code

    lub coś takiego:

    Wariant II
    Code: vba
    Log in, to see the code

    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:
    Code: vba
    Log in, to see the code
  • #3
    Raazor
    Level 9  
    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.
  • Helpful post
    #4
    lanzul
    Level 30  
    Raazor wrote:
    ... "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
    Raazor
    Level 9  
    Sukcesywnie w miarę wpisywania danych w tym samym wierszu w zakresie kolumn 5 do 8.
  • Helpful post
    #6
    lanzul
    Level 30  
    Raazor wrote:
    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
    Raazor
    Level 9  
    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
    lanzul
    Level 30  
    '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):
    Code: vba
    Log in, to see the code

    "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ń:
    Code: vba
    Log in, to see the code
  • #9
    Raazor
    Level 9  
    Dziękuję lanzul, wszystko jest ok.
  • #10
    Raazor
    Level 9  
    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
    lanzul
    Level 30  
    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:
    Code: vba
    Log in, to see the code

    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 Download (21.72 kB)
  • #12
    STORNO
    Level 9  
    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
    clubs
    Level 36  
    To dodaj przy 'WorkSheet_Change'
    Code: dos
    Log in, to see the code