Sélection de plage

Résolu
patrice67 -  
Agi67 Messages postés 11 Statut Membre -
Bonjour,

je développe un programme en VBA (Excel 2007) et je suis bloqué sur un problème qui me semblait très simple. j'ai écrit l'instruction suivante:

ActiveSheet.Range(Cells(1, 1), Cells(1, 10)).Select
J'ai l'erreur : Erreur définie par l'application ou par l'objet

j'ai essayé :
ActiveSheet.Range("A1:A10").Select
qui fonctionne correctement.

Pour y remédier je pourrais retraduire mes valeurs numériques en string pour obtenir le même résultat que pour ma deuxième instruction. Mais il n'y a pas de raison que l'utilisation des Cells dans le range ne fonctionne pas.

J'ai déjà utilisé cette instruction pour sélectionner des cellules et il n'y avait pas de problème.
Merci pour celui qui pourrait m'aider à comprendre la raison de cette erreur.

Patrice

8 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    je viens d'essayer chez moi: ca marche....

    au besoin fais voir dans un 1° temps ton code
    0
  2. Agi67 Messages postés 11 Statut Membre
     
    Bonjour michel_m,
    Merci pour ton test qui confirme bien la régularité de mon instruction.
    Je vais recontrôler mon code qui est un peu complexe. Il se trouve dans une procédure événement Change d'une sheet (Worksheet_Change)

    Patrice
    0
  3. Agi67 Messages postés 11 Statut Membre
     
    Bonjour Michel_m,

    J'ai reproduit le problème que je rencontre avec les instructions ci-dessous.

    Je souhaite déclencher l'événement change dans une feuille. Quand l'événement est déclenché par la modification de n'importe quelle cellule. Le code va sélectionner une plage dans une feuille qui s'appelle "BD".

    NE FONCTIONNE PAS
    On nomme une feuille "BD"
    On met le ce code dans la feuille "Feuil1"

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sh_BD As Worksheet: Set sh_BD = Worksheets("BD")
    sh_BD.Select
    sh_BD.Range("A1:A10").Select ' Cette fonction fonctionne
    sh_BD.Range(Cells(1, 1), Cells(1, 10)).Select ' Cette fonction ne fonctionne pas

    Set sh_BD = Nothing
    End Sub

    FONCTIONNE

    On nomme une feuille "BD"
    On met le code dans la feuille "Feuil1"

    Private Sub Worksheet_Change(ByVal Target As Range)
    Selection_Plage
    End Sub

    On insère un module et on met le code suivant
    Function Selection_Plage()
    Dim sh_BD As Worksheet: Set sh_BD = Worksheets("BD")
    sh_BD.Select
    sh_BD.Range("A1:A10").Select ' Fonctionne
    sh_BD.Range(Cells(1, 1), Cells(1, 10)).Select ' Fonctionne
    ActiveSheet.Range(Cells(1, 2), Cells(1000, 2)).Select
    Set sh_BD = Nothing
    End Function

    J'en tire la conclusion que pour sélectionner une plage, on ne peux pas le faire
    avec Range(Cells(x,y),Cells(x,y)).
    Si quelqu'un a une explication technique je serai intéressé.

    Patrice
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    sans module 1
    et avec cells + une variable Test xxx
    Option Explicit
    '-------
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sh_BD As Worksheet, Plage As Range, xxx As Byte
    xxx = Target
    Set sh_BD = Worksheets("BD")
    With sh_BD
    Set Plage = .Range(.Cells(1, 1), .Cells(xxx, 10))
    MsgBox .Cells(xxx, 7)
    End With
    sh_BD.Activate
    End Sub


    au passage: il n'est pas utile de vider par Set sh_BD = Nothing
    0
    1. Agi67 Messages postés 11 Statut Membre
       
      Bonjour michel_m,

      Merci pour ta réponse. J'ai testé et ça fonctionne
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonsoir le fil, bonsoir le forum,

    En règle générale quand on veut sélectionner une plage qui est dans un autre onglet que l'onglet actif il faut :
    • Impérativement sélectionner l'onglet au préalable
    • Toujours indiquer cet onglet dans le code :

    Dim O as Worksheet
    Set O = Sheets("BD")
    O.Select
    O.Range(O.Cells(1, 1), O.Cells(1, 10)).Select

    Va marcher sans faille !...
    0
  7. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour tout le monde.

    En effet,
    sh_BD.Range(Cells(1, 1), Cells(1, 10)).Select
    ne peut pas fonctionner, même en sélectionnant au préalable la feuille par
    sh_BD.Select
    . (Salutations à ThauThème)
    Pourquoi?
    Nous sommes ici dans un événement de feuille. Par conséquent, puisque nous sommes dans un événement de feuille ET donc dans le Module de la feuille (ceci ne se produirait pas si la macro était dans un module standard) l'écriture Range(Cells, Cells) fait que Cells est rattaché à la feuille ou se déroule l'événement. Cela équivaut, si la feuille concernée par cet événement est la feuille Feuil1, à :
    sh_BD.Range(Sheets("Feuil1").Cells(1, 1), Sheets("Feuil1").Cells(1, 10)).Select


    Que faire pour pallier à cela?

    1- Il faut référencer la feuille pour le Range, mais aussi pour les Cells.
    Comment?
    2 possibilités :
    • celle proposée par Michel (salutations au passage) avec un bloc With :

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sh_BD As Worksheet: Set sh_BD = Worksheets("BD")
       With sh_BD
          .Select
          .Range(.Cells(1, 1), .Cells(1, 10)).Select
       End With
    End Sub
    • En référençant l'Objet WorkSheet également pour les Cells :

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sh_BD As Worksheet: Set sh_BD = Worksheets("BD")
    sh_BD.Select
    sh_BD.Range(sh_BD.Cells(1, 1), sh_BD.Cells(1, 10)).Select
    End Sub


    2- On peut également placer la Sub de sélection dans un Module (comme dit précédemment par Agi67):
    dans le module de la feuille :
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sh_BD As Worksheet: Set sh_BD = Worksheets("Feuil2")
    Selectionne sh_BD
    End Sub

    Dans un module standard :
    Sub Selectionne(sh_BD As Worksheet)
    sh_BD.Select
    sh_BD.Range(Cells(1, 1), Cells(1, 10)).Select
    End Sub


    Bonne journée à tous
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Salut Frank

      Quand tu cites ma solution, je référencie la plage ce qui évite le select (activate à la fin est pour le retour sur la feuille de départ pour la demo)

      amicalement, bonne semaine :o)
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Salut,

        Oui, oui. J'ai bien vu. Je te cites, en fait, pour l'utilisation du bloc With.
        En effet, et de toutes façons, les Select sont (bien entendu) toujours à éviter.

        Bonne semaine également.
        0
  8. Agi67 Messages postés 11 Statut Membre
     
    Bonjour,
    Avec vos différentes explications j'ai compris d'où venait le fait de ne pas pouvoir utiliser l'utilisation des Cells d'un autre onglet dans un événements d'une feuille.

    J'avais cependant une question à poser à Michel_m. Dans ton premier post tu me conseilles qu'il n'est pas nécessaire de vider ma variable avec un set sh_BD = Nothing.
    En fait dans les différents programmes que j'ai conçus il m'arrivait souvent d'avoir un message de dépassement de capacité. Depuis que je mets mes variables instanciée à Nothing à la fin des modules je n'ai plus ce problème. Ce n'est peut être pas la raison mais jusqu'à maintenant çà m'a semblé efficace.

    Patrice
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour

      extrait d'une grande discussion (2004) sur ce sujet dans un autre forum où j'avais posé la m^ question que toi:

      .... "Au niveau de la gestion mémoire : quand tu utilises Set, la variable ne contient pas une "copie" de l'objet, mais simplement une référence à celui-ci. Tant que tu n'utilises pas le mot-clé New (affectation d'une nouvelle instance de classe à une variable), la mémoire consommée par cette variable objet restera assez réduite. Si la variable est locale à la procédure (comme l'est apparemment sh_bd dans ta macro), elle est de toute façon détruite à la fin de cette procédure et la mémoire qui lui était allouée est automatiquement libérée. La libération explicite de cette mémoire, par Set Mavariable = Nothing, s'impose surtout dans le cadre de grosses macros avec des variables objets de niveau module et/ou qui réfèrent à des instances de classes."....

      mais ca ne mange pas de pain de laisser set machin=nothing
      0
  9. Agi67 Messages postés 11 Statut Membre
     
    Bonjour michel_m

    Merci pour ta réponse technique et le temps que tu m'as accordé.

    Patrice
    0