Verrouillage et déverrouillage des cellules en fonction de la valeur dans une autre cellule pour les tableaux

1

Jusqu'à présent, j'ai trouvé sur Internet des moyens de verrouiller les cellules dans une feuille de calcul Excel basée sur une autre valeur de cellule. Toutefois, je n'ai encore trouvé aucun élément qui concerne les cas où ces cellules sont contenues dans un tableau en raison du dynamisme table apporter.

Ci-dessous, le code VBA est adapté à ma propre application, mais cela ne fonctionne pas.

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

Raisons possibles pour lesquelles cela ne fonctionne pas;

  1. Ma connaissance de la VBA est encore très amateur et je n’ai donc pas pu l’adapter efficacement.
  2. La méthode Intersect utilisée dans le code peut ne pas fonctionner avec les tables.

Qu'est-ce que j'essaie de réaliser exactement avec le code ci-dessus?

Je voudrais m'assurer que les colonnes de la table; "Bus Discount Amount" et "Bus Discount Reason" sont verrouillés il y a Non Remise de bus (c'est-à-dire si la valeur dans le Bus discount la colonne est "Oui" puis indiquez le motif de la réduction (liste déroulante) et entrez le montant ou faites-le générer automatiquement en fonction de la sélection dans "Motif de la réduction pour bus")

J'ai aussi utilisé la fonction de feuille de calcul Match pour vous assurer que la valeur de décalage est dynamique (c.-à-d. si j'insère une nouvelle colonne de table, la propriété de verrouillage de cellule restera la même).

MrMarho
la source
Serait-ce que vous avez juste oublié de commencer ActiveSheet.Unprotect et finir avec ActiveSheet.Protect?
Jonathan
@ Jonathan a ajouté cela, mais ne fonctionne toujours pas comme prévu. Après chaque Bus Discount sélection de cellules (c.-à-d. "Oui" ou "Non" ) il verrouille la feuille et signifie que l'utilisateur doit rouvrir la feuille à chaque fois.
MrMarho
ok donc c'est ton problème: il faut aussi commencer par cells.Locked = false pour déverrouiller d’abord toutes les cellules puis verrouiller celle que vous souhaitez verrouiller
Jonathan
cette ligne de code viendrait-elle avant la Activesheet.Unprotect ou après et y aura-t-il besoin de verrouiller ensuite après avoir protégé la feuille?
MrMarho
Comme il semble que ce soit votre problème, je l’ai écrit comme une réponse, d’abord sans protection
Jonathan

Réponses:

0

Pour activer les cellules de verrouillage, vous devez utiliser la fonction de protection de la feuille:

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
la source
Ok, juste quelques questions 1. Je veux que certaines colonnes de la table soient verrouillées, que la feuille ne soit pas protégée ou non. Est-ce possible? 2. Vous souhaitez également que la couleur par défaut des cellules verrouillées soit grisée, puis si un utilisateur choisit une valeur spécifique, il n’a pas de remplissage. Ce que j'ai jusqu'ici c'est
MrMarho
1. vous pouvez utiliser la validation des données avec validation = valeur de cellule actuelle. 2. utiliser .Interior.Color ou .Interior.ColorIndex changer la couleur de vos cellules
Jonathan