Vba passage de paramettre non attendu ?

Fermé
mortelrdv - 31 mars 2010 à 15:15
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 - 2 avril 2010 à 00:26
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

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
31 mars 2010 à 19:06
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
31 mars 2010 à 21:09
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
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
31 mars 2010 à 21:44
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
1 avril 2010 à 09:44
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
1 avril 2010 à 20:24
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
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
1 avril 2010 à 23:04
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
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié par pilas31 le 1/04/2010 à 23:17
Salut,

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

A+
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
2 avril 2010 à 00:26
En fait c'est le Call qui fait que ça passe ^^

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