Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Novice : Type d'argument byref incompatible

  • Initiateur de la discussion Initiateur de la discussion mlmoracle
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

M

mlmoracle

Guest
Bonjour tout le monde !
Voilà je suis novice dans ce domaine, je voudrai de l'aide 🙂

Voici ma fonction :

Code:
Public Function Longueur(ByRef A As Integer, ByRef B As Integer) As Integer

    ' Boucle pour déterminer la 1. ligne de données de la colonne "(mm)"
    A = 1
    Do While Range(Colonne & A).Value <> "Usure (mm)"
        A = A + 1
    Loop
    Close
    A = A + 1
    B = A


    ' Boucle pour déterminer la dernière ligne de données de la colonne "(mm)"
    Do While Range(Colonne & B).Value <> ""
        B = B + 1
    Loop
    Close
    B = B - 1
    
End Function

Et dans mon sub je l'appelle comme ceci :

Code:
Public Ligne_début As Integer
Public Ligne_fin As Integer
Public Colonne As String

[...]
Colonne = "A"
Call Longueur(Ligne_début, Ligne_fin)
[...]

Voilà dites moi tout ce qui ne va pas, j'aimerai comprendre ce satané langage 🙂

Edit : la macro s'arrête à Call Longueur(Ligne_début, Ligne_fin)
Erreur : Type d'argument byref incompatible
 
Dernière modification par un modérateur:
Re : Novice : Type d'argument byref incompatible

Bonjour Mlmoracle, bonjour le forum,

Heu comprend plus rien moi tu as modifié entre temps c'est pas possible ??? Tu avais écris Call Longueur(Ligne_début, Ligne_dernier), et en modifiant Ligne_dernier par Ligne_fin chez moi ça marche. Après avoir testé (tu aurais pu mettre le début de la macro...), je viens pour te répondre et tu as déjà corrigé... Et tu dis que ça ne marche toujours pas... C'est pas clair ton histoire.
 
Re : Novice : Type d'argument byref incompatible

Bonjour mlMoracle;

En premier lieu une procédure Function est sensée retournée une valeur. Or celle que tu as ecrite ne renvoie rien.

Il faut donc la déclarer comme procedure Sub(Arg1,Arg2)

Quand une variable est passée comme argument byRef, en fait, vba passe une référence à la variable et non une valeur.

Donc A ou B ne contiennent pas de valeur mais une référence à Ligne_Debut et Ligne_Fin. A l'interieur de ta 'fonction' tu modifies Ligne_Debut et Ligne_Fin extérieures à la fonction, en passant par leur référence. C'est un cas que VBA n'aime pas et te le signale. Donc si tu veux modifier des variables Public il ne faut pas les passer en argument par référence et tu pourrais ecrire:

Code:
Public Sub Longueur() 
    ' Boucle pour déterminer la 1. ligne de données de la colonne "(mm)"
    Ligne_Debut = 1
    Do While Range(Colonne & Ligne_Debut).Value <> "Usure (mm)"
        Ligne_Debut= Ligne_Debut + 1
    Loop
    Close
    Ligne_Debut=Ligne_Debut+1
 
   '.....etc
End Sub

Ligne_Debut et Ligne_Fin en serait modifié à l'extérieur de ta procédure.

Si tu ne veux pas modifier les variables public Ligne_Debut et Ligne_fin il
faut les passer en argument par valeur par le mot clef ByVal.

Code:
Public Sub Longueur(ByVal A as Integer, ByVal B as Integer) 
'......
   A=A+1
'......
End Sub

Ainsi ce ne sont plus des références qui sont passées à la procédure mais des valeurs. La Ligne A=A+1 ne modifie pas Ligne_Debut.

Ceci dit, Pour déterminer la ligne d'une cellule d'une colonne, contenant une certaine valeur tu peux faire

Code:
Dim c As Range
'Chercher "Usure (mm)" dans la colonne A de la feuille
Set c= Range("A:A") .Find(What:="Usure (mm)", LookIn:=xlValues)
If not c is nothing then  
     Ligne_Debut=c.row
     Ligne_Fin=c.row.End(XlDown).row
end if

Cette methode est bien plus rapide qu'une boucle, surtout si la plage contient beaucoup de lignes.

A bientôt

[Edit] Salut Robert..... 😉
 
Dernière modification par un modérateur:
Re : Novice : Type d'argument byref incompatible

Oula quelle réactivité ! 🙂 J'aurai jamais pensé avoir une réponse si rapide mais aussi si complète 😀.
En fait oui Robert tu as raison j'ai changé entre temps car je me suis aperçu de mon erreur 😛 c'était bien ça.

Hasco, je veux utiliser ta méthode rapide (car j'ai 20.000 lignes à traiter 😀)
Pour trouver la première de la colonne c'est ok, je recherche "Usure (mm)", mais comment puis-je faire pour trouver la fin; c-a-d la première case vide que je rencontre dans cette colonne Usure (mm)?
 
Re : Novice : Type d'argument byref incompatible

Re,

Code:
Dim c As Range
'Chercher "Usure (mm)" dans la colonne A de la feuille et la dernière ligne non vide si "Usure (mm)" est trouvé
Set c= Range("A:A") .Find(What:="Usure (mm)", LookIn:=xlValues)
If not c is nothing then  
     Ligne_Debut=c.row
     [COLOR=red][B]Ligne_Fin=c.row.End(XlDown).row 'Dernière ligne non vide
[/B][/COLOR]end if

A bientôt
 
Re : Novice : Type d'argument byref incompatible

Re,
Je viens de tester à l'instant

Code:
Ligne_Fin=c[COLOR=red][B].row[/B][/COLOR].End(XlDown).row 'Dernière ligne non vide
end if


Erreur : Qualificateur incorrect

ça peut venir d'où ?
 
Re : Novice : Type d'argument byref incompatible

mlmoracle,

Excuses, j'ai fait une erreur de syntaxe en écrivant sans tester:

correction-> Ligne_Fin=c.End(XlDown).row 'Dernière ligne non vide

Enlever le premier.row

A bientôt
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
1
Affichages
325
Réponses
15
Affichages
989
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…