web-dev-qa-db-fra.com

VBA - Erreur d'exécution 1004 'Erreur définie par l'application ou erreur définie par l'objet'

J'ai un document Excel qui copie une feuille de modèle dans une nouvelle feuille lors de sa première utilisation. Toutes les feuilles supplémentaires qui suivent ce modèle sont ajoutées à la feuille nouvellement créée.

Je reçois l'erreur dans le titre dans cette section de code:

If Worksheets("User Configuration").Cells(9, 15).Value = 1 Then
  Worksheets("Cable Cards Template").Range("A1:J33").Copy

  With Worksheets("Cable Cards")
  **.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues**
    .Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlFormats
  End With

  Worksheets("Cable Cards Template").Shapes("Picture 1").Copy
  Worksheets("Cable Cards").Paste Cells(RangeStartRow, RangeStartColumn)

  Call Sheets.FormatCableCardRows      
End If

Fondamentalement, si l'instruction If est vraie (la cellule = 1), une plage d'une feuille particulière doit être copiée et collée dans la nouvelle feuille dans la plage indiquée à l'aide de PasteSpecial pour les valeurs et le formatage. Suite à cela, la feuille "nouvellement créée" doit avoir une image copiée dans la cellule en haut à gauche du modèle, puis un sous-programme est appelé pour formater les lignes de la nouvelle feuille.

Je reçois l'erreur au premier appel .Range après l'instruction With Worksheets("Cable Cards"). J'ai essayé de ne pas utiliser l'instruction With, de copier les valeurs directement au lieu de coller-spécial, etc. Ce qui est étrange, c'est que cela fonctionnera du premier coup, lorsque la nouvelle feuille sera créée via:

If (RangeStartRow = 1) Then
  Worksheets.Add().Name = "Cable Cards" ' Create new sheet with given name only on first cable card
  Columns(1).ColumnWidth = 9.43
  Columns(6).ColumnWidth = 11
  Columns(10).ColumnWidth = 9
  Call FormatForA5Printing("Cable Cards", 71)
End If

mais au 2e tour, cela échoue complètement, avec le Run Time Error 1004 'Application Defined or Object Defined Error'. J'apprécierais toute aide.

4
user3105671

Votre objet de cellules n'est pas pleinement qualifié. Vous devez ajouter un DOT avant l'objet de cellules. Par exemple

With Worksheets("Cable Cards")
    .Range(.Cells(RangeStartRow, RangeStartColumn), _
           .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

De même, qualifiez pleinement tous vos objets Cells.

14
Siddharth Rout

Solution n ° 1 : Votre déclaration

.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

ne fait pas référence à un Range approprié pour agir. Au lieu,

.Range(.Cells(RangeStartRow, RangeStartColumn), .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues

fait (et de même dans certains autres cas).

Solution n ° 2 : activez Worksheets("Cable Cards") avant d'utiliser ses cellules.

Explication: Cells(RangeStartRow, RangeStartColumn) (exemple) vous donne un Range, qui serait ok, et c’est pourquoi vous voyez souvent Cells utilisé de cette façon. Mais comme il n'est pas appliqué à un objet spécifique, il s'applique à la variable ActiveSheet. Ainsi, votre code tente d'utiliser .Range(rng1, rng2), où .Range est une méthode d'un objet Worksheet et rng1 et rng2 sont dans un Worksheet différent.

Vous pouvez effectuer deux vérifications pour rendre cela tout à fait évident:

  1. Activez votre Worksheets("Cable Cards") avant d'exécuter votre Sub et il commencera à fonctionner (vous disposez maintenant de références bien formées à Ranges). Pour le code que vous avez posté, ajouter .Activate juste après With... constituerait une solution, même si vous rencontrez peut-être un problème similaire ailleurs dans votre code lorsque vous vous référez à Range dans un autre Worksheet.

  2. Avec une feuille autre que Worksheets("Cable Cards") active, définissez un point d'arrêt sur la ligne générant l'erreur, démarrez votre Sub et, en cas de rupture de l'exécution, écrivez dans la fenêtre immédiate.

    Debug.Print Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    Debug.Print .Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    et voir les différents résultats.

Conclusion: Utiliser Cells ou Range sans objet spécifié (par exemple, Worksheet ou Range) peut être dangereux, surtout si vous travaillez avec plus d'un Sheet, à moins que vous ne sachiez exactement ce que Sheet est actif.

5
sancho.s

L'attribution d'une valeur qui commence par un "=" lancera l'évaluation de la formule et générera dans mon cas l'erreur n ° 1004 mentionnée ci-dessus. Le pré-prévoir avec un espace était le billet pour moi. 

1
Mosca Pt