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 :

méthode select class range échoué


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 62
    Points : 47
    Points
    47
    Par défaut méthode select class range échoué
    Bonjour

    Je travaille sur deux dossiers excel. Le premier comporte toutes les macros nécessaires pour traiter les données qui se trouvent sur le second.
    j'enchaine les procédures, les unes derrières les autres.

    L'une d'elle exécute ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        'on copie toutes les données de dépenses en valeurs, pour éviter les erreurs
        wFD.Activate  ' active la feuille de données
        wFD.Range(wFD.Cells(2, a), wFD.Cells(NbrLigDon, b + 1)).Select ' sélection de la plage adéquate
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Je ne sais pas pourquoi, mais je suis obligé de spécifier wFD.cells, c'est à dire la feuille de données sur laquelle ce trouve la cellule, malgré le fait d'avoir mis wFD.range.

    Ca marche.

    la procédure suivante fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    'copie la formule jusqu'à la dernière ligne. (La formule se trouve en ligne 2)
        wFD.Range(wFD.Cells(NbrLigDon, a)).Select ' ça plante ici
        Range(Selection, Selection.End(xlUp)).Select
        Selection.FillDown
    Et ça ne marche pas. J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wFD.Range(wFD.Cells(2, a), wFD.Cells(NbrLigDon, a)).Select
    Même erreur : la méthode select de la class Range a échoué.
    Je ne sais pas si cela a une importance, mais excel garde en pointillé clignotant la sélection de la procédure précédente.


    Si quelqu'un(e) peut m'éclairer, je l'en remercie.

    Patrice

  2. #2
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 62
    Points : 47
    Points
    47
    Par défaut Ben tiens, là ça marche...
    ... si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wFD.Cells(NbrLigDon, a).Select
    Je ne comprends pas du tout pourquoi.

    Patrice

  3. #3
    Expert éminent sénior 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
    Points : 31 877
    Points
    31 877
    Par défaut
    F1 sur Range, tu auras tes réponses

    Sinon, tes Select, selection sont inutiles (si j'ai à les prohiber, je le ferai avec grand plaisir)

    Regardes l'exemple
    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
    '1.  Ton code sans les Select et sans activer wFD
    wFD.Range(wFD.Cells(2, a), wFD.Cells(NbrLigDon, b + 1)).Copy
    wFD.Range(wFD.Cells(2, a), wFD.Cells(NbrLigDon, b + 1)).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
     
    '2.  Ou bien ceci
    With wFD.Range(wFD.Cells(2, a), wFD.Cells(NbrLigDon, b + 1))
        .Copy
        .PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    End With
     
    '3.  Qui est en fin de compte équivalent à ceci
    With wFD.Range(wFD.Cells(2, a), wFD.Cells(NbrLigDon, b + 1))
        .Value = .Value
    End With
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  4. #4
    Invité
    Invité(e)
    Par défaut Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     wFD.Range(wFD.Cells(NbrLigDon, a)).Select ' ça plante ici
    wFD.Cells(NbrLigDon, a).Select ' ça c'est la même chose que  sauf que
     wFD.Range(cell1,cell2).Select ' ça attend une plage
    de plus tu sélectionnes une plage puis tu traite la sélection pourquoi ne pas traiter directement la Plage?
    Code Exemple : Sélectionner tout - Visualiser dans une fenêtre à part
     wFD.Range(wFD.Cells(2, a), wFD.Cells(NbrLigDon, b + 1)).Copy

  5. #5
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 62
    Points : 47
    Points
    47
    Par défaut Range
    Bon et bien merci pour vos réponses.

    C'est tellement plus simple et plus clair.
    Merci pour ces trois façons de coder. Ca a le grand mérite d'être pédagogique.

    Je croyais que la sélection était un passage obligé.

    Merci pour le F1 direct sur le mot (range), je ne connaissais pas le truc.

  6. #6
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 62
    Points : 47
    Points
    47
    Par défaut question supplémentaire
    Question pour mercatog

    Pourquoi prohibiriez-vous les select ?

  7. #7
    Expert éminent sénior 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
    Points : 31 877
    Points
    31 877
    Par défaut
    Parce qu'elles sont inutiles (sauf si on veux vraiment sélectionner une cellule)
    Parce qu'elles sont source d'erreur (quand la cellule n'est pas sur la page active)
    Parce qu'elles sont la cause de la lenteur des codes
    Parce que si les code est dans le module d'une feuille, Elles engendrent systématiquement des erreur quand elles se réfèrent à d'autres feuilles

    J'en oubli certainement

    Aies l'habitude de suivre la logique expliquée ci-après:
    Quand on fait un adressage complet (et selon les cas) on s'en fiche du classeur, de la feuille et des cellules actifs

    Quand on est en présence de plusieurs classeurs ouverts dans la même instance Excel, pour effacer la plage A1:B5 de la feuille nommée Feuil4 du classeur contenant la macro, il suffit de cette ligne sans se soucier de quelle classeur, feuille ou cellules actifs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thisworkbook.worksheets("Feuil4").range("A1:B5").clearcontents
    Quand on est en présence d'un seul classeur, il suffit de cette ligne sans se soucier de quelle feuille ou cellules actives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("Feuil4").range("A1:B5").clearcontents
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  8. #8
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    Sur le fond, ok, je pense comprendre, mais je ne suis pas sûr d'avoir tout compris de la pratique.

    Imaginons que j'ai trois classeurs ouverts : ClaA, ClaB, ClaC
    Dans chaque classeur, une feuille, dont le nom est identique : Feuil1

    Je veux effacer les données la plage A1:B5 de Feuil1, dans les 3 classeurs

    Pour reprendre votre code, je ferai grosso modo ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a = array(ClaA, ClaB,ClaC) ' je ne pense pas que c'est ainsi qu'il faut déclarer le tableau, mais c'est l'idée qui compte.
    for a = 1 to ubount(a)
    Thisworkbook.worksheets("Feuil1").range("A1:B5").clearcontents
    next
    ou ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    workbooks("ClaA").worksheets("Feuil1").range("A1:B5").clearcontents  ' est-ce cela que vous appelez un 'adressage complet' ?
    workbooks("ClaB").worksheets("Feuil1").range("A1:B5").clearcontents
    workbooks("ClaC").worksheets("Feuil1").range("A1:B5").clearcontents
    un Thisworkbooks.etc travaille sur le classeur activé non ? Je ne comprends pas très bien avec ce code, comment on peut passer d'un classeur à l'autre.

  9. #9
    Expert éminent sénior 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
    Points : 31 877
    Points
    31 877
    Par défaut
    Le 2ème code est bon (dans la logique)

    ThisWorkbook est LE classeur contenant le code.

    Tiens, tiens, tu as oublié déjà F1

    Sélectionne Thisworkbook et fais F1
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  10. #10
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    F1 bien sûr.

    Mémoire de poisson...

    Merci pour les réponses. Je comprends mieux maintenant.

    Je vais prendre cette habitude de l'adressage complet. Ca me semble effectivement plus sécure.

    Bonne fin de journée

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/07/2014, 16h40
  2. [XL-2010] Méthode Select de la classe Range échoué
    Par Identifiant_Anonyme dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/05/2014, 10h06
  3. Problème Select (Methode Select de la classe Range à échoué)
    Par linkcr15 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 05/06/2012, 09h43
  4. Réponses: 4
    Dernier message: 26/08/2010, 13h40
  5. [VBA-E] Erreur methode select classe range
    Par kdestine dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 17/09/2007, 11h05

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