Até agora, na internet, tenho visto maneiras pelas quais se pode bloquear células em uma planilha excel com base em outro valor de célula, no entanto, ainda estou para encontrar qualquer coisa que se relaciona com casos em que essas células estão contidas em uma tabela devido ao dinamismo mesa trazer.
Abaixo eu tenho o código VBA adaptado para atender a minha própria aplicação, mas não funciona.
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
Possíveis razões pelas quais isso não funciona;
- O meu conhecimento VBA ainda é muito amador e, por isso, não consegui adaptá-lo de forma eficaz
- O método Intersect usado no código pode não funcionar com tabelas.
O que estou tentando alcançar exatamente com o código acima?
Eu gostaria de ter certeza das colunas da tabela; "Bus Discount Amount"
e "Bus Discount Reason"
são bloqueados é que há Nenhum desconto Bus (ou seja, se o valor na Bus discount
coluna é "Sim" , em seguida, indicar o motivo para a (lista suspensa desconto) e insira o valor ou ter o valor gerado automaticamente, dependendo da seleção na "Bus Razão de desconto ")
Também usei a Função de Planilha Match
para garantir que o valor de deslocamento seja dinâmico (ou seja, se eu inserir uma nova coluna de tabela, a propriedade de bloqueio de célula permanecerá a mesma).
fonte
ActiveSheet.Unprotect
e terminarActiveSheet.Protect
?Bus Discount
seleção de célula, (ou seja, "Sim" ou "Não" ), ela bloqueia a planilha e significa que o usuário precisa reabrir a planilha em todas as instâncias.cells.Locked = false
primeiro desbloqueio de todas as células, então trancar o que você deseja ter bloqueadoActivesheet.Unprotect
ou depois e depois haveria alguma necessidade de bloquear depois de proteger a folha?Respostas:
Para ativar as células de bloqueio, você deve usar a função de proteção de folhas:
fonte
.Interior.Color
ou.Interior.ColorIndex
para mudar a cor de suas células