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;
- Moja wiedza na temat VBA jest nadal bardzo amatorska i dlatego nie byłem w stanie jej skutecznie dostosować
- 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).
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.
cells.Locked = false
aby najpierw odblokować wszystkie komórki, a następnie zablokuj tę, którą chcesz zablokować
Activesheet.Unprotect
lub po, a następnie czy będzie potrzeba zablokowania, a następnie ochrony arkusza?
ActiveSheet.Unprotect
i skończ zActiveSheet.Protect
?