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;
- Ma connaissance de la VBA est encore très amateur et je n’ai donc pas pu l’adapter efficacement.
- 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).
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.
cells.Locked = false
pour déverrouiller d’abord toutes les cellules puis verrouiller celle que vous souhaitez verrouiller
Activesheet.Unprotect
ou après et y aura-t-il besoin de verrouiller ensuite après avoir protégé la feuille?
ActiveSheet.Unprotect
et finir avecActiveSheet.Protect
?