Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Contrôle des touches de navigation dans un contrôle spreadsheet avec filtre automatique

3 réponses
Avatar
Pierre Archambault
Bonjour à tous,

En effet, la description de mon problème est plutôt pointue...

J'utilise un contrôle Spreadsheet dans un userform. Les utilisateurs peuvent
cliquer sur une ligne en particulier ce qui sélectionne cette ligne.
Ensuite, ils peuvent avec les touches fléchées, déplacer le curseur d'une
ligne à l'autre tant qu'ils restent à l'intérieur de la liste. Et à chaque
déplacement, le programme sélectionne la ligne en question tout en limitant
les déplacement à la plage de données. Exemple, s'ils tentent de descendre
plus bas que la dernière ligne ou de monter plus haut que la première ligne,
un beep se fait entendre et le curseur reste sur la ligne actuelle. Voila le
comportement désiré.

Mon problème:

Il est aussi possible d'appliquer le filtre automatique sur cette plage; ce
qui évidemment réduit le nombre de lignes affichées. Mon programme permet
toujours de cliquer sur une ligne et de déplacer le curseur d'une ligne à
l'autre sauf que si l'utilisateur tente de se positionner (avec les touches
du clavier) sur une ligne hors de la liste filtrée, je n'arrive pas à
empêcher ce déplacement. J'aimerais savoir comment trouver le numéro de la
première et de la dernière ligne affichée après filtrage. De cette façon je
pourrais positionner le curseur sur la première ou la dernière ligne selon
le cas si jamais l'utilisateur tentait de descendre ou monter à l'extérieur
de la liste.

Merci de vos lumières

Pierre

3 réponses

Avatar
JB
Bonjour,

Sub solution1()
If Range("A:A").SpecialCells(xlCellTypeVisible).Areas(1).Count > 1
Then
lignedeb = 2
Else
lignedeb =
Range("A:A").SpecialCells(xlCellTypeVisible).Areas(2).Item(1).Row
End If
lignefin = [A65000].End(xlUp).Row
MsgBox lignedeb & " " & lignefin
End Sub

Sub solution2()
ligne = 2
Do While Range("_FilterDataBase").Rows(ligne).Hidden
ligne = ligne + 1
Loop
lignedeb = ligne
lignefin = [A65000].End(xlUp).Row
MsgBox lignedeb & " " & lignefin
End Sub

http://cjoint.com/?ckhNZK6LSU

Cordialement JB

On 10 fév, 01:28, "Pierre Archambault"
wrote:
Bonjour à tous,

En effet, la description de mon problème est plutôt pointue...

J'utilise un contrôle Spreadsheet dans un userform. Les utilisateurs pe uvent
cliquer sur une ligne en particulier ce qui sélectionne cette ligne.
Ensuite, ils peuvent avec les touches fléchées, déplacer le curseur d'une
ligne à l'autre tant qu'ils restent à l'intérieur de la liste. Et à chaque
déplacement, le programme sélectionne la ligne en question tout en li mitant
les déplacement à la plage de données. Exemple, s'ils tentent de de scendre
plus bas que la dernière ligne ou de monter plus haut que la première ligne,
un beep se fait entendre et le curseur reste sur la ligne actuelle. Voila le
comportement désiré.

Mon problème:

Il est aussi possible d'appliquer le filtre automatique sur cette plage; ce
qui évidemment réduit le nombre de lignes affichées. Mon programme permet
toujours de cliquer sur une ligne et de déplacer le curseur d'une ligne à
l'autre sauf que si l'utilisateur tente de se positionner (avec les touch es
du clavier) sur une ligne hors de la liste filtrée, je n'arrive pas à
empêcher ce déplacement. J'aimerais savoir comment trouver le numér o de la
première et de la dernière ligne affichée après filtrage. De cett e façon je
pourrais positionner le curseur sur la première ou la dernière ligne selon
le cas si jamais l'utilisateur tentait de descendre ou monter à l'ext érieur
de la liste.

Merci de vos lumières

Pierre


Avatar
Pierre Archambault
Merci JB,

Je viens de lire ton message, il est encore tôt le matin, je vais me mettre
les yeux vis-à-vis des trous et ensuite je met ta solution en oeuvre.

Meric encore

Pierre


"JB" a écrit dans le message de news:

Bonjour,

Sub solution1()
If Range("A:A").SpecialCells(xlCellTypeVisible).Areas(1).Count > 1
Then
lignedeb = 2
Else
lignedeb Range("A:A").SpecialCells(xlCellTypeVisible).Areas(2).Item(1).Row
End If
lignefin = [A65000].End(xlUp).Row
MsgBox lignedeb & " " & lignefin
End Sub

Sub solution2()
ligne = 2
Do While Range("_FilterDataBase").Rows(ligne).Hidden
ligne = ligne + 1
Loop
lignedeb = ligne
lignefin = [A65000].End(xlUp).Row
MsgBox lignedeb & " " & lignefin
End Sub

http://cjoint.com/?ckhNZK6LSU

Cordialement JB

On 10 fév, 01:28, "Pierre Archambault"
wrote:
Bonjour à tous,

En effet, la description de mon problème est plutôt pointue...

J'utilise un contrôle Spreadsheet dans un userform. Les utilisateurs
peuvent
cliquer sur une ligne en particulier ce qui sélectionne cette ligne.
Ensuite, ils peuvent avec les touches fléchées, déplacer le curseur d'une
ligne à l'autre tant qu'ils restent à l'intérieur de la liste. Et à chaque
déplacement, le programme sélectionne la ligne en question tout en
limitant
les déplacement à la plage de données. Exemple, s'ils tentent de descendre
plus bas que la dernière ligne ou de monter plus haut que la première
ligne,
un beep se fait entendre et le curseur reste sur la ligne actuelle. Voila
le
comportement désiré.

Mon problème:

Il est aussi possible d'appliquer le filtre automatique sur cette plage;
ce
qui évidemment réduit le nombre de lignes affichées. Mon programme permet
toujours de cliquer sur une ligne et de déplacer le curseur d'une ligne à
l'autre sauf que si l'utilisateur tente de se positionner (avec les
touches
du clavier) sur une ligne hors de la liste filtrée, je n'arrive pas à
empêcher ce déplacement. J'aimerais savoir comment trouver le numéro de la
première et de la dernière ligne affichée après filtrage. De cette façon
je
pourrais positionner le curseur sur la première ou la dernière ligne selon
le cas si jamais l'utilisateur tentait de descendre ou monter à
l'extérieur
de la liste.

Merci de vos lumières

Pierre


Avatar
Pierre Archambault
Salut JB,

Voila, j'ai dû faire de petits ajustements mais j'y suis arrivé:

Dans l'événement Spreadsheet1_KeyDown j'ai mis un Gosub à TestLimites:

TestLimites:
L = 2
Do While Spreadsheet1.Range("A:A").Rows(L).RowHeight = 0
L = L + 1
Loop
Ld = L
'Ld: Ligne de début
Lf = Spreadsheet1.[A65000].End(xlUp).Row 'Lf: Ligne de fin
Return

Le contrôle Spreadsheet ne supporte pas SpecialCells alors je me suis
rabattu sur la deuxième solution.

Le contrôle Spreadsheet ne supporte pas non plus Hidden, j'ai opté pour
RowHeight.

Pour le reste, ajustements mineurs et le tour est joué.

Merci grandement.

Pierre




"JB" a écrit dans le message de news:

Bonjour,

Sub solution1()
If Range("A:A").SpecialCells(xlCellTypeVisible).Areas(1).Count > 1
Then
lignedeb = 2
Else
lignedeb Range("A:A").SpecialCells(xlCellTypeVisible).Areas(2).Item(1).Row
End If
lignefin = [A65000].End(xlUp).Row
MsgBox lignedeb & " " & lignefin
End Sub

Sub solution2()
ligne = 2
Do While Range("_FilterDataBase").Rows(ligne).Hidden
ligne = ligne + 1
Loop
lignedeb = ligne
lignefin = [A65000].End(xlUp).Row
MsgBox lignedeb & " " & lignefin
End Sub

http://cjoint.com/?ckhNZK6LSU

Cordialement JB

On 10 fév, 01:28, "Pierre Archambault"
wrote:
Bonjour à tous,

En effet, la description de mon problème est plutôt pointue...

J'utilise un contrôle Spreadsheet dans un userform. Les utilisateurs
peuvent
cliquer sur une ligne en particulier ce qui sélectionne cette ligne.
Ensuite, ils peuvent avec les touches fléchées, déplacer le curseur d'une
ligne à l'autre tant qu'ils restent à l'intérieur de la liste. Et à chaque
déplacement, le programme sélectionne la ligne en question tout en
limitant
les déplacement à la plage de données. Exemple, s'ils tentent de descendre
plus bas que la dernière ligne ou de monter plus haut que la première
ligne,
un beep se fait entendre et le curseur reste sur la ligne actuelle. Voila
le
comportement désiré.

Mon problème:

Il est aussi possible d'appliquer le filtre automatique sur cette plage;
ce
qui évidemment réduit le nombre de lignes affichées. Mon programme permet
toujours de cliquer sur une ligne et de déplacer le curseur d'une ligne à
l'autre sauf que si l'utilisateur tente de se positionner (avec les
touches
du clavier) sur une ligne hors de la liste filtrée, je n'arrive pas à
empêcher ce déplacement. J'aimerais savoir comment trouver le numéro de la
première et de la dernière ligne affichée après filtrage. De cette façon
je
pourrais positionner le curseur sur la première ou la dernière ligne selon
le cas si jamais l'utilisateur tentait de descendre ou monter à
l'extérieur
de la liste.

Merci de vos lumières

Pierre