Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/11/2011, 10h07   #1
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
Par défaut Problème ByRef, argument incompatible

Bonjour à toutes et à tous,

Un peu à l'image de ce que j'ai déjà pu poster sur ce forum (http://www.developpez.net/forums/d11...ion-variables/), me voici de nouveau confronté à ce type de problème.

Je cherche à simplifier mon code, qui a la gueule suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
For Each cel In Worksheets(3).Range("I" & 11 + nprec & ":I" & 11 + n - 1)
If cel.Value = Range("H3").Value Then
        With Worksheets(4)
            If ind Mod (3) <> 0 Or ind = 0 Then
                .Range("F18").Offset(ind * 4 + 2 * ind2, 0).Value = .Range("F18").Offset(ind * 4 + 2 * ind2, 0).Value + cel.Offset(0, -1).Value
                test = False
            Else
                .Range("F18").Offset(ind * 4 + 2 * ind / 3, 0).Value = .Range("F18").Offset(ind * 4 + 2 * ind / 3, 0).Value + cel.Offset(0, -1).Value
                test = True
            End If
        End With
ElseIf cel.Value = Range("H4").Value Then     
...
en un code plus sympa, du type :

Code :
1
2
3
4
5
6
7
    For Each cel In Worksheets(3).Range("I" & 11 + nprec & ":I" & 11 + n - 1)
        If cel.Value = Range("H3").Value Then 
            test = exporterValeurs(Range("F18"), cel, ind, ind2)
        ElseIf cel.Value = Range("H4").Value Then  
            test = exporterValeurs(Range("H18"), cel, ind, ind2)
        ElseIf cel.Value = Range("H5").Value Then    
        ....
grâce à la fonction :

Code :
1
2
3
4
5
6
7
8
9
10
11
Function exporterValeurs(destin As Range, exped As Range, ind As Integer, ind2 As Integer) As Boolean
    With Worksheets(4)
        If ind Mod (3) <> 0 Or ind = 0 Then
            .destin.Offset(ind * 4 + 2 * ind2, 0).Value = .destin.Offset(ind * 4 + 2 * ind2, 0).Value + exped.Offset(0, -1).Value
            exporterValeurs = False
        Else
            .destin.Offset(ind * 4 + 2 * ind / 3, 0).Value = .destin.Offset(ind * 4 + 2 * ind / 3, 0).Value + exped.Offset(0, -1).Value
            exporterValeurs = True
        End If
    End With
End Function
Lors de l'éxécution, Excel affiche l'erreur "Type d'argument ByRef incompatible" au niveau de l'argument "cel" de la fonction "exporterValeurs" de mon code "sympa".

J'ai beau retourner le problème dans tous les sens, je n'arrive pas à saisir pourquoi mes modifications ne sont pas équivalentes au code que j'avais rédigé en premier lieu.

Une explication ?

Merci d'avance pour vos idées
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 10h29   #2
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
Réponse à moi même : la déclaration de cel se faisait via la ligne
il semblerait que le problème soit résolu en la remplaçant par
Code :
1
2
dim cel as range
dim cel2 as range
Pas très logique à mon sens, si quelqu'un pouvait m'expliquer le pourquoi du comment

Une erreur se produit désormais à la ligne
Code :
.destin.Offset(ind * 4 + 2 * ind2, 0).Value = .destin.Offset(ind * 4 + 2 * ind2, 0).Value + exped.Offset(0, -1).Value
et indique "Propriété ou méthode non gérée par cet objet"

Je ne vois qu'offset qui pourrait ne pas fonctionner..?
D'avance, merci encore
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 11h08   #3
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
J'avoue que je n'ai jamais compris pourquoi ça faisait ça et la première fois, avant de comprendre ce qui se passe, ça peut être long. Tu as été rapide, je n'ai pas eu le temps de répondre
Pour ton autre problème, le range que tu passes en paramètre correspond déjà à une worksheet, donc pas la peine de faire un With Worksheets(4)
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/11/2011, 11h16   #4
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
En effet, si je passe Worsheet(4).Range("F18") en argument, plus besoin du With et ça fonctionne nickel.. Merci
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 11h19   #5
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Ca aurait marché même si tu n'avais pas passé Worksheets(4) dans l'argument, mais tu as raison de le faire, sinon le Range("F18") aurait été celui de la feuille active, qu'on ne maîtrise pas toujours.
Désolé si ça te parait évident, mais je voulais être sûr que tu avais bien compris qu'un range appartenait de toute façon à une feuille.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/11/2011, 11h41   #6
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
Effectivement, merci pour la précision
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h17.


 
 
 
 
Partenaires

Hébergement Web