Saisir une fonction sur toute la colonne par bouton macro VBA

Bonjour,

J'utilise un fichier avec 264 lignes (C'est évolutif, il peut y en avoir plus ou moins) et des colonnes allants jusqu'à BO. J'ai des fonctions dans 49 colonnes : RechercheV, SI, NBVAL, etc ...

J'aimerais affecté une macro VBA à un bouton qui remplirait mes fonctions dans toutes les lignes de mes colonnes concernées.

Exemple :

Dans ma colonne AG, j'utilise la fonction : =SI((ET(OR(OU="NET";G5="BOY";G5="ABA";G5="DEC";G5="EMB";G5="EXP";G5="MAI";G5="ADM");OU(M5="O";M5="E";M5="APP")));RECHERCHEV(A5;'PRIMES EXPERTISE'!$B$3:$N$4991;13;0);"") à partir de la ligne G5 jusqu'à la ligne G264

Dans ma colonne AH, j'utilise la fonction : (SI(M5="C";0;RECHERCHEV(A5;PRIMES!$A$3:$K$4992;11;0))

et ainsi de suite.

Avant de faire une boucle pour remplir toutes les lignes de la colonne AG, j'ai voulu tester de saisir la fonction dans une seule cellule avec une fonction simple : cellule A + cellule B :

Sub AppliquerFormuleColonne()
'Saisir une formule simple
    Range("AG5").Formula = "=AB5+AD5"
End Sub

=> le code a fonctionné

Ensuite, j'ai modifié ma formule simple par la plus compliqué que j'utilise vraiment dans mon fichier mais le code bug à ma ligne Range(.....

Sub AppliquerFormuleColonne()
'Saisir la formule d'application ou non de la prime expertise qui se trouve dans l'onglet PRIMES EXPERTISE dans la cellule AG5
    Range("AG5").Formula = "=SI((ET(OU(OU(G5=""NET"";G5=""BOY"";G5=""ABA"";G5=""DEC"";G5=""EMB"";G5=""EXP"";G5=""MAI"";G5=""ADM"");OU(M5=""O""; M5=""E""; M5=""APP"")));RECHERCHEV(A5;'PRIMES EXPERTISE'!$B$3:$N$4991;13;0);"""")"
End Sub
capture bug code saisir fonction dans cellule

J'ai essayé de modifier les termes de ma fonction en anglais :

Sub AppliquerFormuleColonne()
'Saisir une formule simple
    Range("AG5").Formula = "=IF((AND(OR(OR(G5=""NET"";G5=""BOY"";G5=""ABA"";G5=""DEC"";G5=""EMB"";G5=""EXP"";G5=""MAI"";G5=""ADM"");OR(M5=""O""; M5=""E""; M5=""APP"")));VLOOKUP(A5;'PRIMES EXPERTISE'!$B$3:$N$4991;13;0);"""")"
End Sub

bug à la même ligne :

capture bug code saisir fonction dans cellule anglais

Pourriez-vous m'aider s'il vous plait ?

Je vous remercie d'avance.

Cordialement,

Bonjour et Bienvenue sur le forum,

VBA est inutile ici, il suffit d'utiliser les outils adaptés. En l'occurrence : Les tableaux structurés


PS : votre code bugue car vous avez laissé ";" comme séparateur au lieu de "," en anglais. Utilisez Conversion automatique de formules Excel FR/EN

Merci pour votre réponse.

J'ai essayé la conversion automatique de formules Excel FR/EN mais elle ne m'a pas remplacé les ";" par des ",". Je l'ai donc fait manuellement :

Sub AppliquerFormuleColonne()
'Saisir une formule simple
    Range("AG5").Formula = "=IF((AND(OR(OR(G5=""NET"",G5=""BOY"",G5=""ABA"",G5=""DEC"",G5=""EMB"",G5=""EXP"",G5=""MAI"",G5=""ADM""),OR(M5=""O"", M5=""E"", M5=""APP""))),VLOOKUP(A5,'PRIMES EXPERTISE'!$B$3:$N$4991,13,0),"""")"
End Sub

Et le code bug encore comme l'image le montre ci-dessous :

capture bug code saisir fonction dans cellule anglais avec virgules

Bonjour

Dans ma colonne AG, j'utilise la fonction : ....

En lisant votre demande, il me semble que vous avez déjà une erreur dans votre formule --> SI((ET(OR(OU="NET";....
- il un OR et un OU
- vous avez 3 OU dans la formule alors que deux suffisent pour le ET

la formule ne serait pas ceci plutôt ?

=SI((ET(OU(G5="NET";G5="BOY";G5="ABA";G5="DEC";G5="EMB";G5="EXP";G5="MAI";G5="ADM");OU(M5="O";M5="E";M5="APP")));RECHERCHEV(A5;'Primes Expertise'!$B$3:$N$4991;13;0);"")

Avant de faire appel à VBA il faudrait que la formule fonctionne déjà comme cela dans AG5.

Sinon je rejoins Sabho12617, les tableaux structurés vous évitent les macros et donc c'est plus simple.

Cordialement

Merci pour votre réponse.

le "(OR(OU" dans le sujet est une erreur de copier/coller. J'ai bien dans mon fichier que des "OU" et la fonction renvoie les résultats escomptés.

J'ai essayé votre correction de formule avec seulement 2 "OU" dans le code VBA :

Sub AppliquerFormuleColonne()
'Saisir la formule d'application ou non de la prime expertise qui se trouve dans l'onglet PRIMES EXPERTISE dans la cellule AG5
    Range("AG5").Formula = "=SI((ET(OU(G5=""NET"";G5=""BOY"";G5=""ABA"";G5=""DEC"";G5=""EMB"";G5=""EXP"";G5=""MAI"";G5=""ADM"");OU(M5=""O"";M5=""E"";M5=""APP"")));RECHERCHEV(A5;'Primes Expertise'!$B$3:$N$4991;13;0);"""")"
End Sub

cela ne fonctionne pas non plus :

image

A cause d'une utilisation groupe du fichier qui souhaite conserver le formalisme du tableau actuel, je ne peux pas le restructurer avec des tableaux structués. C'est pour cela que j’essaie de faire appel à VBA parce que cela conserve le formalisme du tableau actuel.

Cordialement,

re

je ne peux pas le restructurer avec des tableaux structués.

Je comprends mais ce serait probablement l'idéal car si vous ajoutez des lignes la formule est recopiée automatiquement. Et donc pas besoin de VBA dans ce cas

Par VBA, essayez ceci pour AG5

Sub AppliquerFormuleColonne()
'Saisir la formule d'application ou non de la prime expertise qui se trouve dans l'onglet PRIMES EXPERTISE dans la cellule AG5
ActiveSheet.Range("AG5").FormulaR1C1 = "=IF((AND(OR(R[1]C[-26]=""NET"",R[1]C[-26]=""BOY"",R[1]C[-26]=""ABA"",R[1]C[-26]=""DEC"",R[1]C[-26]=""EMB"",R[1]C[-26]=""EXP"",R[1]C[-26]=""MAI"",R[1]C[-26]=""ADM""),OR(R[1]C[-20]=""O"",R[1]C[-20]=""E"",R[1]C[-20]=""APP""))),VLOOKUP(R[1]C[-32],'Primes Expertise'!R3C2:R4991C14,13,0),"""")"
End sub

Remplacez Activesheet par --> Worksheets("nom de feuille")

Rem : ce serait bien de remplacer votre ligne 4991 par une variable dans le code VBA. Cela éviterait de devoir aller modifier le code en cas d'ajout de lignes

Crdlt


EDIT : attention que V2509 que mentionnez dans votre profil n'est pas une version excel mais ce que Microsoft appelle "Build". Vous devriez avoir excel 2016, 2019, ..... c'est surtout cette info qui est intéressante à connaître pour celui qui vous répond. Pensez à corriger dans votre profil

Merci pour votre réponse.

J'ai changé mon profil avec l'année de ma version Excel : 2017.

J'ai intégré votre proposition de code dans mon module.

Sub AppliquerFormuleColonne()
'Saisir la formule d'application ou non de la prime expertise qui se trouve dans l'onglet PRIMES EXPERTISE dans la cellule AG5
Worksheets("BD PAYE").Range("AG5").FormulaR1C1 = "=IF((AND(OR(R[1]C[-26]=""NET"",R[1]C[-26]=""BOY"",R[1]C[-26]=""ABA"",R[1]C[-26]=""DEC"",R[1]C[-26]=""EMB"",R[1]C[-26]=""EXP"",R[1]C[-26]=""MAI"",R[1]C[-26]=""ADM""),OR(R[1]C[-20]=""O"",R[1]C[-20]=""E"",R[1]C[-20]=""APP""))),VLOOKUP(R[1]C[-32],'Primes Expertise'!R3C2:R4991C14,13,0),"""")"
End Sub

La macro ne bug pas mais elle ne saisi pas la bonne fonction dans la bonne cellule. Elle saisis la formule concernant la ligne du dessous dans la cellule du dessus. J'explique :

Attendu : dans cellule AG5
=SI((ET(OU(G5="NET";G5="BOY";G5="ABA";G5="DEC";G5="EMB";G5="EXP";G5="MAI";G5="ADM");OU(M5="O";M5="E";M5="APP")));RECHERCHEV(A5;'Primes Expertise'!$B$3:$N$4991;13;0);"")

dans cellule AG6 =SI((ET(OU(G6="NET";G6="BOY";G6="ABA";G6="DEC";G6="EMB";G6="EXP";G6="MAI";G6="ADM");OU(M6="O";M6="E";M6="APP")));RECHERCHEV(A6;'PRIMES EXPERTISE'!$B$3:$N$4991;13;0);"")

Réalisé après macro : AG5 =
=SI((ET(OU(G6="NET";G6="BOY";G6="ABA";G6="DEC";G6="EMB";G6="EXP";G6="MAI";G6="ADM");OU(M6="O";M6="E";M6="APP")));RECHERCHEV(A6;'PRIMES
EXPERTISE'!$B$3:$N$4991;13;0);"")

Quels paramètres dois-je changer dans le code pour que se soit la ligne 5 qui soit appelée dans la formule ?

Et je ne connais pas l'utilisation de R1 et C1. Pourriez vous m'expliquer ou un lien qui l'explique ?

Je vous remercie d'avance.

Cordialement,

Re

J'ai changé mon profil avec l'année de ma version Excel : 2017.

C'est bon. Merci de votre participation.

Quels paramètres dois-je changer dans le code pour que se soit la ligne 5 qui soit appelée dans la formule ?

Oui juste. Désolé...
Dans toute la ligne de code vous devez enlever ceci --> [1]

Donc vous devez avoir le R tout seul. le C[....] ne change pas bien entendu

Et je ne connais pas l'utilisation de R1 et C1. Pourriez vous m'expliquer ou un lien qui l'explique ?

R pour Row (Ligne)
C pour Column (Colonne)
Dans l'annotation Range("AG5").FormulaR1C1 --> R1C1 est considéré comme référence par rapport à AG5. Donc R1 = Ligne 5 et C1 = Colonne 33(AG)
Maintenant si vous regardez l'annotation RC[-26] dans la nouvelle formule par rapport à AG5 --> R1 = ligne 5 et C1 = colonne 33 - 26 = 7 ce qui correspond à la colonne G et donc G5 dans la formule

Concernant l'erreur : en mettant R[1]C[-26] on tombait donc sur la ligne 6 car R[1] correspond à la ligne 5 + 1

A titre d'info : Si en lieu et place vous enlevez le R1C1 de l'instruction Range("AG5").Formula cela va ajouter les $ pour toutes les cellules reprises dans votre formule. Donc au lieu de G5 vous aurez ceci --> $G$5. Ce qui, dans votre cas, n'est pas ce que vous recherchez bien entendu.

Espérant avoir été clair

Cordialement


Edit : Si ok et terminé pensez à cloturer le fil

Bonjour,

Merci pour votre réponse avec toutes ces explications très claires. J'ai bien compris.

J'ai testé sans le [1] suivant le R (pour que ça reste sur la ligne 5 et pas sur la ligne 6), ce qui donne :

Sub AppliquerFormuleColonne()
'Saisir la formule d'application ou non de la prime expertise qui se trouve dans l'onglet PRIMES EXPERTISE dans la cellule AG5
Worksheets("BD PAYE").Range("AG5").FormulaR1C1 = "=IF((AND(OR(RC[-26]=""NET"",RC[-26]=""BOY"",RC[-26]=""ABA"",RC[-26]=""DEC"",RC[-26]=""EMB"",RC[-26]=""EXP"",RC[-26]=""MAI"",RC[-26]=""ADM""),OR(RC[-20]=""O"",RC[-20]=""E"",RC[-20]=""APP""))),VLOOKUP(RC[-32],'Primes Expertise'!R3C2:R4991C14,13,0),"""")"
End Sub

ce code donne le résultat que j'attendais. La formule saisi est celle qui est attendue et indique le résultat attendu dans la cellule.

Je commence maintenant l'étape de la boucle pour saisir la formule dans toute la colonne en prenant en compte le changement de ligne concernée et je vais également ajouter la notion de détecter la dernière ligne avec des données dans la colonne A pour que la fin soit évolutive puisque le tableau peut avoir plus ou moins de lignes.

Est-ce que je met ce poste comme solutionné et si j'ai un problème avec la boucle, je créais un nouveau poste ?

Cordialement,

Bonjour,

Je commence maintenant l'étape de la boucle pour saisir la formule dans toute la colonne en prenant en compte le changement de ligne concernée et je vais également ajouter la notion de détecter la dernière ligne avec des données dans la colonne A

Si vous devez mettre la formule sur toute la colonne en tenant compte de la dernière cellule enregistrée en colonne A, pas besoin de boucle, le code peut être comme ceci :

Sub AppliquerFormuleColonne()
'Saisir la formule d'application ou non de la prime expertise qui se trouve dans l'onglet PRIMES EXPERTISE dans la cellule AG5
Dim dlg As Integer
With Worksheets("BD PAYE")
    dlg = .Range("A" & Rows.Count).End(xlUp).Row 'derniere ligne en colonne A
    With .Range("AG5")
        .FormulaR1C1 = "=IF((AND(OR(RC[-26]=""NET"",RC[-26]=""BOY"",RC[-26]=""ABA"",RC[-26]=""DEC"",RC[-26]=""EMB"",RC[-26]=""EXP"",RC[-26]=""MAI"",RC[-26]=""ADM""),OR(RC[-20]=""O"",RC[-20]=""E"",RC[-20]=""APP""))),VLOOKUP(RC[-32],'Primes Expertise'!R3C2:R4991C14,13,0),"""")"
        .AutoFill Destination:=Range("AG5:AG" & dlg), Type:=xlFillDefault 'recopie formule vers le bas
    End With
End With

Est-ce que je met ce poste comme solutionné et si j'ai un problème avec la boucle, je créais un nouveau poste

Non ce n'est pas nécessaire cela concerne le même sujet

Cordialement

Merci pour votre réponse avec votre proposition de code.

En effet, en réfléchissant plus sur mon sujet, il n'y avait pas besoin de boucle.

Avant que je ne vois votre proposition, j'avais rédigé et testé celui-ci :

Sub AppliquerFormuleColonne()
    'Déclarer la constante de la notion de dernière ligne
    Dim DerniereLigne As Long
    'Déclarer la constante de la notion de formule
    Dim Formule As String

    'déterminer la dernière ligne avec des données dans la colonne A
    DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row

    'Définir la formule à appliquer
    Formule = "=IF((AND(OR(RC[-26]=""NET"",RC[-26]=""BOY"",RC[-26]=""ABA"",RC[-26]=""DEC"",RC[-26]=""EMB"",RC[-26]=""EXP"",RC[-26]=""MAI"",RC[-26]=""ADM""),OR(RC[-20]=""O"",RC[-20]=""E"",RC[-20]=""APP""))),VLOOKUP(RC[-32],'Primes Expertise'!R3C2:R4991C14,13,0),"""")"
    'Appliquer la formule de la ligne 5 à la dernière ligne
    Range("AG5:AG" & DerniereLigne).Formula = Formule
End Sub

Il fonctionne.

J'ai aussi testé le votre qui fonctionne également.

Merci beaucoup. J'apprends beaucoup avec vous.

Je vous souhaite une bonne continuation.

Peut être que nous nous retrouverons sur un autre sujet.

Cordialement,

Re

Oui effectivement votre code est bon

Une remarque toutefois dans cette ligne -->

DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row

Pensez à toujours ajouter le nom des feuilles. Donc par exemple dans cette ligne comme ceci

DerniereLigne = Worksheets("BD PAYE").(Range("A" & Rows.Count).End(xlUp).Row

Idem plus bas dans le ligne Range("AG5:AG" & )....... = Formule

In fine le mieux serait même d'ajouter le nom du fichier. Juste pour le cas où vous auriez deux fichiers ouverts avec le même nom de feuilles actives à l'écran.

rem : Ce n'est pas obligatoire mais si le code VBA se trouve dans le même fichier que celui qui contient la formule (ce qui est votre cas) vous pourriez même écrire comme ceci :

DerniereLigne = Thisworkbook.Worksheets("BD PAYE").(Range("A" & Rows.Count).End(xlUp).Row

Cordialement

Rechercher des sujets similaires à "saisir fonction toute colonne bouton macro vba"