2012-02-07 3 views
7

Je reçois l'erreur d'exécution 1004, "Impossible de définir la propriété Locked de la classe Range" lorsque, en essayant de définir la propriété Locked d'un objet Range. Le code ressemble à ceci:Erreur 1004 lors de la définition Range.Locked

that_goddamn_sheet.Unprotect 

; Determine if we should proceed 

that_goddamn_range.Locked = True 

; Do more stuff 

that_goddamn_sheet.Protect 

Quand je mets un point d'arrêt sur la ligne et essayer d'interroger la valeur de that_goddamn_range.Locked de la fenêtre immédiate, cela fonctionne sans problème, mais la mise en échec.

Si, cependant, je cours that_goddamn_range.Select, cassez la macro, déprotéger la feuille (elle est reprotégée automatiquement lors du changement de sélection) puis faites un clic droit, choisissez Propriétés, passez à l'onglet Protection et cochez Verrouillé puis confirmez, les choses fonctionnent bien .

Que pourrait-il y avoir de mal?

+0

Quel est le texte du message d'erreur? –

+0

@Tim Bon point, inclus dans la question. – badp

Répondre

3

[the sheet] gets reprotected automatically on selection change

la feuille, pour une raison quelconque, elle-même reprotégé au milieu de la méthode. La déprotection à nouveau immédiatement avant le paramètre de la propriété Locked a résolu mon problème.

En fait, j'avais plusieurs plages que j'avais besoin de verrouiller dans une rangée, et je devais déprotéger la feuille avant chaque changement de propriété.

3

Vous ne pouvez pas verrouiller une cellule faisant partie d'une plage de cellules fusionnées sauf s'il s'agit de la cellule d'angle supérieure gauche. Les travaux suivants pour toute cellule ou zone fusionnée de cellules.

Sub LockCells() 
    Dim R As Range 
    ActiveSheet.Unprotect 
    Cells.Locked = False 
    For Each R In Range("A1", Cells.SpecialCells(xlCellTypeLastCell).Address) 
     If R.MergeArea.Range("A1").Address = R.Address And R.HasFormula Or IsText(R) Then 
     R.MergeArea.Locked = True 
     End If 
    Next 
    ActiveSheet.Protect 
End Sub 

Function IsText(What) As Boolean 
    IsText = False 
    On Error Resume Next 
    IsText = (CDbl(What) <> What) 
    If Err.Number Then IsText = True 
End Function 
12

Voici une explication complète:

En règle générale, il y a deux causes de cette erreur: essayer de changer d'une cellule verrouillée propriété sur une feuille protégée et/ou d'essayer de changer le verrouillé propriété d'une seule cellule dans une gamme fusionnée. Dans le premier cas, vous pouvez soit déverrouiller la feuille, soit définir la protection UserInterfaceOnly, ce qui est fortement recommandé car vous n'avez pas à le déverrouiller/verrouiller à plusieurs reprises.

En ce qui concerne les cellules fusionnées, vous ne pouvez pas verrouiller une seule cellule qui fait partie d'une gamme issue de la fusion, mais il y a des options raisonnables:

  • Si vous utilisez la notation adresse de cellule pour faire référence à la cellule/gamme,

    Range("A1").Locked = True

    la référence alors toute la gamme fusionnée à la place:

    Range("A1:A3").Locked = True 'where "A1:A3" is the entire merged range

  • Si vous utilisez une plage nommée pour un ensemble de cellules fusionnées, elle sera définie par défaut pour référencer uniquement la première des cellules fusionnées.Vous pouvez modifier la définition pour inclure toute la gamme fusionnée ou utiliser son MergeArea propriété pour faire référence à sa gamme issue de la fusion associée:

    Range(“SomeNamedRange”).MergeArea.Locked = True

    Mais notez que vous ne pouvez pas faire les deux depuis le MergeArea propriété est, apparemment, indéfini pour une plage qui n'est pas un sous-ensemble strict d'une plus grande zone fusionnée! Bien sûr, vous pouvez toujours annuler la fusion de la plage fusionnée avant de définir la propriété Verrouillé d'une cellule incluse, puis la recomposer ensuite, mais je n'ai jamais vu une situation dans laquelle l'une des deux solutions ci-dessus n'était pas suffisant (et beaucoup plus propre).

0

J'ai eu le même problème et a essayé de cacher manuellement les cellules, et recevoir l'avertissement suivant: « Impossible de déplacer des objets hors feuille. »

Mon problème était quelques commentaires dans les cellules de la même feuille. Après avoir supprimé tous les commentaires de la feuille, le code s'exécute.

Mon code trouve la ligne en utilisant un cas de correspondance dans une colonne utilisée uniquement pour cela (parce que j'ai besoin d'insérer des lignes et la colonne "B" est ma référence pour identifier la ligne).

Mon code. Lignes ((WorksheetFunction.Match (1, Range ("B: B"), 0)) - 1 & ":" & (WorksheetFunction.Match (13, plage ("B: B"), 0)) + 15) .EntireRow.Hidden = True

Questions connexes