VBA fonction avec un argument d'une seule valeur
Fermé
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
- Mettre une seule page en paysage word mac - Guide
- Fonction find vba - Astuces et Solutions
- Son dans un seul écouteur avec fil ✓ - Forum Audio
3 réponses
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 260
28 mai 2015 à 19:13
28 mai 2015 à 19:13
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
ccm81
Messages postés
10908
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
2 mai 2025
2 431
Modifié par ccm81 le 29/05/2015 à 17:10
Modifié par ccm81 le 29/05/2015 à 17:10
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
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 260
29 mai 2015 à 23:20
29 mai 2015 à 23:20
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
29 mai 2015 à 13:36
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.
29 mai 2015 à 13:57
Je n'ai pas ce pb.
Merci de déposer un fichier.
eric
29 mai 2015 à 15:21
http://cjoint.com/?EEDptToWsJU
Merci de votre aide en tout cas