VBA fonction avec un argument d'une seule valeur
Mathieu
-
Mathieu -
Mathieu -
Bonjour
J'ai créé une fonction en VBA qui est alimentée par deux arguments A et B, de taille variable. Dans la fonction je fais appel aux valeurs prises au moyen de la syntaxe A(i, 1) et B(i, 1). Tout fonctionne bien quand il y a plus d'une valeur, mais quand A ou B n'ont qu'une seule valeur cela ne fonctionne pas : A(1, 1) est considéré comme vide ce qui m'oblige dans toute la fonction à distinguer pour chaque bloc le cas où A est constitué d'une ou plusieurs valeurs, or ne pas distinguer me ferait gagner pas mal de lignes.
Merci pour votre aide.
J'ai créé une fonction en VBA qui est alimentée par deux arguments A et B, de taille variable. Dans la fonction je fais appel aux valeurs prises au moyen de la syntaxe A(i, 1) et B(i, 1). Tout fonctionne bien quand il y a plus d'une valeur, mais quand A ou B n'ont qu'une seule valeur cela ne fonctionne pas : A(1, 1) est considéré comme vide ce qui m'oblige dans toute la fonction à distinguer pour chaque bloc le cas où A est constitué d'une ou plusieurs valeurs, or ne pas distinguer me ferait gagner pas mal de lignes.
Merci pour votre aide.
A voir également:
- VBA fonction avec un argument d'une seule valeur
- Fonction si et - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Powerpoint changer orientation d'une seule diapositive - Forum Powerpoint
- Fonction find vba - Astuces et Solutions
- Mettre une seule page en paysage word - Guide
3 réponses
Bonjour,
Un peu vague tout ça.
Dépose un fichier avec ta fonction et un exemple des 2 cas.
cjoint.com et coller ici le lien fourni.
eric
Un peu vague tout ça.
Dépose un fichier avec ta fonction et un exemple des 2 cas.
cjoint.com et coller ici le lien fourni.
eric
Bonjour à tous les deux
RQ1. Et en écrivant ta formule comme ceci, et sans validation matricielle ?
=10*testm(A2:A3;B2:B3)
RQ2. =SOMMEPROD((A2:A3)*(B2:B3)*10) fait la même chose non ?
RQ3. Sinon, tu peux séparer le coefficient multiplicateur
=testM1(A2:A3;10;B2:B3)
avec ce code
RQ4. tu as aussi dans le même esprit en plus simple
Cdlmnt
RQ1. Et en écrivant ta formule comme ceci, et sans validation matricielle ?
=10*testm(A2:A3;B2:B3)
RQ2. =SOMMEPROD((A2:A3)*(B2:B3)*10) fait la même chose non ?
RQ3. Sinon, tu peux séparer le coefficient multiplicateur
=testM1(A2:A3;10;B2:B3)
avec ce code
Public Function TestM1(plage1 As Range, k As Single, plage2 As Range)
Dim s As Single, i As Long
If plage1.Cells.Count <> plage2.Cells.Count Then TestM1 = "erreur": Exit Function
s = 0
For i = 1 To plage1.Cells.Count
s = s + plage1.Cells(i, 1) * k * plage2.Cells(i, 1)
Next i
TestM1 = s
End Function
RQ4. tu as aussi dans le même esprit en plus simple
Public Function TestM3(k, plage1, plage2)
TestM3 = k * Application.WorksheetFunction.SumProduct(plage1, plage2)
End Function
Cdlmnt
Merci mais en fait j'ai façonné un exemple très simple mais dans les faits mes arguments Plage1 et Plage2 sont parfois bien plus complexes que seulement *100 : ça peut-être dans ce style là (A1:A20)*(mod(A1:A20;3)=1)*(.. , Le sentiment que j'ai que je déclare peut-être mal mes variables, il n'y a pas, je pense, de raison qu'une variable tableau ne puisse pas être constituée d'une seule ligne
Re,
Je crois que tu n'as pas le choix.
Mais tu n'es peut-être pas obligé de doubler toute ta fonction.
Tu peux tester et transformer en tableau si ce n'est qu'une cellule. Par exemple :
ensuite tu travailles avec tabl1.
eric
Je crois que tu n'as pas le choix.
Mais tu n'es peut-être pas obligé de doubler toute ta fonction.
Tu peux tester et transformer en tableau si ce n'est qu'une cellule. Par exemple :
Dim tabl1 If IsArray(Plage1) Then tabl1 = Plage1 Else ReDim tabl1(1 To 1, 1 To 1) tabl1(1, 1) = Plage1 End If
ensuite tu travailles avec tabl1.
eric
For i = 1 to Application.Count(Plage1)
TestM = TestM + Plage1(i, 1) * Plage2(i, 1)
Next
End Function
Où Plage1 et Plage2 sont des plages de cellules de nombres avec par exemple Plage1 => (A1:A5)*100 et Plage2 => B1:B5
Quand la plage plusieurs cellules ça marche mais quand elle n'en a qu'une (Plage1 => A1*100) eh bien ça ne marche pas, pour cela il faut que change Plage1(i, 1) par Plage1 or je veux l'éviter pour ne pas complexifier le code.
Merci.
Je n'ai pas ce pb.
Merci de déposer un fichier.
eric
http://cjoint.com/?EEDptToWsJU
Merci de votre aide en tout cas