Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 1

Cześć.

Mam arkusz, w którym zablokowałem dostęp dla użytkowników do większości komórek. Użytkownik po otrzymaniu arkusza będzie musiał uzupełnić wybraną przez siebie ilość wierszy w dwóch wskazanych kolumnach (dokładnie E i F od wiersza 16), następnie po uzupełnieniu, chcę zablokować mu dostęp do tych kolumn.

Pomyślałem o przycisku, wciskanym przez użytkownika po ich uzupełnieniu.

Rozważałem też automatyczne blokowanie komórek niepustych przy zapisie lub zamykaniu skoroszytu, ale tylko ze wskazanych kolumn. Z tym, że to drugie rozwiązanie niesie niebezpieczeństwo zapisania błędnie wprowadzonych wartości.

Rozumiem, że bez VBA się nie obejdzie.

Z góry dziękuję za pomoc.
Paweł.

Paweł_Bartyna
  • Zapytał
  • @ Paweł_Bartyna | 18.01.2019
    • 1
    • 0
    • 0

Odpowiedź (1)

  • 0

Cześć.

Proponuję makra - dla porządku w sumie trzy:

1) Chroń_arkusz - blokuje arkusz z wyłączeniem kolumn e i f od wiersza 16.

2) Chroń_zakres - blokuje kolumny e i f od wiersza 16; przed zablokowaniem, makro prosi o potwierdzenie danych.

3) Nie_chroń - zdejmuje blokowanie z całego arkusza.

Przed użyciem trzeba zdefiniować hasło - wpisać je ręcznie we wszystkich makrach (aktualne hasło to "niezgadniesz").

Proszę pamiętać, że jeżeli chcemy zapisać plik z makrem, musimy go zapisać jako .xlsm - przy zapisywaniu wybrać typ: skoroszyt programu Excel z obsługą makr

Pozdrawiam.
Andrzej.

Sub Chroń_arkusz()

'definiujemy hasło (pamiętać o "")
Dim Hasło As String
Hasło = "niezgadniesz"

'blokujemy arkusz z wyłączeniem komórek w kolumnach e i f - od 16 wiersza do końca arkusza
Columns("E:F").Select
Selection.Locked = False
Range("e1:f15").Select
Selection.Locked = True
Range("a1").Select
ActiveSheet.Protect Password:=Hasło

End Sub


Sub Chroń_zakres()
'definiujemy hasło (pamiętaj o "")
Dim Hasło As String
Hasło = "niezgadniesz"

'makro prosi respondenta o potwierdzenie prawdłowości danych - jeżeli potwierdzi, blokujemy kolumnę e i f; jeżeli nie potwierdzi, prosi o poprawę danych
'można wpisać dowolny tekst/ instrukcję dla respondenta
If MsgBox("Czy potwierdzasz prawidłowość wprowadzonych danych?", vbYesNo) = vbYes Then

'blokujemy całą kolumnę e i f
ActiveSheet.Unprotect Hasło
Columns("E:F").Select
Selection.Locked = True
Range("a1").Select
ActiveSheet.Protect Password:=Hasło

'można wpisać dowolny tekst/ instrukcję dla respondenta
MsgBox "Dziękujemy za uzupełnienie danych."

Else
'można wpisać dowolny tekst/ instrukcję dla respondenta
MsgBox "Proszę poprawić wprowadzone dane."
End If

End Sub


Sub Nie_chroń()
'definiujemy hasło (pamiętaj o "")
Dim Hasło As String
Hasło = "niezgadniesz"

ActiveSheet.Unprotect Hasło
Range("a1").Select
End Sub

 

 

 

Andrzej_Jędrzejowski
  • Odpowiedział
  • @ Andrzej_Jędrzejowski | 24.01.2019
    • 0
    • 0
    • 0
Komentarze
Mała uwaga: poza sytuacjami, w których faktycznie chcesz zaznaczyć jakiś obszar (np. żeby wskazać coś użytkownikowi) nigdy nie używaj takich konstrukcji:

Columns("E:F").Select
Selection.Locked = False

Powoduje to wykonywanie niepotrzebnych operacji "graficznych", które znacznie wydłużają wykonywanie kodu. Zamiast tego wystarczy po prostu:

Columns("E:F").Locked = False

Warto też zadeklarować hasło jako stałą globalną (czyli np. na samej górze modułu, przed pierwszą procedurą), żeby nie trzeba było szukać i poprawiać go w wielu miejscach. Jeżeli chciałbyś mieć do niego dostęp również w innych modułach, dodaj na początku opcję "Public":

Const Hasło As String = "niezgadniesz"
Skomentował : @ Mirosław_Janiak ,29.01.2019
  • 1
  • 7
  • 1