IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

utilisation d'une variable objet Range [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut utilisation d'une variable objet Range
    Bonjour ,

    Je viens une nouvelle fois vers vous afin de trouver une solution a mon probleme....

    J'utilise la fonction "rng.value"(que Mercatog m'a aimablement fait decouvrir hier !!).
    Cette fonction fonctionne (vraisemblablement pour 3 arguments au maximum), le probleme étant que je compte l'utiliser pour plus de 3 arguments (chiffre et mot).

    Selon vous st-ce moi qui est à la masse (probleme dans mon code?) ou bien pourriez-vous le cas echeant m'éguiller sur une fonction qui fonctionne de la meme maniere mais qui peut prendre en compte plus de 3 arguments...

    Je vous joints le bout de code dans lequel je l'utilise:

    la fonction"Test_caleur_zero"fonctionne(3 arguments)
    la fonction "Test_BA" fonctionne (3 arguments)
    la fonction "Test_PA" ne fonctionne pas (4 arguments ou plus probablement par la suite);Le message est "erreur de compilation:Nombre d'arguments incorrect ou affectation de propriete incorrecte"
    Ces 2 fonctions sont des fonctions appelées par la fonction "Befaure_doubleClic".

    code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub Test_valeur_zero(rng As Range)
     
        rng.Value = IIf(rng.Value = 0, 1, 0)
        'code pour colonnes "origine"
     
    End Sub
     
    Sub Test_BA(rng As Range)
     
        rng.Value = IIf(rng.Value = 0, "HS", 0)
     
    End Sub
     
    Sub Test_PA(rng As Range)
     
        rng.Value = IIf(rng.Value = 0, "HS", 0, 1)
     
    End Sub
     
    Sub worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     
        If Not Intersect(Target, Range("E10:E59,H10:H59,K10:K59,N10:N59,Q10:Q59,T10:T59,W10:W59,Z10:Z59,AC10:AC59,AF10:AF59,AI10:AI59,AK10:AK59")) Is Nothing Then 'selection des colonnes activent
            Call Test_valeur_zero(Target) 'appelle la macro Test_valeur_zero
            Cancel = True 'desactive la fonction seletion au double-clic
     
        ElseIf Not Intersect(Target, Range("F10:F59")) Is Nothing Then
            Call Test_BA(Target)
            Cancel = True
     
        ElseIf Not Intersect(Target, Range("I10:I59")) Is Nothing Then
            Call Test_PA(Target)
            Cancel = True
       'obligé de mettre else if not then, au lieu de elsenot car plantage, le dernier else n'est pas obligatoire
        End If
     
    End Sub
    Donc clairement, connaissez-vous un module qui puisse me permetre d'avoir plus de 3 arguments?

    Merci d'avance une fois de plus pour votre aide et le temps passé pour moi.

    Cordialement

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rng.Value = IIf(rng.Value = 0, "HS", 0, 1)
    incorrecte

    par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rng.Value = IIf(rng.Value = 0, "HS", 0)
    équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if rng.value=0 then
    rng.value="HS"
    else
    rng.value=0
    endif
    c'est identique à la fonction SI d'excel
    SI(H1>H2;"Grand";"Petit")

    PS: tu peux faire des iif imbriqués mais à mon sens, perds de son utilité et lisibilité
    tu n'as qu'à faire des if/elseif/endif ou des select case

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Bonjour Mercatog,

    Merci beaucoup pour ton aide (une fois de plus,decidement je t'aurais fais prendre du temps a mon égard même le week-end....).

    Ok pour l'explication (car parès quelque recherche cette fonction et son application me parraissais toujours aussi obscure...), je comprends maintenant son fonctionnement.

    Pour le cas de plus de 3 arguments je pense employer la bonne vieille méthode des if/then/elseif/then/else, car plus "abordable" pour moi...

    Je tests ça de suite et te tiens au courant de la suite.

    Merci encore pour ton aide qui, sans elle: je serais au point de départ (ou quasiment !!).

    n.b:j'espere pouvoir m'en sortir seul maintenant (enfin j'espere !)...

    Juste une question:quel est la particularité de la fonction "rng.value"?
    Pourquoi est-ce la seul maniere de faire (car j'en ai essayé d'autres mais que valable pour une cellule "grossierement parlant sans entrer dans les detail"?

    Merci

    Cordialement

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    quel est la particularité de la fonction "rng.value"?
    rng est une variable et non une fonction
    comme rng est une variable de type range, on peux y travailler comme si on travaille directement dans une cellule: par exemple (on prends rng une seule cellule)
    rng.value : la valleur de la cellule rng
    rng.interior.color : la couleur de fond de la cellule rng
    rng.borders : les bordures de la cellule rng
    .....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test_BA(X As Range)
    X.Value = IIf(X.Value = 0, "HS", 0)
    End Sub
    X est une variable de type range (pour ce cas une cellule)

    donc, je traduis (prenons par exemple X=la cellule A12)

    si dans A12 il y a 0 alors en A12 on mets "HS", sinon on mets 0

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Ok je comprends maintenant pourquoi je ne trouvais pas d'infos sur le net sur ce "rng"....en fait, je peux l'appaler "dudu" si je le souhaite !!!

    Merci beaucoup encore une fois pour tes explications qui "m'ouvre" l'esprit !!!

    Est-ce que j'ose te poser une derniere question.....?
    Allé, je fonce (en esperant que tu ne partes pas en courant !!!

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Test_PA(rng As Range)
     
        If rng.Value = 0 Then
        rng.Value = "HS"
        ElseIf rng.Value = "HS" Then
        rng.Value = "BG"
        ElseIf rng.Value = "BG" Then
        rng.Value = "AS"
        ElseIf rng.Value = "AS" Then
        rng.Value = "SE"
        ElseIf rng.Value = "SE" Then
        rng.Value = "MQT"
        ElseIf rng.Value = "MQT" Then
        rng.Value = "0"
        Else: rng.Value <> "0 + "HS" + "BG" + "AS" + "SE" + "MQT"
        rng.Value = "0"
        End If
    'hs,as,se,mqt,bag
    End Sub

    La ligne de code"Else" et la suivante servent à éviter un plantage....


    Pourquoi je ne peux pas utiliser un opérateur de comparaison comme le "diffèrent de"(<>) et que seul l'opérateur d'affectation fonctionne(je ne crois pas que ce soit dû à la presence ou la non-presence de parenthese ou autre par exemple)?

    Et cette fois je te laisse passer un week-end sans question...promis !

    Merci d'avance encore une fois pour tes précieuses aides et ton temps passé à m'aider au lieu de faire autres chose....

    Cordialement

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    je propose ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test_PA(rng As Range)
    Dim Tbl As Variant
    Dim i As Byte
     
    Tbl = Array(0, "HS", "BG", "AS", "SE", "MQT", 0)
    For i = LBound(Tbl) To UBound(Tbl) - 1
        If rng.Value = Tbl(i) Then
            rng.Value = Tbl(i + 1)
            Exit For
        End If
    Next i
    End Sub
    pour la synthaxe des if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if x=x1 then
    action1
    elseif x=x2 then
    action2
    else
    ActionSinon
    endif

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Re ou bonsoir plutôt,

    En effet, ce code fonctionne (même si je comprends pas forcement les termes employés) et en plus me permet d'utiliser les tableaux (chose toujours un peu difficile pour un néophyte comme moi....).

    Du coup, entre temps, je suis partis sur le fait de "bloquer" toutes les cases (code:"Cancel = True) ce qui a le mérite d'être efficace et ce qui permets de ne jamais avoir une valeur autre que celles déjà présente (donc évite les plantages).

    Donc pour l'instant, je vais rester sur mon code (car il commence à être "costaud" même si le coup des tableaux est très intéressant et risque de m'être très utile d'ici peu...

    Bref, tout d'abord merci une fois de plus, et je te prie de m'excuser d'avoir posé une question à laquelle je pouvais trouver la solution seul .

    Dans tout les cas un grand merci car c'est grâce à tes informations et réflexions que mes lanternes s'éclairent !!!

    Une fois de plus , je te souhaite un bon week-end (ou du moins ce qu'il en reste...), et espère ne pas avoir trop "abuser" de ton temps.

    Cordialement

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 71
    Par défaut
    Désolé pour le doublon.

    Je considère donc ce topic comme résolu.
    Cela évitera de dériver sur d'autres sujet et permets de garder un certains "ordre" dans tout ça.

    A bientôt pour de nouvelles aventures en VBA (la prochaine sera surement la création d'une interface utilisateur...gros boulots en perspective (interface graphique, champs à remplir et retranscris dans tels ou tels tableur...)bref, je sent que ça va être dur!

    Une fois de plus merci et bonne soirée.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'une variable dans une instruction Range("ABC" & variable)
    Par patrick.iribarne dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/04/2015, 12h44
  2. Réponses: 6
    Dernier message: 30/01/2015, 16h22
  3. Utilisation d'une variable dans un Range
    Par GregoryGuillaume dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/08/2013, 15h49
  4. [VB6] Liberer la memoire utilisée par une variable Objet
    Par ProgElecT dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/08/2006, 19h17
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo