Sélection de plage

Résolu/Fermé
patrice67 - 14 août 2015 à 06:55
Agi67 Messages postés 11 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 11 septembre 2021 - 19 août 2015 à 05:17
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

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 306
14 août 2015 à 07:17
bonjour

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

au besoin fais voir dans un 1° temps ton code
0
Agi67 Messages postés 11 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 11 septembre 2021
14 août 2015 à 20:45
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
Agi67 Messages postés 11 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 11 septembre 2021
15 août 2015 à 19:43
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 306
16 août 2015 à 08:20
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
Agi67 Messages postés 11 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 11 septembre 2021
16 août 2015 à 20:09
Bonjour michel_m,

Merci pour ta réponse. J'ai testé et ça fonctionne
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
16 août 2015 à 22:01
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
17 août 2015 à 07:44
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 306
17 août 2015 à 08:30
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750 > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
17 août 2015 à 08:50
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
Agi67 Messages postés 11 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 11 septembre 2021
18 août 2015 à 05:41
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 306
Modifié par michel_m le 18/08/2015 à 08:54
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
Agi67 Messages postés 11 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 11 septembre 2021
19 août 2015 à 05:17
Bonjour michel_m

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

Patrice
0