Vba passage de paramettre non attendu ?

mortelrdv -  
Polux31 Messages postés 7219 Statut Membre -
Bonjour,

Je suis sous excel 2003 SP2
supposons le code suivant
Function test()
       lastRowSheet  worksheets("Feuil1")
       toto worksheets("Feuil1")

End Function

Function toto(ParamArray tableau())

     lastRowSheet tableau(0) 

End Function


Function lastRowSheet(wsExcel As Worksheet) As Long
   'Dim Recycle As Variant
   'Recycle = wsExcel.UsedRange(1)
   'lastRowSheet = wsExcel.Range("A1").SpecialCells(xlCellTypeLastCell).Row
    On Error GoTo suivante:
    lastRowSheet = wsExcel.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
    Exit Function

suivante:
    lastRowSheet = 1
End Function


j'obtiens une erreur dans la fonction toto indiquant "type d'argument byref incompatible", alors que la variable tableau(0) correspond bien à la "Feuil1". tableau(0) est de type Variant/Object/Feuil1

alors que je n'ai pas d'erreur avec la ligne "lastRowSheet worksheets("Feuil1")" dans la fonction test.

Avez vous une idée pour surmonter le probleme ?

Merci
PS: j'ai besoin de la fonction "Function toto(ParamArray tableau())"

8 réponses

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonjour,

    Je crois comprendre que ParamArray est un argument toujours passé par valeur ce qui est incompatible avec l'appel par défaut par référence dans la fonction lastRowSheet.

    Je suggère d'essayer juste la modification suivante dans la déclaration de la fonction :

    Function lastRowSheet(ByVal wsExcel As Worksheet) As Long
    .....

    A+
    0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Worksheets("Feuil1") est un objet. Un objet est toujours passé en référence.

    Toto attend un tableau comme paramètre et non un objet.

    A quoi devrait correspondre tableau(0) du worksheets("Feuil1") ?

    Function toto(wsExcel As Worksheet) devrait fonctionner

    ;o)
    0
  3. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonsoir Polux,

    Oui, je suis d'accord avec toi, celà me paraissait illogique mais aprés test, le passage par valeur fonctionne. C'est pas logique mais ça marche !!

    Ceci dit, l'exemple de mortelrdv est un peu particulier

    A+
    0
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour pilas,

    Effectivement le passage d'un objet par valeur est accepté par Excel. Je vois pas trop pourquoi, mais ça marche.

    Ce qui m'intéresserai de savoir, c'est ce que représente tableau(0) dans la feuille 1 pour mortelrdv.

    ;o)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mortelrdv
     
    Bonsoir,

    pilas31
    J'ai pas penser à utiliser ByVal sur lastRowSheet, je vais essayer de tester

    Polux31
    Function toto(wsExcel As Worksheet) : c'est sur que ça marche mais c'est trop limité pour ce que je fais.
    J'ai besoin que la fonction toto utilise ParamArray : car comme ça on peut appeler toto en passant un nombre 'illimité' de 'parametres' de type différent (objet, long, variant, string,...).
    Et l'utilisation de 'Optional' n'est pas pratique.

    le code que j'ai mis est un exemple du probleme que je rencontre dans mon programme.

    Dans ce code simpliste pour démontrer le probleme que je rencontre, toto ne reçoit qu'un parametre objet (representant un worksheet). Mais dans mon programme réel, l'utilisation de ParamArray me permet de passer à la fontion plusieurs parametres de types différents genre string,long,object,variant,...

    Dans cette exemple on passe à la fonction toto un objet worksheets("Feuil1") représentant la feuille1, ce qui veut dire qu'on peut faire dans la fonction toto:
    tableau(0).cell(1.12).value = 25
    tableau(0).Name
    tableau(0).Range...
    etc
    tableau(0) devrait donc etre un objet worksheet

    Comme dans toto, le parametre tableau(0) est sensé représenter la feuille1, je me suis dit qu'on pouvait l'envoyer à une autre fonction (dans notre cas lastRowSheet) qui attend un object worksheet.

    Donc :
    l'objet worksheets("Feuil1") est envoyé à toto qui l'envoie à son tour à lastRowSheet, mais ça marche pas
    l'objet worksheets("Feuil1") est envoyé directement à lastRowSheet, ça marche

    Si on regarde dans la fenetre 'Espions' de Visual Basic, le type que représente worksheets("Feuil1") est Object/Feuil1 alors que tableau(0) est Variant/Object/Feuil1.

    Par de multiple essais en tout genre, je suis tomber sur un truc qui marche par pure hazard:
    Function toto(ParamArray tableau())
    dim interm as object

    set interm = tableau(0) 'on dirait que ça fait un genre de cast
    lastRowSheet interm

    End Function
    0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour tous,

    J'ai besoin que la fonction toto utilise ParamArray : car comme ça on peut appeler toto en passant un nombre 'illimité' de 'parametres' de type différent (objet, long, variant, string,...).
    Et l'utilisation de 'Optional' n'est pas pratique
    .
    Si tu met...
        Function toto(Var as Variant) as Variant

    Ca va tout accepter et tout renvoyer.
    A+
    0
  8. mortelrdv
     
    Bonsoir,

    Si tu met...
    
        Function toto(Var as Variant) as Variant
    
    
    Ca va tout accepter et tout renvoyer.

    Peut etre, mais ta fonction n'accepte qu'un seul parametre.
    Alors que Function toto(ParamArray tableau()) permet d'accepter plusieurs parametres

    Cdlt
    0
  9. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Ca fonctionne comme ça chez moi:

    Sub test()
    
        toto Worksheets(1)
        
    End Sub
    
    
    Function toto(ParamArray tableau())
    Dim tablo
    
     Set tablo = tableau(0)
     
       Call lastRowSheet(tablo)
    
        
    End Function
    
    Function lastRowSheet(wsExcel As Variant) As Long
       'Dim Recycle As Variant
       'Recycle = wsExcel.UsedRange(1)
       'lastRowSheet = wsExcel.Range("A1").SpecialCells(xlCellTypeLastCell).Row
       On Error GoTo suivante:
       'MsgBox wsExcel.Name
        lastRowSheet = wsExcel.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
        Exit Function
    
    suivante:
        lastRowSheet = 1
    End Function
    
    0
    1. pilas31 Messages postés 1878 Statut Contributeur 648
       
      Salut,

      C'est assez logique dans la mesure ou tu affectes la valeur à tablo qui lui est passé en référence.

      A+
      0
    2. Polux31 Messages postés 7219 Statut Membre 1 204
       
      En fait c'est le Call qui fait que ça passe ^^

      Call lastRowSheet (tableau(0)) passe également.
      0