Sélection de plage
Résolu
patrice67
-
Agi67 Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Agi67 Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Sélection de plage
- Frédéric cherche à faire le buzz sur les réseaux sociaux. il a ajouté une image d’ours polaire sur une image de plage. retrouvez l'image originale de la plage. que cache l'ours polaire ? - Forum Graphisme
- Image de manchots sur une image de plage - Forum Musique / Radio / Clip
- Vba excel sélectionner une plage de cellules variable ✓ - Forum VB / VBA
- Image de plage pix sans manchot - Forum Graphisme
- L'indice n'appartient pas à la sélection vba ✓ - Forum Programmation
8 réponses
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
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
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
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
Bonjour
sans module 1
et avec cells + une variable Test xxx
au passage: il n'est pas utile de vider par Set sh_BD = Nothing
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
Va marcher sans faille !...
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 !...
Bonjour tout le monde.
En effet,
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, à :
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 :
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 :
Dans un module standard :
Bonne journée à tous
En effet,
sh_BD.Range(Cells(1, 1), Cells(1, 10)).Selectne 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
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
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
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
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