IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Erreur 1004 insertion formule avec .formula [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Par défaut Erreur 1004 insertion formule avec .formula
    Bonjour,

    Je souhaite insérer une formule dans une cellule en VBA. Sauf que quand j'éxécute le code, j'obtiens une erreur 1004, alors que la formule marche très bien si je la copie/colle dans la cellule ! Voici mon code (c'est pour un fichier de suivi des actions, la formule est pour mettre l'état de l'action):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub new_action()
    Call filter_reset
    last_row = Range("A105476").Cells.End(xlUp).Row
    Cells(last_row + 1, 1).Value = Cells(last_row, 1).Value + 1
    Cells(last_row + 1, 2).Value = Format(Now, "mm/dd/yyyy")
    formule = "=IF(OR($I10=""n/a"",$J10=""n/a""),""Standby""," & _
    "IF($K10=""Cancelled"",""Cancelled""," & _
    "IF(OR(C10="""",B10="""",E10="""",F10="""",G10="""",I10=""""),""," & _
    "IF(K10<>"""",""Closed"",IF(OR($I10>=Date,$J10>=Date),""Ongoing""," & _
    "IF(AND(I10<Date,K10=""""),""Late""))))))"
    Worksheets("Action plan").Range("C14").Formula = formule
    End Sub
    J'ai l'erreur à la dernière ligne, Est-ce que vous sauriez pourquoi ? Sachant qu'avec une formule plus simple, ça marche ! Merci d'avance.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Pour commencer, tu devrais déclarer la variable formule avec le type String.

    Que représente "Date" ?
    Si c'est une cellule nommée, c'est une mauvaise idée de lui avoir donné le nom d'une fonction.
    Si c'est la fonction VBA, il faut la sortir des guillemets.
    Si c'est la fonction excel, il faut des parenthèses.

  3. #3
    Membre habitué
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Par défaut
    Bonjour,

    ok mais déclarer la variable n'enlève pas l'erreur (d'ailleurs je croyais qu'en VBA il n'y avait pas besoin de déclarer les variables non?). Le "Date" est la fonction VBA qui correspond au "AUJOURDHUI()" excel (j'avais changé car avec la formule en français et un .formulalocal ça plantait aussi, j'ai donc essayé en anglais avec un .formula). Voici mon code modifié, ça plante toujours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub new_action()
    Dim formule As String
    Call filter_reset
    last_row = Range("A105476").Cells.End(xlUp).Row
    Cells(last_row + 1, 1).Value = Cells(last_row, 1).Value + 1
    Cells(last_row + 1, 2).Value = Format(Now, "mm/dd/yyyy")
    formule = "=IF(OR($I10=""n/a"",$J10=""n/a""),""Standby""," & _
    "IF($K10=""Cancelled"",""Cancelled""," & _
    "IF(OR(C10="""",B10="""",E10="""",F10="""",G10="""",I10=""""),""," & _
    "IF(K10<>"""",""Closed"",IF(OR($I10>=" & Date & ",$J10>=" & Date & ",""Ongoing""," & _
    "IF(AND(I10<" & Date & ",K10=""""),""Late""))))))"
    Worksheets("Action plan").Range("C14").Formula = formule
    End Sub
    PS: je ne comprends pas pourquoi il faut aussi doubler les guillemets pour les chaines de caractères

  4. #4
    Inactif  
    Homme Profil pro
    Analyste-Programmeur / Intégrateur ERP
    Inscrit en
    Mai 2013
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur / Intégrateur ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 511
    Par défaut
    Bonjour,

    - Il manquait le cas "faux" dans le dernier IF(AND)), qui doit afficher "late" , avec une dernière virgule après le "late" même si nous ne précisez pas quoi afficher dans le cas où le test IF serait faux.

    - Sur la 3ème ligne, il y a un "" au lieu d'un """".

    - Dans le test IF(OR)) de la 4ème ligne de la formule, il manque la parenthèse fermante du OR entre la date et le "ongoing".



    Pour ma part, en corrigeant les problèmes indiqués ci-dessus, la formule se met bien dans la cellule sans message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Sub new_action()
     
    Dim formule As String
     
    Call filter_reset
     
    last_row = Range("A105476").Cells.End(xlUp).Row
    Cells(last_row + 1, 1).Value = Cells(last_row, 1).Value + 1
    Cells(last_row + 1, 2).Value = Format(Now, "mm/dd/yyyy")
     
    formule = "=IF(OR($I10=""n/a"",$J10=""n/a""),""Standby""," & _
    "IF($K10=""Cancelled"",""Cancelled""," & _
    "IF(OR(C10="""",B10="""",E10="""",F10="""",G10="""",I10=""""),""""," & _
    "IF(K10<>"""",""Closed"",IF(OR($I10>=" & Date & ",$J10>=" & Date & "),""Ongoing""," & _
    "IF(AND(I10<" & Date & ",K10=""""),""Late"",))))))"
     
    Worksheets("Action plan").Range("C14").Formula = formule
     
    End Sub

    Avec la formule francisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Sub new_action()
     
    Dim formule As String
     
    Call filter_reset
     
    last_row = Range("A105476").Cells.End(xlUp).Row
    Cells(last_row + 1, 1).Value = Cells(last_row, 1).Value + 1
    Cells(last_row + 1, 2).Value = Format(Now, "mm/dd/yyyy")
     
    formule = "=SI(OU($I10=""n/a"";$J10=""n/a"");""Standby"";" & _
    "SI($K10=""Cancelled"";""Cancelled"";" & _
    "SI(OU(C10="""";B10="""";E10="""";F10="""";G10="""";I10="""");"""";" & _
    "SI(K10<>"""";""Closed"";SI(OU($I10>=" & Date & ";$J10>=" & Date & ");""Ongoing"";" & _
    "SI(ET(I10<" & Date & ";K10="""");""Late"";))))))"
     
    Worksheets("Action plan").Range("C14").FormulaLocal = formule
     
    End Sub

  5. #5
    Membre habitué
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 10
    Par défaut
    Un grand merci ! Je ne comprends pas pourquoi ça marchait en faisant un copier coller dans la cellule par contre... J'ai remplacé le "Date" par "TODAY()" car en effet il mettait aussi la date du jour et pas la fonction et j'ai mis une formule dynamique pour que la bonne ligne soit appelée à chaque fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub new_action()
    Call filter_reset
    col_dash = Range("A:XFD").Cells.Find("#", lookat:=xlWhole).Column
    last_row = Range("A105476").Cells.End(xlUp).Row
    col_date = Range("A:XFD").Cells.Find("Date", lookat:=xlWhole).Column
    col_status = Range("A:XFD").Cells.Find("Status", lookat:=xlWhole).Column
    col_object = Range("A:XFD").Cells.Find("Object", lookat:=xlWhole).Column
    col_what = Range("A:XFD").Cells.Find("What", lookat:=xlWhole).Column
    col_who = Range("A:XFD").Cells.Find("Who", lookat:=xlWhole).Column
    col_why = Range("A:XFD").Cells.Find("Why", lookat:=xlWhole).Column
    col_due_date = Range("A:XFD").Cells.Find("Due date", lookat:=xlWhole).Column
    col_new_date = Range("A:XFD").Cells.Find("New date", lookat:=xlWhole).Column
    col_closure_date = Range("A:XFD").Cells.Find("Closure date", lookat:=xlWhole).Column
     
    cell_date = Cells(last_row + 1, col_date).Address
    cell_status = Cells(last_row + 1, col_status).Address
    cell_object = Cells(last_row + 1, col_object).Address
    cell_what = Cells(last_row + 1, col_what).Address
    cell_who = Cells(last_row + 1, col_who).Address
    cell_why = Cells(last_row + 1, col_why).Address
    cell_due_date = Cells(last_row + 1, col_due_date).Address
    cell_new_date = Cells(last_row + 1, col_new_date).Address
    cell_closure_date = Cells(last_row + 1, col_closure_date).Address
     
    Cells(last_row + 1, col_dash).Value = Cells(last_row, col_dash).Value + 1
    Cells(last_row + 1, col_date).Value = Format(Now, "mm/dd/yyyy")
     
    formule = "=IF(OR(" & cell_due_date & "=""n/a""," & cell_new_date & "=""n/a""),""Standby""," & _
    "IF(" & cell_closure_date & "=""Cancelled"",""Cancelled""," & _
    "IF(OR(" & cell_object & "=""""," & cell_date & "=""""," & cell_what & "=""""," & cell_who & "=""""," & cell_why & "=""""," & cell_due_date & "=""""),""""," & _
    "IF(" & cell_closure_date & "<>"""",""Closed"",IF(OR(" & cell_due_date & ">=TODAY()," & cell_new_date & ">=TODAY()),""Ongoing""," & _
    "IF(AND(" & cell_due_date & "<TODAY()," & cell_closure_date & "=""""),""Late"",))))))"
     
     
    Worksheets("Action plan").Range(cell_status).Formula = formule
    End Sub

  6. #6
    Inactif  
    Homme Profil pro
    Analyste-Programmeur / Intégrateur ERP
    Inscrit en
    Mai 2013
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur / Intégrateur ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2013
    Messages : 2 511
    Par défaut
    Bonjour,

    Tant mieux si tu as pu adapter comme tu le souhaitais.

    Si ton problème est réglé, n'oublie pas de passer le sujet en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Erreur 1004 - Insertion de ligne
    Par Daty54 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/05/2018, 12h16
  2. [XL-2013] Erreur 1004 Transpose + formule
    Par hologram dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/09/2015, 11h24
  3. [Toutes versions] Insertion formule avec variable dans VBA
    Par Suomiland dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/06/2015, 07h30
  4. Réponses: 3
    Dernier message: 29/04/2014, 11h43
  5. Erreur dans insertion formule par VBA
    Par Nanit6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/01/2011, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo