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

Microsoft 365 Trouver et attribuer une plage de cellule en fonction de la cellule active

Jojo973

XLDnaute Occasionnel
Supporter XLD
Bonjour,
J'ai un nombre de plage de cellules dans lesquelles l'utilisateur peut cliquer.

Je déclare les plages à l'initialisation de la feuille
VB:
'....En public... car je dois utiliser cette variable ailleurs
Public plage_trouve As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim plage1, plage2, plage3, plage4, plage5, plage6, plage_var As Range
Dim i As Integer

'......................

Set plage1 = Range("D5:D18")

Set plage2 = Range("F5:F18")

Set plage3 = Range("H5:H18")

Set plage4 = Range("D22:D35")

Set plage5 = Range("F22:F35")

Set plage6 = Range("F22:F35")

'---détection de la plage----

i = 1
Set plage_var = "plage" & i

Do While i <= 6

If Not Intersect(ActiveCell, plage_var)) Is Nothing Then

Set plage_trouve = plage_var

Exit Sub

Else

i = i + 1

End If

Loop

End Sub
Le code plante au niveau "If Not Intersect(ActiveCell, plage_var)) Is Nothing Then" , je suppose que ce ne sont pas les bonnes instructions. De l'aide serait la bienvenue. Merci par avance.
 

Pièces jointes

  • exemple.xlsm
    9.2 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Bonsoir.
Cette technique n'est utilisable que pour des clés d'une collection. Là il faut un tableau dynamique.
VB:
Dim TRNg(1 to 6) As Range
''
Set TRng(1) = Range(D2:D18)
' etc.
For i = 1 To 6
   If Not Intersect(TRng(i), Target) Is Nothing Then Exit For
   Next i
If i > 6 then Exit Sub ' (non trouvé)
 

fanch55

XLDnaute Barbatruc
Comme @Dranreb
VB:
'....En public... car je dois utiliser cette variable ailleurs
Public plage_trouve As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim plage()
    plage = Array([D5:D18], [F5:F18], [H5:H18], [D22:D35], [F22:F35], [H22:H35])
    For i = 0 To UBound(plage)
        If Not Intersect(Target, plage(i)) Is Nothing Then
            Set plage_trouve = plage(i)
            MsgBox Target & " trouvé dans " & plage_trouve.Address
            Exit For
        End If
    Next
End Sub
 

Jojo973

XLDnaute Occasionnel
Supporter XLD
Super cela marche nickel et la dernière solution de @Dranreb me permets de saisir toutes les plages aisément.

La variable plage_trouve est en public et je n'arrive pas à la passer à un module où se trouve une macro de tri.
Je dois trier chaque plage saisie
VB:
ActiveWorkbook.Worksheets("Mafeuille").Sort.SortFields.Clear
                    ActiveWorkbook.Worksheets("Mafeuille").Sort.SortFields.Add2 Key:= _
                                                                            Range (?????), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
                                                                            :=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("Mafeuille").Sort
        .SetRange plage_trouve
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

  1. Le premier problème vient du fait que je dois juste sélectionner la colonne de tri, qui correspond à la colonne à gauche de la plage sélectionnée
  2. Le deuxième est que je dois appliquer le tri sur la plage définie par plage_trouve
Merci pour les conseils futurs
 

Jojo973

XLDnaute Occasionnel
Supporter XLD
J'ai trouvé la solution qui a consisté à convertir la plage de données en variables utilisables dans
.Range (Cells(a, b), Cells(c, d)) et qui fonctionne avec le tri.
Pour obtenir a, b, c, d, j'ai transformé la plage de données identifiée précédemment et que j'ai écrit en dur dans une cellule.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…