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 :

pointer l'objet défini par le bloc with [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 31
    Par défaut pointer l'objet défini par le bloc with
    Bonjour à tous,

    j'ai écrit ce code qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub tata (ligne As Integer, colonne As Integer)
     
        With Feuil1.Cells(ligne, colonne)
            .Value = "toto"
            .Offset(0, 1) = "titi"
        End With
     
            ecritureRaccourci Feuil1.Cells(ligne, colonne)
     
    End Sub
    en sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Sub ecritureRaccourci(ByRef Target As Range)
    Ma demande est la suivante:
    j'aimerais ne pas avoir à réécrire Feuil1.Cells(ligne,colonne) lors de l'appel de ecritureRaccourci

    en général je triche en utilisant .value quand j'ai besoin de la valeur des cellules définies par le bloc with.

    Mon code fonctionne avec le premier code présenté, j'aimerais juste améliorer mon écriture.

    Merci d'avance!

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il suffirait de déclarer une variable objet de type Range et d'utiliser celle-ci

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub tata(ligne As Integer, colonne As Integer)
      Dim rng As Range
      Set rng = Feuil1.Cells(ligne, colonne)
      With rng
          .Value = "toto"
          .Offset(0, 1) = "titi"
      End With
      ecritureRaccourci rng
      Set rng = Nothing
    End Sub
    Petite remarque : Le nombre de lignes d'une feuille dépassant 32767, il serait préférable de travailler avec une variable ligne de type long et pourquoi ne pas utiliser déjà un argument de type Range en lieu et place de ligne et colonne. Vous pourriez ainsi déclarer d'emblée la feuille
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 524
    Par défaut
    Hello,

    Sauf erreur de ma part, tu peux également imbriquer les blocs With:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub tata (ligne As Integer, colonne As Integer)
        With Feuil1
            With .Cells(ligne, colonne)
                .Value = "toto"
                .Offset(0, 1) = "titi"
            End With
            ecritureRaccourci .Cells(ligne, colonne)
        End With
    End Sub

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 31
    Par défaut
    Bonjour Philippe et deedolith, merci pour vos réponses.

    Philippe: ligne ne dépassera jamais la valeur 50, c'est pourquoi je n'ai pas eu de problèmes en utilisant un entier, mais je note ta remarque pour mes prochains codes.
    j'avais pensé à transmettre un Range en argument de ma procédure, mais c'était plus pratique de garder ligne et colonne pour le reste du code. Je n'avais pas pensé à déclarer le Range directement dans la procédure. Je vais faire comme ça.


    deedolith: merci pour cette solution, mais ce n'était pas l'optimisation que je cherchais.


    J'imagine que le coeur de ma question n'est pas possible en vba. Merci à tous les deux!

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 524
    Par défaut
    Citation Envoyé par Cap'taineSamSam Voir le message
    J'imagine que le coeur de ma question n'est pas possible en vba. Merci à tous les deux!
    Effectivement, le bloc With étant un raccourcit anonyme vers une référence, il n'est pas possible de récupérer cette dernière a l'intérieur du bloc.

  6. #6
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 204
    Par défaut
    re
    Bonjour
    Effectivement, le bloc With étant un raccourcit anonyme vers une référence, il n'est pas possible de récupérer cette dernière a l'intérieur du bloc
    qu'est que j'entends là ????

    .cells(x,y) étant l'object du with est un range par défaut dans vba

    et l'object .cells est un membre de range (entre autre)et "aussi bizarrement que cela puisse parraitre .cells renvoie un range

    pour la simple et bonne raison que .cells est une collection

    alors comment simplifier ton appel à ecritureRaccourci

    et bien c'est simple

    l'appel a ecritureRaccourci tu le met dans le bloc with

    et tu envoie la collection tout court elle renverra une seule cellule bien entendu

    démonstration de mes dires
    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
     
    Sub tata(ligne As Integer, colonne As Integer)
        With Feuil1
     
            MsgBox TypeName(.Cells(ligne, colonne)) 'juste pour vérifier mes dires
     
            With .Cells(ligne, colonne)
                .Value = "toto"
                .Offset(0, 1) = "titi"
     
                ecritureRaccourci .Cells 'l'appel dans le bloc with
            End With
        End With
    End Sub
     
    Sub ecritureRaccourci(rng) 'ici même si l'argument n'est pas typé   le type est bien un range
        MsgBox "type :" & TypeName(rng) & " : " & rng.Address
    End Sub
     
    Sub test()
        tata 8, 5
    End Sub

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 579
    Par défaut
    Bonjour,
    ce que je te dis moi c'est que pour certaines classes le membre parent ou enfant direct peut renvoyer l'object lui même
    voir dans ce cas présent être interprété par vba sous une autre classe
    Faut l'objet range ne connait pas la notion de Me qui permettrait de ce passer en tant qu'objet à une variable ou en paramètres à un méthode.

    Il ne voit que ses enfants ou ses parents.

    Dans ce qui à été abordé dans le with par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with seets("Feuille1"). range("A1:A20")
    On à accès aux enfants . celles ou aux parents sheets("Feuille1") mais pas à sheets("Feuille1"). range("A1:A20")

    On pourra tenter de démontrer le contraire en modifiant telle ou telle valeur il n'en reste pas moins que une variable virtuelle qui fait référence à un objet fisique ce comporte comme un objet fisique et non virtuelle.

    Un range c'est comme un verre d'eau il est fisiquemement vide ou plein.

    Edite :
    Je t'invite à faire la comparaison avec Byval Target as range.

  8. #8
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 204
    Par défaut re
    re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
        With Feuil1.Cells(8, 5)
            fonction .Cells ' ou .Cells(1)
        End With
    End Sub
     
    Sub fonction(ByVal target As Range)
        MsgBox target.Address
    End Sub
    Nom : Capture.JPG
Affichages : 71
Taille : 62,1 Ko

    et même sans typer l'argument target ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
        With Feuil1.Cells(8, 5)
            fonction .Cells(1)
        End With
    End Sub
     
    Sub fonction(target)
        MsgBox target.Address
    End Sub
    si j'obtien( l'address c'est que target est bien un range
    et E8 c'est bien la cells(8,5)

  9. #9
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 579
    Par défaut
    Ça confirme ce que j' ai dit .Celles est bien un enfant de With Feuil1.Cells(8, 5) et se positionne fisiquemement, car un range ne peut en aucun cas être virtuel, a l'adresse $E$8 c'est bien ce que j'ai affirmé ce n'est pas l'objet Feuil1.Cells(8, 5) mais son enfant .Cells

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
        With Feuil1.Cells(8, 5)
            fonction .Cells ' ou .Cells(1).cells.cells' enfant de With Feuil1.Cells(8, 5)
        End With
    End Sub
    Tu l'a très clairement écrits dans ton code [.Cells]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    With Feuil1.Cells(8, 5)
    .address 'aurait fait référence direct à With Feuil1.Cells(8, 5) mais en tant qu'enfant
    Fais la même chose avec un module de classe et tu verras que tu n'as accès qu'à ses enfants ou aux parents si tu les gère dans la classe !

    Tu confonds emplacement fisique de l' objet et sa déclinaison de la source de l'objet.

    Tu n'as en occun ca accès à la source de l'objet Feuil1.Cells(8, 5) tu ne peux que décliner ses enfants .Cells

    . parents aussi bizarre que ça paresse est un enfant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
    Dim colec As New Collection
    colec.Add colec
    testcolec colec(1)
    End Sub
    Sub testcolec(colec As Object)
     
     
    End Sub
    ou est la vérité chaque enfant {item} est l'objet de lui même!

    Nom : Sans titre.png
Affichages : 73
Taille : 32,6 Ko

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/10/2007, 03h26
  2. Variable objet ou variable de bloc With non définie
    Par sl1980 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2007, 19h15
  3. Réponses: 11
    Dernier message: 12/06/2007, 09h26
  4. [VBA-E]erreur 91: variable objet ou variable de bloc With...
    Par cdk dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/03/2006, 14h19
  5. Réponses: 13
    Dernier message: 12/09/2005, 09h09

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