Blokowanie i odblokowywanie komórek na podstawie wartości w innej komórce dla tabel

1

Jak dotąd w Internecie widziałem sposoby blokowania komórek w arkuszu Excela na podstawie innej wartości komórki, jednak nie znalazłem jeszcze niczego, co dotyczy przypadków, w których te komórki są zawarte w tabeli ze względu na dynamikę przynieść stół.

Poniżej mam kod VBA dostosowany do mojej aplikacji, ale nie działa.

Private Sub Worksheet_Change(ByVal Target As Range)    Dim tbl As ListObject
Set tbl = Worksheets("Nursery").ListObjects("TableName")


If Not Intersect(Target, tbl.ListColumns("Bus Discount").Range) Is Nothing Then
    Dim CellBusDiscount As Range
    Unprotect Password:="Secret"

    For Each CellBusDiscount In Intersect(Target, tbl.ListColumns("Bus Discount").Range)
        Select Case CellBusDiscount.Value
            Case "Yes"
                CellBusDiscount.Offset(0, Application.Worksheet.Function.Match("Bus Reason", tbl.HeaderRowRange, 0) - Application.WorksheetFunction.Match("Bus Discount", tbl.HeaderRowRange, 0)).Locked = False
                CellBusDiscount.Offset(0, Application.Worksheet.Function.Match("Bus Discount Amt", tbl.HeaderRowRange, 0) - Application.WorksheetFunction.Match("Bus Discount", tbl.HeaderRowRange, 0)).Locked = False
            Case "No"
                CellBusDiscount.Offset(0, Application.Worksheet.Function.Match("Bus Reason", tbl.HeaderRowRange, 0) - Application.WorksheetFunction.Match("Bus Discount", tbl.HeaderRowRange, 0)).Locked = True     
                CellBusDiscount.Offset(0, Application.Worksheet.Function.Match("Bus Discount Amt", tbl.HeaderRowRange, 0) - Application.WorksheetFunction.Match("Bus Discount", tbl.HeaderRowRange, 0)).Locked = True
            Case Else
                CellBusDiscount.Offset(0, Application.Worksheet.Function.Match("Bus Reason", tbl.HeaderRowRange, 0) - Application.WorksheetFunction.Match("Bus Discount", tbl.HeaderRowRange, 0)).Locked = True     
                CellBusDiscount.Offset(0, Application.Worksheet.Function.Match("Bus Discount Amt", tbl.HeaderRowRange, 0) - Application.WorksheetFunction.Match("Bus Discount", tbl.HeaderRowRange, 0)).Locked = True
        End Select
    Next cell
    Protect Password:="Secret"
End If 
End Sub

Możliwe powody, dla których to nie działa;

  1. Moja wiedza na temat VBA jest nadal bardzo amatorska i dlatego nie byłem w stanie jej skutecznie dostosować
  2. Metoda przecięcia zastosowana w kodzie może nie działać z tabelami.

Co staram się osiągnąć dokładnie za pomocą powyższego kodu?

Chciałbym się upewnić, że kolumny tabeli; "Bus Discount Amount" i "Bus Discount Reason" są zablokowane, istnieje Nie Zniżka autobusu (tj. Jeśli wartość w Bus discount kolumna jest "Tak" następnie podaj przyczynę zniżki (lista rozwijana) i wprowadź kwotę lub podaj kwotę wygenerowaną automatycznie w zależności od wyboru w „Powodzie zniżki na autobus”)

Użyłem również funkcji arkusza roboczego Match aby upewnić się, że wartość przesunięcia jest dynamiczna (tj. jeśli wstawię nową kolumnę tabeli, właściwość blokady komórki pozostanie taka sama).

MrMarho
źródło
Czy to możliwe, że zapomniałeś zacząć? ActiveSheet.Unprotect i skończ z ActiveSheet.Protect?
Jonathan
@ Jonathan dodał, ale nadal nie działa zgodnie z oczekiwaniami. Po każdym Bus Discount wybór komórki (tj. "Tak" lub "Nie" ) blokuje arkusz i oznacza, że ​​użytkownik musi ponownie otworzyć arkusz w każdym przypadku.
MrMarho
ok, to jest twój problem: musisz także zacząć od cells.Locked = false aby najpierw odblokować wszystkie komórki, a następnie zablokuj tę, którą chcesz zablokować
Jonathan
czy ta linia kodu pojawi się przed Activesheet.Unprotect lub po, a następnie czy będzie potrzeba zablokowania, a następnie ochrony arkusza?
MrMarho
Ponieważ wydaje się, że jest to twój problem, napisałem go jako odpowiedź, pierwszą ochronę
Jonathan

Odpowiedzi:

0

Aby aktywować komórki blokujące, musisz użyć funkcji ochrony arkusza:

Private Sub Worksheet_Change(ByVal Target As Range)    Dim tbl As ListObject
  ActiveSheet.Unprotect
  Cells.Locked = false # all cells can be edited (because excel default is Cells.Locked = true)

  #here your code where you set cells to Locked = true 
  ...
  #end of the code

  ActiveSheet.Protect
End Sub
Jonathan
źródło
Po prostu kilka pytań 1. Chcę, aby niektóre kolumny tabeli były zablokowane bez względu na to, czy arkusz zostanie niezabezpieczony. Czy to jest możliwe? 2. Chcemy także, aby domyślny kolor zablokowanych komórek był szary, a następnie, jeśli użytkownik wybierze określoną wartość, nie będą miały wypełnienia. Do tej pory mam
MrMarho
1. można użyć walidacji danych z walidacją = bieżąca wartość komórki. 2. użyj .Interior.Color lub .Interior.ColorIndex zmienić kolor twoich komórek
Jonathan