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 :

Insérer/Créer une formule en vba dans une cellule [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut Insérer/Créer une formule en vba dans une cellule
    Bonjour,

    J'essai d'insérer dans une cellule une formule construire entièrement à la main. Je dois la construire à la main car le nombre de ligne de ma feuille general_report peux-être variable. (Elle provient d'un export de

    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
    Sub writeFormula()
        Dim strFormula As String
        Dim row As Long
        row = lastRow("general_report")
        strFormula = "=COUNTIFS(general_report!$BH$5:$BH$" & row & ";""S0 - Blocking"";general_report!$Q$5:$Q$" & row & ";""*""&DefectBySeverityAndSubSystem!B3&""*"";general_report!$E$5:$E$" & row & ";""<>Canceled"";general_report!$E$5:$E$" & row & ";""<>Resolved"";general_report!$E$5:$E$" & row & ";""<>UAT Resolved"";general_report!$E$5:$E$" & row & ";""<>Closed"")"
           On Error GoTo errorHandler
     
            Debug.Print strFormula
            Debug.Print "=COUNTIFS(general_report!$BH$5:$BH$" & row & ";""S0 - Blocking"";general_report!$Q$5:$Q$" & row & ";""*""&DefectBySeverityAndSubSystem!B3&""*"";general_report!$E$5:$E$" & row & ";""<>Canceled"";general_report!$E$5:$E$" & row & ";""<>Resolved"";general_report!$E$5:$E$" & row & ";""<>UAT Resolved"";general_report!$E$5:$E$" & row & ";""<>Closed"")"
            Worksheets("DefectBySeverityAndSubSystem").Activate
            'range("D11").Value = strFormula
            'range("D11").Formula = strFormula
            'range("D11").FormulaR1C1 = strFormula
            'range("D11").Value = "=COUNTIFS(general_report!$BH$5:$BH$" & row & ";""S0 - Blocking"";general_report!$Q$5:$Q$" & row & ";""*""&DefectBySeverityAndSubSystem!B3&""*"";general_report!$E$5:$E$" & row & ";""<>Canceled"";general_report!$E$5:$E$" & row & ";""<>Resolved"";general_report!$E$5:$E$" & row & ";""<>UAT Resolved"";general_report!$E$5:$E$" & row & ";""<>Closed"")"
            'range("D11").Formula = "=COUNTIFS(general_report!$BH$5:$BH$" & row & ";""S0 - Blocking"";general_report!$Q$5:$Q$" & row & ";""*""&DefectBySeverityAndSubSystem!B3&""*"";general_report!$E$5:$E$" & row & ";""<>Canceled"";general_report!$E$5:$E$" & row & ";""<>Resolved"";general_report!$E$5:$E$" & row & ";""<>UAT Resolved"";general_report!$E$5:$E$" & row & ";""<>Closed"")"
            'range("D11").FormulaR1C1 = "=COUNTIFS(general_report!$BH$5:$BH$" & row & ";""S0 - Blocking"";general_report!$Q$5:$Q$" & row & ";""*""&DefectBySeverityAndSubSystem!B3&""*"";general_report!$E$5:$E$" & row & ";""<>Canceled"";general_report!$E$5:$E$" & row & ";""<>Resolved"";general_report!$E$5:$E$" & row & ";""<>UAT Resolved"";general_report!$E$5:$E$" & row & ";""<>Closed"")"
            'ActiveWorkbook.Names.Add Name:="myFormula", RefersToR1C1:= _
            '   "=COUNTIFS(general_report!$BH$5:$BH$" & row & ";""S0 - Blocking"";general_report!$Q$5:$Q$" & row & ";""*""&DefectBySeverityAndSubSystem!B3&""*"";general_report!$E$5:$E$" & row & ";""<>Canceled"";general_report!$E$5:$E$" & row & ";""<>Resolved"";general_report!$E$5:$E$" & row & ";""<>UAT Resolved"";general_report!$E$5:$E$" & row & ";""<>Closed"")"
            '   ActiveWorkbook.Names("myFormula").Comment = ""
    errorHandler:
        MsgBox Err.Number & vbLf & Err.Description
     
    End Sub
     
    Function lastRow(nameSheet As String) As Long
        Dim sht As Worksheet
     
        Set sht = ThisWorkbook.Worksheets(nameSheet)
     
        lastRow = sht.Cells.Find(What:="*", After:=[A1], _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlPrevious).row
     
    End Function
    J'ai une erreur 1004.

    Quand je prends la formule écrite dans la fenêtre "Immediate" et que je la copie/colle dans une cellule elle marche parfaitement bien.

    J'ai essayé plusieurs choses, (en commentaire) notament de créer à la volé une formule pour ensuite l'affecter à une cellule (le code en commentaire) mais là aussi en vain.

    Ma formule serait-elle trop compliquée pour être insérer en vba ?

    Merci pour votre aide.

    Shiyatsu.

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour !

    Comparer de nouveau la formule dans la fenêtre avec chaque caractère de la formule VBA !

    Sinon un Debug.Print de la formule VBA permet aussi de comparer avec la source
    rendant ainsi plus facile le dépistage de sa boulette …

    Si les deux sont strictement équivalentes, c'est alors un problème de conception
    comme un non respect du modèle objet, par exemple la feuille active n'étant pas celle attendue …

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour votre réponse,

    J'ai déjà comparé les Debug.print, et lorsque que je colle le résultat de mon Debug.print, la formule marche très bien et les deux sont bel et bien identique.

    Je pense que le problème est ailleurs.

    Pour m'assurer que ma synthaxe est correct, j'ai utilise le "Reccord Macro" de excel avec une formule simplifié.

    J'ai donc fait ctrl+F3, et j'ai donc collé la formule suivante : =COUNTIFS(general_report!$BH$5:$BH$74;"S0 - Blocking")

    J'ai obtenu alors le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ActiveWorkbook.Names.Add Name:="recordMarco", RefersToR1C1:= _
        "=COUNTIFS(general_report!R5C60:R74C60,""S0 - Blocking"")"
        ActiveWorkbook.Names("recordMarco").Comment = ""
    Ma première question, savez-vous pourquoi il a changé mes $BH$5:$BH$74 en R5C60:R74C60 ?

    Et quand je test donc le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub writeFormula()
        On Error GoTo errorHandler
            range("D13").Select
     
            ActiveWorkbook.Names.Add Name:="recordMarco", RefersToR1C1:= _
                "=COUNTIFS(general_report!$BH$5:$BH$74;""S0 - Blocking"")"
                ActiveWorkbook.Names("recordMarco").Comment = ""
    errorHandler:
        MsgBox Err.Number & vbLf & Err.Description
     
    End Sub
    J'ai une fenêtre d'erreur contenant ceci :

    Nom : error.jpg
Affichages : 301
Taille : 49,2 Ko

    Merci,

    Shiyatsu.

    Edit : Je viens d'essayé le "Record macro" en collant ma formule : =COUNTIFS(general_report!$BH$5:$BH$74;"S0 - Blocking") dans une cellule, j'ai obtenu la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ActiveCell.FormulaR1C1 = _
            "=COUNTIFS(general_report!R5C60:R74C60,""S0 - Blocking"")"
        range("E9").Select

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Remettre l'affichage des colonnes en mode lettre peut-être … (Sinon c'est l'Enregistreur qui préfère le mode numérique.)

    Entrer manuellement la formule de calculs dans une cellule d'une feuille de calculs.
    Une fois fonctionnelle, côté VBE dans la fenêtre Immediate valider ? activecell.formula :
    c'est donc avec cette formule qu'il faut comparer …

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut
    Re-bonjour,

    Je viens de trouver la solution donc je vous là partage.

    Et vous pourrez je pense m'apporter des petites precisions sur ce que je pense avoir compris.

    Quand l'on souhaite écrire une formule en vba qui contient des références de cellule, la synthaxe est la suivante :

    RNuméroDeLaLigneCNuméroDeLaColonne

    En d'autre terme, pour écrire en vba :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =COUNTIFS(general_report!$A$5:$A$74;"S0 - Blocking")
     
    =COUNTIFS(general_report!R5C0:R74C0;"S0 - Blocking")
    R5C0 correspond à ligne 5 de la colonne A
    R74C0 correspond à ligne 74 de la colonne A

    Et pour les cellules qui ne sont pas des références

    Si je veux dire que ma cellule B5 est égale à la cellule A3 (Donc ça se résume à écrire =A3 dans la cellule B5)
    En gros il faut lui dire l'endroit où la cellule ce trouve pas rapport à la cellule active.
    Pour passer de B5 à A3 je dois remonter d'une ligne, puis allez vers la gauche de 3 cases soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.FormulaR1C1 = "=R[-1]C[-3]"
    J'ai dois tout simplement changer la construction de mes formules pour qu'il face en sorte de changer mes cellules noté en brut (avec lettres et chiffres) avec cette synthaxe.

    Je sais pas si j'ai été bien claire dans mon explication^^

    Merci encore pour votre aide.

    Shiyatsu.

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Je passe par la propriété Formula comme expliqué précédemment …

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/01/2014, 11h47
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. Réponses: 5
    Dernier message: 08/12/2007, 12h59
  4. Intégration d'une variable VBA dans une formule
    Par stephane31 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/09/2007, 03h27
  5. concaténation en vba dans une formule de cellule Excel
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/12/2005, 22h58

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