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 :

"With objet déclaration" comment faire pour que la déclaration soit égale à l'objet EXACTEMENT ? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 18
    Points : 20
    Points
    20
    Par défaut "With objet déclaration" comment faire pour que la déclaration soit égale à l'objet EXACTEMENT ?
    Bonjour,
    Tout est dans le titre (un peu long )

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With maFeuille.Cells(ligne, colonne)
         maFeuille.Range(maFeuille.Cells(ligne,colonne), .offset(0,3)).Insert shift:=xldown
    End With
    C'est un simple exemple, mais en gros la question c'est comment éviter de réécrire maFeuille.Cells(ligne,colonne), car on ne peut pas rien écrire.
    On peut certes ici mettre juste .Offset(0, 0) et basta, mais j'aimerais quand même savoir (de manière générale) s'il y a un mot, genre Me (j'ai essayé ça marche pas ^^) pour exprimer ça.

    Je sais pas si j'explique bien

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    Si tu aimes te faire mal, tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With maFeuille.Cells(ligne, colonne)
           maFeuille.Range(.Address, .Offset(0, 3)).Insert shift:=xlDown
        End With
    mais, pour ma part, j'écrirais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        maFeuille.Cells(ligne, colonne).Resize(1, 4).Insert shift:=xlDown
    ou, si nécéssité du With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With maFeuille.Cells(ligne, colonne)
           .Resize(1, 4).Insert shift:=xlDown
        End With
    Cordialement.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    certes, en effet, mais de manière générale existe-t-il quelque chose pour reprendre l'objet du with sans rien mettre derrière mais sans répéter l'objet en entier non plus (with étant nécessaire dans mon hypothèse, oui)

    Par exemple, là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    With newTextBox.TextFrame2
            .TextRange.Font.Name = "Arial"
            .TextRange = "Blabla."
        End With
    J'aurais aimé écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    With newTextBox.TextFrame2.TextRange
            .Font.Name = "Arial"
            ?XX? = "Blabla."
        End With
    Y a-t-il qqchose qui existe pour le ?XX?

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Y a-t-il qqchose qui existe pour le ?XX?
    La seule chose qui peut aller là, c'est le nom d'une méthode ou d'une propriété de l'objet déclaré dans le with.

    Le bloc with ne sert qu'à raccourcir les affectations des propriétés ou l'appel d'une méthode.

    donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with textbox1
         .text = "Oscar"
         .backcolor = simonac
         .enable = true
    end with
    ne fait que remplacer:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    textbox1.text = "Oscar"
    textbox1.backcolor = simonac
    textbox1.enable = true
    et rien d'autre. C'est uniquement une structure cosmétique qui évite une fois de temps en temps un peu d'écriture.

    Même que dans VB2012 (probablement pas dans Excel), l'IntelliSense, va probablement t'afficher Textbox1, juste en écrivant le t. Cela fait que rendu-là l'intérêt d'utiliser un bloc With pour épargner de la frappe est presque nul. Il ne reste que la beauté de la présentation et une légère amélioration de la lisibilité pour justifier un bloc with.

    Donc, le bloc with devrait être très bas dans tes priorités.

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    C'est uniquement une structure cosmétique qui évite une fois de temps en temps un peu d'écriture.
    Bonjour,

    Je ne suis pas d'accord.
    L'utilisation du With permet au compilateur de se référer à un objet sans devoir recalculer sa définition.
    Dans beaucoup de cas, ça permet un gain de temps appréciable sur de grosses boucles.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Points : 5 901
    Points
    5 901
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    Dans beaucoup de cas, ça permet un gain de temps appréciable sur de grosses boucles.
    Si tu avais un exemple concret j'aimerais bien faire le test.
    Pour ma part, je n'utilise jamais le With... et je m'en porte très bien.
    Par contre, si vraiment ça peut accélérer certains processus, je suis prêt à revoir ma façon de faire, malgré les vieilles habitudes ...

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 949
    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 : 12 949
    Points : 28 950
    Points
    28 950
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Qu'entends-tu par
    bon apparemment il n'y a rien qui peut reprendre l'objet seul sans ses propriétés...
    Ne veux-tu pas simplement parler de variable objet ?
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim rng As Range
     Set rng = ThisWorkbook.Worksheets("Feuil1").Range("A1")
     rng.Value = "Toto"

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par pikron Voir le message
    bon apparemment il n'y a rien qui peut reprendre l'objet seul sans ses propriétés...
    Mais justement, tu ne peux pas transformer une propriété, ni une méthode en objet. Le mieux que tu puisses espérer, c'est ce que Philippe a écrit plus haut. Mais, tu ne peux pas séparer un objet de ses propriétés, ni de ses méthodes. Sinon, ce n'est pas (plus) un objet.

    Quand on utilise un bloc With, c'est pour dire que toutes les propriétés et méthodes du bloc, se rapportent au même objet. Et dans un bloc with en VBA, tu dois avoir obligatoirement des propriétés et des méthodes lées à l'objet indiqué.

    Je ne me souviens plus si c'est le cas pour VBA, mais VB.net permet d'imbriquer des blocs with.

    Là je ne suis pas trop sur de mes propriétés/méthodes, mais c'est juste pour l'exemple et en supposant que VBA le permette.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with textbox1
        'pour le textbox lui-même
        .with = 400
        .height
         'pour le texte du textbox et pas un texte à part
         with .text
            .font = "Arial"
         end with
    end with

  9. #9
    Invité
    Invité(e)
    Par défaut
    Hello,

    Pour moi, à mon avis, gFZT82 et Philippe Tulliez ont bien répondu à la question initial avec le .address et le .Value je pense.
    Dans un With, en principe, il ne faut pas donner sa propriété, sinon, je pense que le With ne sert à rien.

    Par Exemple:
    With Range("A1").Value ne sert à rien puisque .Value est la (une des) propriété(s) de l'objet Range, alors qu'en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Range("A1")
       .Value = 1
       .Formula = "= SIN(1)"
    End With

    Le With a du sens, car il ne donne pas la propriété souhaitée dans le With, mais entre le With et le End With.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Pas essayé, mais devrai Marcher
    With Range("A1")
       .Value = 1 '.Value : propriété par défaut du .Range, mais pour le With, il faut le mettre si on se réfère au With
       .formula = "= SIN(1)"
    End With

    En gros, avec un With, il faut laisser de la place pour au moins 1 propriété minimum, sinon, le With est inutile, enfin, c'est comme ça que je vois les choses pour les With. L'avantage est que la propriété peut aller des 2 cotés du signe égal, exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Pas essayé, mais devrai Marcher
    With Range("A1")
       .Value = 1*.Value
       Range("A2").formula = .Formula ' ici, le .formula n'est pas celui du Range("A2") mais celui du Range provenant du With (A1 donc)
    End With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Essayé et marche
    With Range("I3")
       .Formula = "= SIN(2)"
       Range("I4").Formula = .Formula & "*2" 'Le .Formula est celui du With et rends donc "= SIN(2)"
       Range("I5").Formula = "= " & .Address & "* 2" 'Le .Address est celui du With et rends donc $I$3, le With sert à ça, à ne pas répéter Range("I3")
    End With
    Oups, je me sui trompé pour la réponse de Philippe Tulliez, mais on peut tout aussi faire (bien qu'inutile avec une seule propriété):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Dim rng As Range
     Set rng = ThisWorkbook.Worksheets("Feuil1").Range("A1")
     With rng
       .Value = "Toto"
     End With
    Dernière modification par Invité ; 16/08/2013 à 00h26.

  10. #10
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour pikron,
    Bonjour le forum,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With newTextBox.TextFrame2.TextRange
             .Font.Name = "Arial"
             ?XX? = "Blabla."
    End With
    Y a-t-il qqchose qui existe pour le ?XX?
    Voila une bonne question !
    Si rien n’existe, c’est sûrement que la propriété est une propriété par défaut de l'objet. Reste à trouver quelle est cette propriété.
    Je te propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            With newTextBox.TextFrame2.TextRange
                .Font.Name = "Arial"
                .Text = "Blabla..."
            End With
    Cordialement.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour,

    Là je ne suis pas trop sur de mes propriétés/méthodes, mais c'est juste pour l'exemple et en supposant que VBA le permette.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with textbox1
        'pour le textbox lui-même
        .with = 400
        .height
         'pour le texte du textbox et pas un texte à part
         with .text
            .font = "Arial"
         end with
    end with
    C'est finalement la réponse que je cherchais, il faut effectivement faire 2 with imbriqués.
    Dans mon premier exemple, on est donc obligé de répéter l'objet en entier (ou trouver une astuce comme le .resize, de gFZT82), car tout est dans la même ligne, mais dans mon deuxième exemple ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With newTextBox.TextFrame2
            .TextRange = "Blabla."
            With .TextRange        
                  .Font.Name = "Arial"
            End With
    End With
    Merci pour toutes vos réponses, j'ai un peu mieux compris maintenant

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 10/02/2013, 16h18
  2. Comment faire pour que le focus soit à la fin d'un texte dans une textbox ?
    Par gryffondor8392 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 24/02/2011, 21h07
  3. [XML] Fichier XML. Comment faire pour que chaque balise soit différente ?
    Par Jusd'abricot dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 12/11/2009, 16h42
  4. Réponses: 5
    Dernier message: 08/12/2006, 18h26
  5. CSS: comment faire pour que mes coins soit arrondi
    Par pierrot10 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 16/02/2006, 12h08

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