VBA fonction avec un argument d'une seule valeur

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.

3 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. Mathieu
       
      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
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

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

      eric
      0
      1. Mathieu > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
         
        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
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. Mathieu
       
      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
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. Mathieu
       
      Merci, oui je crois que je ne vais pas avoir le choix.
      0