Vba passage de paramettre non attendu ?
mortelrdv
-
Polux31 Messages postés 6917 Date d'inscription Statut Membre Dernière intervention -
Polux31 Messages postés 6917 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis sous excel 2003 SP2
supposons le code suivant
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())"
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())"
A voir également:
- Vba passage de paramettre non attendu ?
- Passage qwerty azerty - Guide
- Test passage windows 11 - Guide
- Passage à windows 11 gratuit - Guide
- Passage windows 7 à 10 - Accueil - Mise à jour
- Excel compter cellule couleur sans vba - Guide
8 réponses
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+
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+
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)
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)
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+
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+
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)
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)
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
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
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...
Ca va tout accepter et tout renvoyer.
A+
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+
Bonsoir,
Peut etre, mais ta fonction n'accepte qu'un seul parametre.
Alors que Function toto(ParamArray tableau()) permet d'accepter plusieurs parametres
Cdlt
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
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