web-dev-qa-db-fra.com

Écrire une chaîne dans une cellule dans Excel

J'essaie d'écrire une valeur dans la cellule "A1", mais j'obtiens l'erreur suivante: 

Erreur '1004' définie par l'application ou par l'objet

J'ai essayé beaucoup de solutions sur le net, mais aucune ne fonctionne. J'utilise Excel 2007 et le fichier extensiton est .xlsm.

Mon code est le suivant:

Sub varchanger()
On Error GoTo Whoa
Dim TxtRng  As Range

Worksheets("Game").Activate
ActiveSheet.Unprotect

Set TxtRng = ActiveWorkbook.Sheets("Game").Cells(1, 1)
TxtRng.Value = "SubTotal"

'Worksheets("Game").Range("A1") = "Asdf"

LetsContinue:
    Exit Sub
Whoa:
    MsgBox Err.number
    Resume LetsContinue
End Sub

Edit: après avoir obtenu une erreur si je clique sur l'icône d'avertissement, puis sélectionnez Afficher les étapes de calcul pour qu'il fonctionne correctement

9
knightrider

Je pense que vous êtes peut-être en train de trébucher sur la protection de la feuille. J'ai un peu rationalisé votre code et je définis explicitement des références aux objets classeur et feuille de calcul. Dans votre exemple, vous faites explicitement référence au classeur et à la feuille lorsque vous définissez l'objet TxtRng, mais pas lorsque vous retirez la protection de la feuille.

Essaye ça:

Sub varchanger()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim TxtRng  As Range

    Set wb = ActiveWorkbook
    Set ws = wb.Sheets("Sheet1")
    'or ws.Unprotect Password:="yourpass"
    ws.Unprotect

    Set TxtRng = ws.Range("A1")
    TxtRng.Value = "SubTotal"
    'http://stackoverflow.com/questions/8253776/worksheet-protection-set-using-ws-protect-but-doesnt-unprotect-using-the-menu
    ' or ws.Protect Password:="yourpass"
    ws.Protect

End Sub

Si j'exécute le sous-script avec ws.Unprotect commenté, j'obtiens une erreur d'exécution 1004. (En supposant que j'ai protégé la feuille et que la plage est verrouillée.) La mise en commentaire de la ligne permet au code de fonctionner correctement.

REMARQUES: 

  1. Je réactive la protection de la feuille après avoir écrit dans la plage. Je suppose que vous voulez faire cela si vous protégiez la feuille en premier lieu. Si vous réactivez la protection ultérieurement après un traitement ultérieur, vous devez supprimer cette ligne.
  2. J'ai supprimé le gestionnaire d'erreurs. Le message d'erreur Excel vous donne beaucoup plus de détails que Err.number. Vous pouvez le remettre une fois que votre code est opérationnel et afficher ce que vous voulez. Évidemment, vous pouvez également utiliser Err.Description.
  3. La notation Cells(1, 1) peut causer une énorme quantité de chagrin. Soyez prudent en l'utilisant. Range("A1") est beaucoup plus facile à analyser pour les humains et a tendance à éviter les erreurs de frappe au front.
13
Jon Crowell

remplacer Range ("A1") = "Asdf" avec Range ("A1"). value = "Asdf"

1
T. I. Troll

J'ai eu quelques vodkas aux canneberges ce soir donc il me manque peut-être quelque chose ... Est-il nécessaire de régler la plage? Pourquoi ne pas utiliser:

Activeworkbook.Sheets("Game").Range("A1").value = "Subtotal"

Est-ce que cela échoue aussi?

On dirait que vous avez essayé quelque chose de similaire:

'Worksheets("Game").Range("A1") = "Asdf"

Cependant, les feuilles de calcul étant une collection, vous ne pouvez pas faire référence à "Jeu". Je pense que vous devez utiliser l'objet Sheets à la place. 

1
UberNubIsTrue

essayez ceci à la place

Set TxtRng = ActiveWorkbook.Sheets("Game").Range("A1")

ADDITION

Peut-être que le fichier est corrompu - cela m'est déjà arrivé plusieurs fois et la seule solution consiste à tout copier dans un nouveau fichier.

S'il vous plaît pouvez-vous essayer ce qui suit:

  • Enregistrez un nouveau fichier xlsm et appelez-le "MyFullyQualified.xlsm"
  • Ajoutez une feuille sans protection et appelez-la "mySheet"
  • Ajouter un module au classeur et ajouter la procédure suivante

Est-ce que ça marche?

 Sub varchanger()

 With Excel.Application
    .ScreenUpdating = True
    .Calculation = Excel.xlCalculationAutomatic
    .EnableEvents = True
 End With

 On Error GoTo Whoa:

    Dim myBook As Excel.Workbook
    Dim mySheet As Excel.Worksheet
    Dim Rng  As Excel.Range

    Set myBook = Excel.Workbooks("MyFullyQualified.xlsm")
    Set mySheet = myBook.Worksheets("mySheet")
    Set Rng = mySheet.Range("A1")

    'ActiveSheet.Unprotect


    Rng.Value = "SubTotal"

    Excel.Workbooks("MyFullyQualified.xlsm").Worksheets("mySheet").Range("A1").Value = "Asdf"

LetsContinue:
        Exit Sub
Whoa:
        MsgBox Err.Number
        GoTo LetsContinue

End Sub
0
whytheq