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 :

Ecrire formule dans une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut Ecrire formule dans une cellule
    Bonjour,

    Je souhaiterais inscrire la formule suivante dans une cellule par une action vba.

    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ESTNA(@INDEX(Unitemateriel;EQUIV(A20;MAT;0);0));"";INDEX(Unitemateriel;EQUIV(A20;MAT;0)))

    L'enregistreur de macro m'a donné ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FormulaR1C1 = _
            "=IF(ISNA(@INDEX(Unitemateriel,MATCH(R[-3]C[-1],MAT,0),0)),"""",INDEX(Unitemateriel,MATCH(R[-3]C[-1],MAT,0)))"
     
    Que je peux donc ajouter à la cellule que je souhaite remplir, en modifiant le code :
     
    Cells(i,3).formulaR1C1 ="=IF(ISNA(@INDEX(Unitemateriel,MATCH(Cells(i,2).value,MAT,0),0)),"""",INDEX(Unitemateriel,MATCH(Cells(i,2).value,MAT,0)))"
    unitemateriel et MAT, sont deux plages de valeurs (même nombre de lignes et 1 colonne) du même tableau défini par la fonction "Formules -> Gestionnaire de nom"

    Mon soucis, c'est que dans ma formule excel initiale, la valeur de comparaison est une cellule fixe (A20), mais dans mon code, je veux que cette valeur soit la valeur contenue sur Cells(i,2).value et je n'arrive pas à remplacer le R[-3]C[-1] par cells(i,2).value.

    Merci de votre retour.

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Personnellement, je ne suis pas favorable à l'enregistrement d'une formulation.
    Et ce d'autant que la formulation R1C1 est loin d'être explicite.

    Il te faut d'abord te placer dans Excel, soit la base de ton processus.

    Tu peux procéder en 3 étapes
    1 - Ecrire la formule au sein du tableur (exemple en "A2")
    2 - Dans l'éditeur VBE (ALT + F11), activer la fenêtre Exécution (CTRL + G)
    3 - Ecrire dans celle ci l'instruction (sans oublier le "?")
    Puis touche Entrée.
    La formule apparaîtra

    Ensuite, tu pourras écrire ta formulation en une seule instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim laformule As String
    laformule = "la formulation obtenue ci-dessus"
     
    Worksheets("lawks").range("B2:B50").Formula = laformule
    Cela dit, Cela dit. Et c'est ce qu'il faut retenir en tout premier lieu

    Sans VBA.
    Au sein d'une table de données (tableau structuré), si la formulation s'effectue au premier enregistrement, alors elle s'incrémentera d'elle même (automatiquement) sur l'ensemble des enregistrements.
    Et ce y compris sur les enregistrements à venir.
    2 tutoriels à ne pas manquer
    Présentation des tableaux structurés
    Les tableaux structurés et VBA

  3. #3
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour

    VBA te propose 2 solution pour insérer une formule dans une cellule;
    - formular1c1 qui est la méthode qu'excel utilise dans l'enregistreur de macro
    - formula qui à priori correspondrait à ton besoin

    Voici un exemple simplifié pour comprendre. A toi ensuite d'adapter à ton cas précis.
    Mettons qu'en A5 tu veuilles faire A1+A2+A3+A4 l'enregistreur de macro te créera une formule R1C1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.FormulaR1C1 = "=R[-4]C+R[-3]C+R[-2]C+R[-1]C"
    (R et C correspondent aux nombres de lignes et de colonnes à décaler par rapport à la cellule dans laquelle tu insères la formule)

    Ensuite manuellement tu remplaces par
    ActiveCell.Formula = "=A1+A2+A3+A4" --> la formule n'est plus en type R1C1 donc tu utilises .Formula

    Et si tu veux y insérer une cellule variable comme dans ton cas (je te laisse vérifier que i est bien un nombre) il te faut l'insérer en "coupant" la formule par des "&
    Exemple si A3 est variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Formula = "=A1+A2+" & cells(i,2) & "+A4"

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Bonjour,

    Merci à vous deux pour avoir pris le temps de me répondre.

    @MarcelG, je suis bien d'accord, je préfère aussi éviter d'insérer des formules excel aussi complexes par le code, toutefois, j'utilisais sur l'ancien modèle de cette feuille cette formule en statique (rentrée directement sur la feuille et non par le code) et qui restait toujours dans la cellule (une ligne étant toujours soit matériel, soit fournitures, soit main-d'oeuvre et ne pouvant changer d'attribution).

    Ma nouvelle feuille faisant qu'une ligne peut prendre chacune de ces attributions, l'entrée par la feuille excel n'était plus possible, et donc besoin d'insérer une formule variant selon les paramètres MO, MAT, FOUR , selon l'attribution de ma ligne (main-d'oeuvre, matériel, fournitures ...). Je pensais que cela serait plus simple et moins lourd.

    J'ai donc finalement opté pour des boucles "Do Until" qui me récupèrent l'information dans le tableau de ma feuille ressources en fonction de la ligne. C'est un peu plus lourd, mais cela fonctionne très bien et ne gêne pas l'utilisation.

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    Application.EnableEvents = False
    Dim col, ligne, nbrow, i, j As Integer
     
    nbrow = Sheets("Ressources").Range("A" & Rows.Count).End(xlUp).Row 'Calcul la dernière ligne comportant une valeur de la colonne A
    ligne = ActiveCell.Row
     
    If ligne >= 11 And ligne <= 43 Then
     
        If Cells(ligne, 1).Value = "MO" Then
     
            With Cells(ligne, 2).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=MO"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
            End With
     
            With Cells(ligne, 4).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=Periode"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
            End With
     
             'Détermine la ligne du tableau dans l'onglet "Ressources" où l'on retrouve la valeur sélectionnée
            If Cells(ligne, 2).Value <> "" And Cells(ligne, 4).Value <> "" Then
     
                Do Until Sheets("Ressources").Cells(2, j + 1).Value = Cells(ligne, 2).Value Or j = 10
     
                    j = j + 1
     
                Loop
     
                Do Until Sheets("Ressources").Cells(i + 1, 1).Value = Cells(ligne, 4).Value Or i = 10
     
                    i = i + 1
     
                Loop
     
                Cells(ligne, 8).Value = Sheets("ressources").Cells(i + 1, j + 1).Value
     
            End If
     
     
        ElseIf Cells(ligne, 1).Value = "MAT" Then
     
            With Cells(ligne, 2).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=MAT"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
            End With
     
            'Détermine la ligne du tableau dans l'onglet "Ressources" où l'on retrouve la valeur sélectionnée
            If Cells(ligne, 2).Value <> "" Then
     
                For i = 1 To nbrow
     
                    If Sheets("Ressources").Cells(i, 1).Value = "Matériel" Then
     
                        Do Until Sheets("Ressources").Cells(i + 1, 1).Value = Cells(ligne, 2).Value Or i = 500
     
                            i = i + 1
     
                        Loop
     
                        Cells(ligne, 4).Value = Sheets("ressources").Cells(i + 1, 3).Value
                        Cells(ligne, 6).Value = Sheets("ressources").Cells(i + 1, 2).Value
     
                        Exit For
     
                    End If
     
                Next i
     
            End If
     
        ElseIf Cells(ligne, 1).Value = "FOUR" Then
     
            With Cells(ligne, 2).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=FOUR"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
            End With
     
            'Détermine la ligne du tableau dans l'onglet "Ressources" où l'on retrouve la valeur sélectionnée
            If Cells(ligne, 2).Value <> "" Then
     
                For i = 1 To nbrow
     
                    If Sheets("Ressources").Cells(i, 1).Value = "Fournitures" Then
     
                        Do Until Sheets("Ressources").Cells(i + 1, 1).Value = Cells(ligne, 2).Value Or i = 500
     
                            i = i + 1
     
                        Loop
     
                        Cells(ligne, 4).Value = Sheets("ressources").Cells(i + 1, 3).Value 'Indique l'unité de la ressource choisie
                        Cells(ligne, 10).Value = Sheets("ressources").Cells(i + 1, 2).Value 'Indique le prix unitaire de la ressource choisie
     
                        Exit For
     
                    End If
     
                Next i
     
            End If
     
        ElseIf Cells(ligne, 1).Value = "SST" Then
     
            With Cells(ligne, 2).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=SST"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
            End With
     
            'Détermine la ligne du tableau dans l'onglet "Ressources" où l'on retrouve la valeur sélectionnée
            If Cells(ligne, 2).Value <> "" Then
     
                For i = 1 To nbrow
     
                    If Sheets("Ressources").Cells(i, 1).Value = "Fournitures" Then
     
                        Do Until Sheets("Ressources").Cells(i + 1, 1).Value = Cells(ligne, 2).Value Or i = 500
     
                            i = i + 1
     
                        Loop
     
                       Cells(ligne, 4).Value = Sheets("ressources").Cells(i + 1, 3).Value 'Indique l'unité de la ressource choisie
                        Cells(ligne, 14).Value = Sheets("ressources").Cells(i + 1, 2).Value 'Indique le prix unitaire de la ressource choisie
     
                        Exit For
     
                    End If
     
                Next i
     
            End If
     
     
        Else
     
            'Si on supprime le type, remet à 0 la ligne
             Cells(ligne, 2).Validation.Delete
             Cells(ligne, 4).Validation.Delete
             Cells(ligne, 2).Value = ""
             Cells(ligne, 4).Value = ""
             Cells(ligne, 5).Value = ""
             Cells(ligne, 6).Value = ""
             Cells(ligne, 8).Value = ""
             Cells(ligne, 10).Value = ""
             Cells(ligne, 14).Value = ""
     
        End If
    @Alex020181, je te remercie, d'avoir éclairci la définition de R[-1]C que je ne comprenais pas.

    J'ai essayé par curiosité en adaptant à mon besoin, mais la formule n'affiche pas de valeur, il me renvoie un #CHAMP!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(ligne, 4).Formula = "=IF(ISNA(INDEX(Unitemateriel,MATCH(" & Cells(ligne, 3) & ",MAT,0),0)),"""",INDEX(Unitemateriel,MATCH(" & Cells(ligne, 3) & ",MAT,0)))"
    Voilà ce que m'affiche la formule dans cellule après entrée du code : =SI(ESTNA(@INDEX(Unitemateriel;EQUIV(;MAT;0);0));"";INDEX(Unitemateriel;EQUIV(;MAT;0)))

    Il ne prend pas en compte les cellules. Par ailleurs pourquoi le premier index à un @ ?

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    J'ai finalement trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(ligne, 4).Formula = "=IF(ISNA(INDEX(Unitemateriel,MATCH(B" & ligne & ",MAT,0),0)),"""",INDEX(Unitemateriel,MATCH(B" & ligne & ",MAT,0)))"
    Qui m'affiche sous excel.

    =SI(ESTNA(@INDEX(Unitemateriel;EQUIV(B12;MAT;0);0));"";INDEX(Unitemateriel;EQUIV(B12;MAT;0)))

    Toutefois, si la colonne devait varier, je ne sais pas comment faire (puisque excel reconnait un "A", "B", "C", ...) alors que le vba donne la colonne avec des chiffres ("1", "2", "3", ...).

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Metylene,

    2 remarques au préalable.
    - Ne fais pas comme moi, adopte immédiatement les tableaux structurés pour une meilleure efficacité dans la gestion des données (End(xlUp) = Finished)
    - Prends cette bonne pratique de toujours rattacher les objets à leur parent. A minima, les objets Range à leur feuille Worksheet.

    Je trouve ton code beaucoup trop complexe.

    Si tu peux retourner un fichier simplifié, ne comportant pas de données confidentielles, alors je pourrais - peut-être - te proposer un code plus simple
    (Do Until .. j = j+1, pas aimer )

    A plus tard

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Oui, en effet le stableaux structurés sont bien plus simples une fois maîtrisés, mais dans mon cas ils m'auraient compliqués la vie :

    • J'aurais pu créer une colonne de "type d'articles" : Fournitures, main d'oeuvre, matériel, sous-traitance, et donc mettre tout dans un seul tableau structuré
    • Mais j'aurais eu le problème des listes de validation variable que je n'aurais su gérer (sans chercher)
    • J'aurais également du réaliser un double tri (d'abord sur les type d'article, puis ensuite sur les articles par type d'articles en alphabétique), que là aussi en premier lieu je ne sais pas faire sans recherches


    Pour la boucle do while, ça fait un bail que je n'ai pas fait de VBA, et j'ai pris ce dont je me souvenais, après si le j + j + 1, autant le remplacé par un for + if, ça fait le même boulot avec plus de ligne de code.

    Enfin, pour les Range, je les utilise le moins possible, je préfère travailler sur les cellules directement, mais certaines fonctions/arguments obligent de déclarer d'utiliser des Range (comme le tri par exemple). D'ailleurs, je ne vois pas où tu as vu des Range non rattaché à leur feuille, par contre mes cells ne sont effectivement pas rattaché à ActiveSheet. ou Me., je trouve pour le cas cela plus lourd et non nécessaire, mais le fait de les mettre est sans doute une bonne habitude en programmation.

    Je sais aussi que tu vas me dire que les cellules fusionnées c'est à éviter, mais les mauvaises habitudes demeurent ...

    Je t'ai mis les deux fichiers avec l'utilisation des formules excel injectées via le code(donc sans boucle do while), et celui avec recherche par le code. La recherche dans un tableau structuré serait indéniablement plus simple d'un point de vue code.

    L'onglet "modèle" est mon ancien modèle, le modèle 2 est celui sur lequel je travaille. Ne pas prendre en compte l'onglet BPU, je vais tout remodifié, c'était un truc fait à la va vite il y a 1 an et demi.Fichier.xlsmFichier avec formule.xlsm

  8. #8
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Enfin, pour les Range, je les utilise le moins possible, je préfère travailler sur les cellules directement
    Entre nous, si tu peux m'expliquer la différence, alors je serai preneur

    Cela dit, l'emploi d'une table de données n'exclut en rien qu'elle soit liée à une autre, par VBA ou formulation.
    Autrement dit, l'on peut très bien concevoir de disposer de plusieurs tableaux.

    Je dirai même que cette disposition contribuerait largement à une meilleure architecture.

    Enfin, je ne vois pas de fichier joint.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Ils étaient directement intégré à mon dernier message.

    Fichier.xlsmFichier avec formule.xlsm

    Pour les cellules et range c'est noté, je pensais que c'était différent, toujours est-il que je n'aime pas travaillé avec le premier objet.

    Je les ai mis en PJ classique.
    Fichiers attachés Fichiers attachés

  10. #10
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut methylene,

    En effet, l'architecture de tes données, à mon avis, est à revoir.
    Au simple vu de la feuille "Ressources".
    Tu pourrais disposer de 2 tabes de données si possible sur 2 feuilles différentes,
    1 - Période/Qualification
    2 - Dépenses, dans lesquelles les items Matériels, Fournitures et autres constitueraient un champ à part entière (autrement dit une colonne)

    Suppose en effet qu'une plage ait besoin d'enregistrements plus nombreux, alors il te faudra les décaler et ce sera très vite le b...azar.

    En conclusion
    - Il te faut d'abord sur Excel réfléchir à la disposition rigoureuse des données en autant de tables (tableaux structurés) que nécessaires
    - Une fois cette étape acquise, alors tu peux envisager la formulation, voire un code VBA.
    En fonction du résultat que tu veux obtenir, une aide pourra être envisagée pour la construction de ce dernier.

    Une règle me vient à l'esprit:
    Si tu disposes de données brutes en amont de ton projet, la prudence exige de ne pas les modifier, mais de les exploiter pour un résultat en aval (sur une autre feuille).

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Merci, pour ce retour, je vais voir si je peux optimiser mon tableau.

    Pour ce qui est des Do Loop tu me parlais d'optimiser.

    Et enfin une dernière question : Pourquoi cela ne fonctionne pas, il y a toujours une erreur dans le code du type "Erreur de compilation. Attendu : Fin d'instruction" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("BPU").Cells(i + 13, 6).Formula = "=IFERROR(D" & i + 13 & "*E" & i+ 13 & ","""")"
    Et je ne vois pas où.

  12. #12
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Pour ce qui est des Do Loop tu me parlais d'optimiser.
    Oui, comme je te l'ai indiqué ci-dessus, après la réorganisation de tes données.

    "Erreur de compilation. Attendu : Fin d'instruction" :
    Je pense qu'il s'agit d'une question de double-quote.
    Voir ce que j'écris dans le post "#2"
    Retourne dans la discussion le résultat apparaissant dans la fenêtre Exécution.
    Au préalable, attention d'activer la feuille où se trouve la formule.

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Pour modifier mes tableaux, après réflexion, je ne souhaite pas que mes ressources soient sur deux onglets différents. Raison pour laquelle mes tableaux se retrouvent les uns en-dessous des autres dans mon fichier actuel, pour pouvoir insérer des lignes. Je pourrais regrouper les 4 tableaux en un seul tableau structuré, mais je vais devoir reprendre complètement mon code (ce qui serait mieux d'un point de vue programmation), mais ce que je n'ai pas le temps, mon temps alloué à créer ce fichier étant proche de 0 dans mes tâches actuelles, le fichier allant servir quasiment qu'à moi.

    En tout cas la prochaine fois que j'aurais à faire un fichier excel dépendant du vba, et même des tableaux en général, je vais me pencher très fortement sur les tableaux structurés, avant de commencer à coder.

    Par ailleurs, je n'avais pas compris ton poste initial au niveau de la fenêtre d'exécution, mais c'est vraiment pas mal.

    Sous excel :
    =SIERREUR(D13*E13;"")

    La fenêtre me retourne cela :

    Adapté à ma formule, j'obtiens cela, et ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("BPU").Cells(i + 13, 6).Formula = "=IFERROR(D13*E13,"""")"
    Ce que j'avais mis initialement était donc juste (hormis les problèmes de double quote).

    Maintenant, quand je veux intégrer une variable dans ce code (et d'ailleurs c'est quasiment toujours là que cela pêche), c'est là que ça cause problème, et je ne vois toujours pas d'où, en effet un problème de double quote.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("BPU").Cells(i + 13, 6).Formula = "=IFERROR(D"& i +13 &"*E"& i + 13&","""")"
    En tout cas merci du temps passé à me répondre.

  14. #14
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour methylene, Bonjour au Foru

    Je te demandais ce que reporte la fenêtre exécution à partir de ta formule complète , autrement dit la formulation correspondant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "=IFERROR(D"& i +13 &"*E"& i + 13&","""")"
    C'est celle-ci que tu dois écrire dans le tableur Excel afin d'obtenir un résultat qui te convienne.

    Une fois ce résultat attendu et obtenu, procède à la démarche et reporte la formulation décrite dans la fenêtre Exécution.

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Je ne vois pas comment rentrer une formule dans une cellule sous excel avec des variables ?

  16. #16
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Voir ci-dessous en "F13".

    Nom : Capture1.PNG
Affichages : 193
Taille : 6,0 Ko

    Nom : Capture2.PNG
Affichages : 178
Taille : 22,0 Ko

  17. #17
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Tu rentres la formule avec la valeur qui t'intéresse, et que l'on utilisera, à postériori, comme variable.

    Je viens d'apercevoir ton dernier post.
    Tu entres, dans le tableur, une formule tableur et tu en contrôles le résultat.
    Si le résultat est correct, alors, dans un 2ème temps, tu utiliseras la fenêtre Exécution.

  18. #18
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    La formule rentrée :

    Nom : Capture1.PNG
Affichages : 163
Taille : 8,3 Ko

    La formule validée :

    Nom : Captur2.PNG
Affichages : 166
Taille : 4,6 Ko

    La formule via fenêtre VBA Exécution :

    Nom : Capture3.PNG
Affichages : 184
Taille : 22,9 Ko

    Ma formule à toujours fonctionnée, maintenant je veux que le numéro de ligne soit variable et égal à i + 13, et c'est là que je comprends pas.

  19. #19
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Essaie comme ceci.
    (en "découpant" la formule)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Public Sub formulation()
     
    Dim i As Long
     
    For i = 0 To 20
            Range("F" & i + 13).Formula = "=IFERROR(D" & i + 13 & "*E" & i + 13 & "," & """""" & ")"
    Next i
     
    End Sub
    Cela dit, tu pouvais commencer ta boucle avec i = 13 afin d'ajouter 3 fois 13 à ton indice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 13 To 33
            Worksheets(1).Range("F" & i).Formula = "=IFERROR(D" & i & "*E" & i & "," & """""" & ")"
    Next i
    D'autre part, je me demande si tu ne pouvais pas affecter une formule sur toute la plage comme indiqué dans l'un de mes premiers post.
    Cela aurait évité de se torturer l'esprit avec la gestion des double-quottes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Sub Formulationbis()
     
    Const laformule As String = "=IFERROR(D13*E13,"""")"
     
    Worksheets(1).Range("F13:F20").Formula = laformule
     
    End Sub

  20. #20
    Membre averti
    Homme Profil pro
    Ingénieur travaux
    Inscrit en
    Octobre 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur travaux
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2020
    Messages : 15
    Par défaut
    Tout à fait raison pour le i + 13, je m'étais fait la remarque il y a quelques temps pour plus de lisibilité, puis j'ai zappé de modifier.

    Ta formule fonctionne, chapeau bas, même si je ne comprend pas le coup des 6 x ", ce que je n'aurais pas trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(1).Range("F" & i).Formula = "=IFERROR(D" & i & "*E" & i & "," & """""" & ")"
    J'avais bien vu ta formule dans ton premier poste, le problème c'est que cette dernière est fixe et ne s'incrémente pas en fonction de la ligne, et j'aurais eu sur les 8 lignes D13*E13 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Sub Formulationbis()
     
    Const laformule As String = "=IFERROR(D13*E13,"""")"
     
    Worksheets(1).Range("F13:F20").Formula = laformule
     
    End Sub
    Encore merci, même si je n'ai pas compris (ce qui me chagrine), car le but est avant tout de comprendre. Je sais que pour mettre dans une formule "", il faut l'encadrer par deux autres double quote """", mais les deux autres ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Insérer une formule dans une cellule Excel via VBA
    Par *.Har(d)t dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/02/2020, 13h02
  2. [XL-2010] Ecrire une formule dans une cellule
    Par horemheb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/08/2016, 08h32
  3. [XL-2003] Ecrire une formule dans une cellule en VBA
    Par qi130 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/09/2010, 09h51
  4. [Formule]Macro pour masquer des formules dans une cellule
    Par Hellx dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/04/2007, 08h21
  5. [VBA] Macro qui envoie une formule dans une cellule
    Par Okoss dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2007, 22h32

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