Bloquear e desbloquear células com base no valor em outra célula para tabelas

1

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;

  1. O meu conhecimento VBA ainda é muito amador e, por isso, não consegui adaptá-lo de forma eficaz
  2. 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 discountcoluna é "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 Matchpara 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).

MrMarho
fonte
Será que você acabou de esquecer de começar ActiveSheet.Unprotecte terminar ActiveSheet.Protect?
Jonathan
@ Jonathan acrescentou isso, mas ainda não funciona como esperado. Após cada Bus Discountseleçã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.
MrMarho
ok, então esse é o seu problema: você tem que começar com o cells.Locked = falseprimeiro desbloqueio de todas as células, então trancar o que você deseja ter bloqueado
Jonathan
esta linha de código viria antes Activesheet.Unprotectou depois e depois haveria alguma necessidade de bloquear depois de proteger a folha?
MrMarho
Como parece ser o seu problema eu escrevi como uma resposta, primeiro desproteger
Jonathan

Respostas:

0

Para ativar as células de bloqueio, você deve usar a função de proteção de folhas:

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
fonte
Ok apenas algumas perguntas 1. Eu quero ter algumas colunas da tabela bloqueadas ou não a folha fica desprotegida. Isso é possível? 2. Também deseja que a cor padrão das células bloqueadas seja cinza e, em seguida, se um usuário escolher um valor específico, ele não terá preenchimento. O que eu tenho até agora é
MrMarho
1. você poderia usar a validação de dados com validação = valor atual da célula. 2. use .Interior.Colorou .Interior.ColorIndexpara mudar a cor de suas células
Jonathan