OVH Cloud OVH Cloud

Utiliser un paramètre dans une fonction

7 réponses
Avatar
Gillou
Bonjour

J'ai écrit une macro en VBA, faisant appel à une fonction f.

Je veux appeler dans cette fonction un paramètre s qui dépend de l'onglet
sur lequel on se trouve.

schématiquement j'ai fait :
dim s as integer
si onglet est onglet n°1 alors s=1
si onglet est onglet n°2 alors s=2
...

ensuite j'appelle ma fonction :
recherchev(numéro,plage, s, faux)

Cela me met une erreur. Fais-je une erreur dans la façon d'appeler le
paramètre ? J'ai essaye de le mettre entre guillements, entre apostrophes, ça
ne change rien...

Je ne connais pas bien VBA, merci de votre aide !

7 réponses

Avatar
michdenis
Bonjour Gilllou,

Un petit exemple simple :

'------------------------
Sub AppelDeLaFonction()

MsgBox NomFeuille(1)

End Sub
'------------------------

Function NomFeuille(No As Integer)

NomFeuille = Worksheets(No).Name

End Function
'------------------------


Salutations!







"Gillou" a écrit dans le message de news:
Bonjour

J'ai écrit une macro en VBA, faisant appel à une fonction f.

Je veux appeler dans cette fonction un paramètre s qui dépend de l'onglet
sur lequel on se trouve.

schématiquement j'ai fait :
dim s as integer
si onglet est onglet n°1 alors s=1
si onglet est onglet n°2 alors s=2
...

ensuite j'appelle ma fonction :
recherchev(numéro,plage, s, faux)

Cela me met une erreur. Fais-je une erreur dans la façon d'appeler le
paramètre ? J'ai essaye de le mettre entre guillements, entre apostrophes, ça
ne change rien...

Je ne connais pas bien VBA, merci de votre aide !
Avatar
Gillou
Voilà ce que j'ai fait :


Sub MAJ_Traitement_flux(s As Integer)
If ActiveSheet.Name = "nom1" Then
s = -2
ElseIf ActiveSheet.Name = "nom2" Then
s = 8
...etc...
End If

Dim c As Range
For Each c In ActiveSheet.Range(Cells(2, 7), Cells(2000, 2000))
c = "=VLOOKUP(RC3,plage de référence,2*(column(c)+s),FALSE)"
next c
end sub

Quand je lance la macro, par exemple depuis l'onglet n°2 (avec donc s=8), il
me met "Argument non facultatif", donc il ne comprend pas que s=8.

Je suppose que j'ai fait une énorme boulette quelque part et que l'on va me
conspuer :-S, mais où ?

Merci
Avatar
michdenis
Bonjour Gillou,

Une façon d'utiliser Excel pour qu'il nous aide à écrire un bout de fonction.

Écrit ta formule de recherche dans une cellule comme tu voudrais qu'elle fonctionne.

Tu utilises quelques lignes de code pour obtenir ce que doit avoir l'air ta formule que tu utiliseras dans le code.

Suppose que ta formule est écrite en A1

A = range("A1").formulalocal
'Tu recopie ta formule dans une cellule que tu pourras récupérer par un copier-coller pour ta vraie procédure.
'Utilisation d'un apostrophe simple entouré de guillemets pour signifier que j'entre du texte dans la cellule pour
les fins que l'on connait.
Range("G1") = "'" & A
Une formule de recherche donne ceci :
'=RECHERCHEV(E1;toto;2;FAUX)
toto est une plage nommée.

Il ne te reste plus qu'à copier ta formule en G1 dans ta procédure en enlevant l'apostrophe du début
dans ta procédure, tu modifies ta formule pour insérer une variable

Observe comment j'ai introduit la variable S dans la formule dans la fenêtre VBE
S = 2
For each C in Range("B5:C10")
c.formulalocal = "=RECHERCHEV(E1;toto;2" & S & ";FAUX)"
End if


Voilà le principe.

Salutations!


"Gillou" a écrit dans le message de news:
Voilà ce que j'ai fait :


Sub MAJ_Traitement_flux(s As Integer)
If ActiveSheet.Name = "nom1" Then
s = -2
ElseIf ActiveSheet.Name = "nom2" Then
s = 8
...etc...
End If

Dim c As Range
For Each c In ActiveSheet.Range(Cells(2, 7), Cells(2000, 2000))
c = "=VLOOKUP(RC3,plage de référence,2*(column(c)+s),FALSE)"
next c
end sub

Quand je lance la macro, par exemple depuis l'onglet n°2 (avec donc s=8), il
me met "Argument non facultatif", donc il ne comprend pas que s=8.

Je suppose que j'ai fait une énorme boulette quelque part et que l'on va me
conspuer :-S, mais où ?

Merci
Avatar
michdenis
Un oubli, après le 2 j'aurais du ajouter le symbole de la multiplication

c.formulalocal = "=RECHERCHEV(E1;toto;2*" & S & ";FAUX)"


Salutations!




"michdenis" a écrit dans le message de news: %
Bonjour Gillou,

Une façon d'utiliser Excel pour qu'il nous aide à écrire un bout de fonction.

Écrit ta formule de recherche dans une cellule comme tu voudrais qu'elle fonctionne.

Tu utilises quelques lignes de code pour obtenir ce que doit avoir l'air ta formule que tu utiliseras dans le code.

Suppose que ta formule est écrite en A1

A = range("A1").formulalocal
'Tu recopie ta formule dans une cellule que tu pourras récupérer par un copier-coller pour ta vraie procédure.
'Utilisation d'un apostrophe simple entouré de guillemets pour signifier que j'entre du texte dans la cellule pour
les fins que l'on connait.
Range("G1") = "'" & A
Une formule de recherche donne ceci :
'=RECHERCHEV(E1;toto;2;FAUX)
toto est une plage nommée.

Il ne te reste plus qu'à copier ta formule en G1 dans ta procédure en enlevant l'apostrophe du début
dans ta procédure, tu modifies ta formule pour insérer une variable

Observe comment j'ai introduit la variable S dans la formule dans la fenêtre VBE
S = 2
For each C in Range("B5:C10")
c.formulalocal = "=RECHERCHEV(E1;toto;2" & S & ";FAUX)"
End if


Voilà le principe.

Salutations!


"Gillou" a écrit dans le message de news:
Voilà ce que j'ai fait :


Sub MAJ_Traitement_flux(s As Integer)
If ActiveSheet.Name = "nom1" Then
s = -2
ElseIf ActiveSheet.Name = "nom2" Then
s = 8
...etc...
End If

Dim c As Range
For Each c In ActiveSheet.Range(Cells(2, 7), Cells(2000, 2000))
c = "=VLOOKUP(RC3,plage de référence,2*(column(c)+s),FALSE)"
next c
end sub

Quand je lance la macro, par exemple depuis l'onglet n°2 (avec donc s=8), il
me met "Argument non facultatif", donc il ne comprend pas que s=8.

Je suppose que j'ai fait une énorme boulette quelque part et que l'on va me
conspuer :-S, mais où ?

Merci
Avatar
Gillou
Un oubli, après le 2 j'aurais du ajouter le symbole de la multiplication

c.formulalocal = "=RECHERCHEV(E1;toto;2*" & S & ";FAUX)"


Ok, merci pour la précision et le souci de pédagogie ! Je testerai tout
ça sur mon fichier au bureau demain, je te tiendrai au courant.

A+
Gillou

Avatar
Gillou
Bon ben décidemment je n'y arrive pas :'-(

Voilà ma macro :

sub MAJ()
If ActiveSheet.Name = "juillet 2004" Then
s = -2
ElseIf ActiveSheet.Name = "mai 2005" Then
s = 8
Else
MsgBox (ERREUR)
End If

Dim c As Range
For Each c In ActiveSheet.Range(Cells(2, 7), Cells(100, 100))
c.FormulaLocal = "=VLOOKUP(RC3,plage,2*(column(c)+ " & s & "),FALSE)"
next c
end sub

Quand je lance l'exécution j'ai l'erreur d'exécution 1004 : erreur définie
par l'application ou par l'objet et il me surligne la ligne avec la formule.

J'ai fait quelque chose de mal ? :-S
Avatar
michdenis
Bonjour Gillou,

A ) Attention, il ne faut pas se méprendre sur les 2 méthodes de l'objet Range .

- FormulaLocal = Les fonctions s'écrivent en françaiis, le séparateur d'argument des fonctions demeure le point-virgule
Cette méthode permet aux utilisateurs de versions autre que l'anglais, de conserver les paramêtres
locaux

-Formula = C'est la façon "Américaine ( anglaise ) d'écrire les formules avec ce que cela sous-tend.


Ta formule devrait s'écrire comme cela :

'*************************
c.FormulaLocal = "=RechercheV(B1;Plage;2*(Colonne(" & c.Address(0, 0) & ")+ " & s & ");Faux)"
'*************************

Pour les besoins de la cause, j'ai remplacé RC3 de ta formule initiale par B1. En fait, Il faudra que tu remplace B1 par l'adresse
de la cellule où la fonction "rechercheV" doit puiser ce qui est recherché par la formule.

Attention à cette adresse (B1) , Comme tu recopies ta formule sur plusieurs lignes et plusieurs colonnes, ce que je me pose comme
question, Est-ce que cette adresse doit être relative (B1) ou absolue($B$1) ou bien mixe. Selon ta réponse, il se peut que tu doives
modifier ta boucle pour en faire 2 boucles imbriquées.

-Test ces 2 exemples sur une nouvelle feuille -

Voici un exemple d'une boucle qui copie dans chaque chaque cellule ... mais ligne par ligne d'une plage et ce en utilisant une
référence mixe... c'est à dire en figeant la ligne et incrémentant la colonne
'--------------------
For Each r In ActiveSheet.Range(Cells(2, 7), Cells(10, 10)).Rows
For Each c In r.Cells
c.FormulaLocal = "=" & Cells(c.Row, c.Offset(, -3).Column).Address(1, 0) & ""
Next
Next
'--------------------

Pour faire l'inverse
Cette boucle fige la colonne de l'adresse et boucle , colonne par colonne.
'--------------------
For Each r In ActiveSheet.Range(Cells(2, 7), Cells(10, 10)).Columns
For Each c In r.Cells
c.FormulaLocal = "=" & Cells(c.Row, c.Offset(, -3).Column).Address(0, 1) & ""
Next
Next
'--------------------


Salutations!



"Gillou" a écrit dans le message de news:
Bon ben décidemment je n'y arrive pas :'-(

Voilà ma macro :

sub MAJ()
If ActiveSheet.Name = "juillet 2004" Then
s = -2
ElseIf ActiveSheet.Name = "mai 2005" Then
s = 8
Else
MsgBox (ERREUR)
End If

Dim c As Range
For Each c In ActiveSheet.Range(Cells(2, 7), Cells(100, 100))
c.FormulaLocal = "=VLOOKUP(RC3,plage,2*(column(c)+ " & s & "),FALSE)"
next c
end sub

Quand je lance l'exécution j'ai l'erreur d'exécution 1004 : erreur définie
par l'application ou par l'objet et il me surligne la ligne avec la formule.

J'ai fait quelque chose de mal ? :-S