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
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
A voir également:
- Vba passage de paramettre non attendu ?
- Passage qwerty azerty - Guide
- Vba dépassement de capacité ✓ - Forum Excel
- Find vba - Astuces et Solutions
- Vba attendre 1 seconde ✓ - Forum VB / VBA
- Mkdir vba ✓ - Forum VB / VBA
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
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+
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+
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
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)
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)
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
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+
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+
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
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)
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
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
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...
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
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
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
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
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+
C'est assez logique dans la mesure ou tu affectes la valeur à tablo qui lui est passé en référence.
A+
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
2 avril 2010 à 00:26
En fait c'est le Call qui fait que ça passe ^^
Call lastRowSheet (tableau(0)) passe également.
Call lastRowSheet (tableau(0)) passe également.