Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 VBA: Selection ou ActiveCell d'une feuille qui n'est pas active

Guy_M

XLDnaute Occasionnel
Bonjour,

Je souhaite récupérer les cellules de la sélection ou à défaut la cellule active d'une autre feuille que la feuille active.

A force de fouiller sur le web, j'ai compris que "Selection" et "ActiveCell" s'applique à la feuille active et qu'il semble que ce ne soit pas trivial. En désespoir de cause, j'ai écrit cette fonction (testée avec VBA Excel 2010).

VB:
'Retourne les cellules sélectionnées de la feuille passée en paramètre ou la cellule "active" si la sélection n'est pas un range
Function CellulesSelectionnees(Feuille As Worksheet) As Range
Dim FeuilleCourante As Worksheet
Dim EtatMajAffichage As Boolean

'Conservation de l'état courant
Set FeuilleCourante = ActiveSheet
EtatMajAffichage = Application.ScreenUpdating

'Récupération de la cellule
Application.ScreenUpdating = False
Feuille.Activate
'On ne retourne la sélection que si c'est un range
If TypeName(Selection) = "Range" Then
    Set CellulesSelectionnees = Selection
Else
    Set CellulesSelectionnees = ActiveCell 'La cellule active est toujours un range
End If

'Restitution de l'état courant
FeuilleCourante.Activate
Application.ScreenUpdating = EtatMajAffichage

End Function

Avant de la mettre en production, n'existe-t-il réellement rien de plus simple pour faire ce boulot ? C'est tellement incroyable que cela n'existe pas en natif.

Par avance, je vous remercie de vos réponses.

Et, si elles sont toutes négatives, j'espère que ces quelques lignes de VBA seront utiles à quelqu'un.

A bientôt
GM
 

Staple1600

XLDnaute Barbatruc
Re

Voir ce petit test (il faut au moins deux feuilles dans le classeur de test)
VB:
Sub test()
Dim Feuille As Worksheet
Set Feuille = Sheets(2)
With Feuille.Range("A1600")
MsgBox .Parent.Name & Chr(13) & .Address(0, 0), vbInformation, "Test 1"
End With
Sheets(1).Activate
Range("A1").Select
With Selection
MsgBox .Parent.Name & Chr(13) & .Address(0, 0), vbInformation, "Test 2"
End With
End Sub
 

eriiic

XLDnaute Barbatruc
Bonjour,

J'ai l'impression que tu fais un peu de confusion et que tu ne veux que Selection.
ActiveCell c'est la cellule active, qui fait partie de Selection.
Si selection fait 1 cellule alors Selection et ActiveCell sont identiques.

Quoiqu'il en soit j'ai préparé pour les deux, et c'est l'occasion d'utiliser une méthode découverte récemment.
Dans ThisWorkbook :
VB:
Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, ByVal Target As Range)
    ' Add metadata to worksheet.
    Dim cp As Object
    For Each cp In sh.CustomProperties
        If cp.Name("Selection") Or cp.Name("ActiveCell") Then cp.Delete
    Next cp
    sh.CustomProperties.Add Name:="Selection", Value:=Selection.Address
    sh.CustomProperties.Add Name:="ActiveCell", Value:=ActiveCell.Address
End Sub
On mémorise à chaque nouvelle sélection.

Où tu veux :
Code:
    With Sheets("Feuil1").CustomProperties ' la feuille qui t'intéresse
        If .Count >= 2 Then
        Debug.Print .Item(1) 'Selection
        Debug.Print .Item(2) ' ActiveCell
        End If
    End With

J'ai l'impression que cet objet CustomPropertie a été implanté avec les pieds.
Pas moyen de travailler avec le nom donné (?!?)
Mais comme ça évite de créer des noms liés à un nombre inconnu de feuilles, ça reste pratique.
eric
 

Guy_M

XLDnaute Occasionnel
Bonjour @eriiiic,

Je sais que ActiveCell est inclus dans Selection, cette apparente confusion m’arrange, cela me permet de ne faire qu'une fonction. Dans l'idéal, il faudrait 2 fonctions ou que je retourne un tableau de range (je vais y réfléchir).

J'ai vu des astuces avec Workbook_SheetSelectionChange mais cela oblige à ce que le classeur contiennent une macro et la macro que j'exécute est à l'extérieur du classeur.

Merci pour cette proposition.

A bientôt
GM
 

Discussions similaires

Réponses
2
Affichages
175
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…