VBA fonction avec un argument d'une seule valeur

Fermé
Mathieu - 28 mai 2015 à 18:57
 Mathieu - 30 mai 2015 à 16:09
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.

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
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
0
Function TestM(Plage1, Plage2)

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.
0
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 à 13:57
Bonjour,

Je n'ai pas ce pb.
Merci de déposer un fichier.

eric
0
Mathieu > eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024
29 mai 2015 à 15:21
Voici le lien (ça ne fonctionne pas quand la sélection de la plage est réduite à 1 cellule, or ça m'arrive souvent dans l'utilisation de la fonction)

http://cjoint.com/?EEDptToWsJU

Merci de votre aide en tout cas
0
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
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
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
0
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
0
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
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 :
    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
0
Merci, oui je crois que je ne vais pas avoir le choix.
0