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 :

[E-03] - Objet avec with


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    Bonjour,

    J'ai le problème suivant avec l'objet requis par with:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     
            Worksheets("Feuil1").Select
     
            With Worksheets("Feuil2").Range(Cells(1, 1), Cells(5, 1))        
                '...                
            End With
     
    End Sub
    ne marche pas ..
    ça ne passe pas la ligne With Worksheets ...

    Erreur d'exécution '1004':
    Erreur définie par l'application ou par l'objet
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     
            Worksheets("Feuil2").Select
     
            With Worksheets("Feuil2").Range(Cells(1, 1), Cells(5, 1))        
                '...                
            End With
     
    End Sub
    marche.

    J'aimerais ne pas être obligé de faire un .activate ou un .select sur la Feuil2 afin que le With marche (pour la rapidité d'exécution).

    Je n'ai pas fait d'erreur dans l'écriture de l'objet du With, et donc je ne comprends pas pourquoi il ne veut pas le prendre.

    Est-ce intrinsèque au With , c'est-à-dire, faut-il absolument être dans la feuille active pour utiliser un With ? ça me paraît étonnant.

    Merci si vous avez une solution.

    A noter que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     
            Worksheets("Feuil1").Select
     
            With Worksheets("Feuil2").Range("a1:a5")        
                '...                
            End With
     
    End Sub
    marche, mais je n'utilise pas ce système de notation pour les cellules

  2. #2
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonsoir pierre le forum
    pour la rapidite eviter les select les activate proprietes offset ect c est mieux
    cela va toujours dependre de ce que tu veux faire si tu travailles sur beaucoup de cellules il est important d optimiser le code mais seulement 5 cellules ??
    que veut tu faire excatement !!
    un exemple simple copy dans la feuille 2 de a1:a5 les donnees de la feuille 1 de a1:a5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Explicit
    Sub test1()
    Sheets(2).Range("a1:a5").Value = Sheets(1).Range("a1:a5").Value
    End Sub
    salutations

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Pierre845 et le forum
    Je n'ai pas fait d'erreur dans l'écriture de l'objet du With, et donc je ne comprends pas pourquoi il ne veut pas le prendre.
    Proverbe : Excel fait toujours ce que tu lui demandes et quelques (rares) fois ce que tu veux.

    Avec Excel il faut apprendre l'humilité, sinon il te l'apprendra.

    Ton code est erroné, même si jusqu'à maintenant, comme ça marchait, tu le considérais sans erreur.
    Si tu oublies les valeurs par défaut, Excel lui n'est pas autorisé à les oublier

    Sans les with :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets("Feuil1").Select
    Worksheets("Feuil2").Range(Cells(1, 1), Cells(5, 1)).interior.colorindex = 3
    te génèrera la même erreur => le code est faux (CQFD).
    tu as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets("Feuil1").Select
    Worksheets("Feuil2").Range(Activesheet.Cells(1, 1), Activesheet.Cells(5, 1)).interior.colorindex = 3
    Tu peux remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
             Worksheets("Feuil1").Select
             With Worksheets("Feuil2")
                    with .Range(.Cells(1, 1), .Cells(5, 1))
                          ............
                    End with
             End with
    End Sub
    De telles erreurs, tu ne les détectes que... parce que tu les as déjà faites. Si Excel refuse une instruction, c'est qu'elle est fausse (le chef a toujours raison), même si tu ne la vois pas.
    A+

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    oui Gorphael, c'est exactement ça. merci pour ta solution.
    j'ai aussi trouvé mon erreur et finalement fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     
            Worksheets("Feuil1").Select
     
            With Worksheets("Feuil2").Range(Worksheets("Feuil2").Cells(1, 1), Worksheets("Feuil2").Cells(5, 1))        
                '...                
            End With
     
    End Sub
    Ce qui correspond à ce que tu as écrit.
    J'ai juste utilisé un With en moins. Je ne sais pas ce qui est le plus léger.

    Excel ne fait en effet que ce qu'on lui dit de faire

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par Pierre845 Voir le message
    J'ai juste utilisé un With en moins. Je ne sais pas ce qui est le plus léger.

    Excel ne fait en effet que ce qu'on lui dit de faire
    Bonjour Pierre845,

    La chose est exposée dans ton aide en ligne.
    La mienne est en anglais et dit :

    Note Once a With block is entered, object can't be changed. As a result, you can't use a single With statement to affect a number of different objects.

    You can nest With statements by placing one With block within another. However, because members of outer With blocks are masked within the inner With blocks, you must provide a fully qualified object reference in an inner With block to any member of an object in an outer With block.
    J'espère que cette remarque est également présente dans la version française ...

    Tu n'aurais donc rien gagné, y compris avec deux With car le second (inner) devait de toutes manières repréciser l'objet du premier (outer).

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    J'ai retrouvé sur l'aide en ligne en français l'explication que tu as donnée.
    Elle ne m'aurait pas aidé à résoudre mon problème.
    A postériori, j'ai compris, mais si j'avais lu ça avant je crois que j'aurais pas su quoi en faire.

    Et là je viens de tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Worksheets("Feuil1").Select
     
             With Worksheets("Feuil2")
                    With .Range(Cells(1, 1), Cells(5, 1))                
                        '...                      
                    End With
             End With
    ce qui ne marche pas, car il faut les "." :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With .Range(.Cells(1, 1), .Cells(5, 1))
    les "." rappellent l'objet Worksheets("Feuil2") du With d'avant; on gagne en lisibilité mais fallait le savoir !

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 567
    Par défaut
    si c'est une plage que tu utilise plusieurs fois, tu peux aussi utiliser set
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    set maplage = Worksheets("Feuil2").Range(.Cells(1, 1), .Cells(5, 1))
    ......
    ....
    with maplage
    .interior.colorindex = 3
    .....
    end with

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

Discussions similaires

  1. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  2. Réponses: 9
    Dernier message: 22/12/2005, 22h20
  3. Réponses: 3
    Dernier message: 22/12/2005, 00h40
  4. nommer un objet avec une variable
    Par fatcat dans le forum C++
    Réponses: 4
    Dernier message: 11/12/2005, 16h16
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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