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

VBA : Ligne suivante d'un tableau filtr

12 réponses
Avatar
Jac
Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac

10 réponses

1 2
Avatar
MichDenis
Bonjour Jac,

Dans la procédure suivante, tu n'as qu'à renseigner
la variable NB avec le numéro de la ligne de
l'enregistrement à trouver.

Exemple : 3 ième enregistrement : Nb = 3

Évidemment, le nom de la feuille, la plage de cellules
sont à renseigner selon ton application.
'--------------------------------------
Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
With .Range("A1:F" & .Range("A65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:="5"
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
x = Application.Subtotal(9, Rg(1))
End With
End With

If Nb > x Then Nb = x
For Each r In Rg.Rows
A = A + 1
'Pour copier la ligne filtrée sur une autre feuille
'r.Copy Worksheets("Feuil2").Range("A" & A)
If A = Nb Then MsgBox r.Row: Exit For
Next
Worksheets("Feuil1").Range("A1").AutoFilter
Application.ScreenUpdating = True
End Sub
'--------------------------------------



"Jac" a écrit dans le message de groupe de discussion :

Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac
Avatar
isabelle
bonjour Jac,

'selectionne la premiere ligne visible
PremiereLigneFiltre = Range("A2",
"A65535").SpecialCells(xlCellTypeVisible).Row
Range("A" & PremiereLigneFiltre).Select
'selectionne la deuxième ligne visible
SendKeys "{DOWN}", True

isabelle

Jac a écrit :
Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client
suivant ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac




Avatar
Jac
Bonjour MichDenis,

merci de te pencher sur mon problème. Je reviens sur ma problématique
non résolue pour le moment par ta solution.

La table est filtrée. J'affiche actuellement dans mon formulaire les
données de la ligne 15. La ligne visible suivante porte le n° 20. Et ce
que j'ai besoin d'obtenir, c'est la valeur 20 ou le contenu de la
cellule A20 qui me permettra de retrouver par une recherche le n° de
ligne correspondant.


MichDenis a couché sur son écran :
Bonjour Jac,

Dans la procédure suivante, tu n'as qu'à renseigner
la variable NB avec le numéro de la ligne de
l'enregistrement à trouver.

Exemple : 3 ième enregistrement : Nb = 3

Évidemment, le nom de la feuille, la plage de cellules
sont à renseigner selon ton application.
'--------------------------------------
Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
With .Range("A1:F" & .Range("A65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:="5"
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
x = Application.Subtotal(9, Rg(1))
End With
End With

If Nb > x Then Nb = x
For Each r In Rg.Rows
A = A + 1
'Pour copier la ligne filtrée sur une autre feuille
'r.Copy Worksheets("Feuil2").Range("A" & A)
If A = Nb Then MsgBox r.Row: Exit For
Next
Worksheets("Feuil1").Range("A1").AutoFilter
Application.ScreenUpdating = True
End Sub
'--------------------------------------



"Jac" a écrit dans le message de groupe de discussion :

Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac


Avatar
Jac
Bonjour Isabelle,

désolé mais SendKeys "{DOWN}", True ne déplae pas la cellule active. A
la main, flèche vers le bas passe au suivant...

isabelle avait prétendu :
bonjour Jac,

'selectionne la premiere ligne visible
PremiereLigneFiltre = Range("A2",
"A65535").SpecialCells(xlCellTypeVisible).Row
Range("A" & PremiereLigneFiltre).Select
'selectionne la deuxième ligne visible
SendKeys "{DOWN}", True

isabelle

Jac a écrit :
Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu d'une
ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se suivent
pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant ou
précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la 14
(ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le numéro
de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac




Avatar
MichDenis
Bonjour Jac,

Tu recherches des solutions copier-coller. Il faut faire quand même un minimum d'efforts
pour comprendre les procédures proposées. À partir de ma première proposition, tu aurais
pu conclure à ceci :

Tu dois adapter le nom de la feuille (propriété Name)

'---------------------------------------
Sub test()
Dim Rg As Range, R As Range
Dim X As Long, Nb As Long

'Déterminer la ligne de quel enregistrement
'vous désirez obtenir.
'*********************
Nb = 2
'*********************
With Feuil1
If .FilterMode = True Then
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1) _
.Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
'Choisir une autre colonne que A si nécessaire
X = Application.Subtotal(3, .Range("A:A")) - 1
If X < Nb Then
MsgBox "Il n'y a que " & X & " enregistrement(s)."
Exit Sub
End If
For Each R In Rg.Rows
A = A + 1
If A = Nb Then MsgBox R.Row: Exit For
Next
Else
MsgBox "Il n'y a aucun filtre en application."
End If

End With
End Sub
'---------------------------------------




"Jac" a écrit dans le message de groupe de discussion :

Bonjour MichDenis,

merci de te pencher sur mon problème. Je reviens sur ma problématique
non résolue pour le moment par ta solution.

La table est filtrée. J'affiche actuellement dans mon formulaire les
données de la ligne 15. La ligne visible suivante porte le n° 20. Et ce
que j'ai besoin d'obtenir, c'est la valeur 20 ou le contenu de la
cellule A20 qui me permettra de retrouver par une recherche le n° de
ligne correspondant.


MichDenis a couché sur son écran :
Bonjour Jac,

Dans la procédure suivante, tu n'as qu'à renseigner
la variable NB avec le numéro de la ligne de
l'enregistrement à trouver.

Exemple : 3 ième enregistrement : Nb = 3

Évidemment, le nom de la feuille, la plage de cellules
sont à renseigner selon ton application.
'--------------------------------------
Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
With .Range("A1:F" & .Range("A65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:="5"
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
x = Application.Subtotal(9, Rg(1))
End With
End With

If Nb > x Then Nb = x
For Each r In Rg.Rows
A = A + 1
'Pour copier la ligne filtrée sur une autre feuille
'r.Copy Worksheets("Feuil2").Range("A" & A)
If A = Nb Then MsgBox r.Row: Exit For
Next
Worksheets("Feuil1").Range("A1").AutoFilter
Application.ScreenUpdating = True
End Sub
'--------------------------------------



"Jac" a écrit dans le message de groupe de discussion :

Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac


Avatar
Jac
… je suis désolé, mais avec ta première solution, je ne suis pas arrivé
à obtenir ce que je voulais. Maintenant, ça fonctionne, mais c'est pas
tout à fait ce qu'il me faut : je ne sais pas quel n° d'enregistrement
je recherche (Nb = ?) , mais je veux le premier visible après la ligne
15, par exemple, donc le 16, le 20 ou le 39, bref le suivant, ou le
précédent.

MichDenis a écrit :
Bonjour Jac,

Tu recherches des solutions copier-coller. Il faut faire quand même un
minimum d'efforts pour comprendre les procédures proposées. À partir de ma
première proposition, tu aurais pu conclure à ceci :

Tu dois adapter le nom de la feuille (propriété Name)

'---------------------------------------
Sub test()
Dim Rg As Range, R As Range
Dim X As Long, Nb As Long

'Déterminer la ligne de quel enregistrement
'vous désirez obtenir.
'*********************
Nb = 2
'*********************
With Feuil1
If .FilterMode = True Then
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1) _
.Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
'Choisir une autre colonne que A si nécessaire
X = Application.Subtotal(3, .Range("A:A")) - 1
If X < Nb Then
MsgBox "Il n'y a que " & X & " enregistrement(s)."
Exit Sub
End If
For Each R In Rg.Rows
A = A + 1
If A = Nb Then MsgBox R.Row: Exit For
Next
Else
MsgBox "Il n'y a aucun filtre en application."
End If

End With
End Sub
'---------------------------------------




"Jac" a écrit dans le message de groupe de discussion :

Bonjour MichDenis,

merci de te pencher sur mon problème. Je reviens sur ma problématique
non résolue pour le moment par ta solution.

La table est filtrée. J'affiche actuellement dans mon formulaire les
données de la ligne 15. La ligne visible suivante porte le n° 20. Et ce
que j'ai besoin d'obtenir, c'est la valeur 20 ou le contenu de la
cellule A20 qui me permettra de retrouver par une recherche le n° de
ligne correspondant.


MichDenis a couché sur son écran :
Bonjour Jac,

Dans la procédure suivante, tu n'as qu'à renseigner
la variable NB avec le numéro de la ligne de
l'enregistrement à trouver.

Exemple : 3 ième enregistrement : Nb = 3

Évidemment, le nom de la feuille, la plage de cellules
sont à renseigner selon ton application.
'--------------------------------------
Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
With .Range("A1:F" & .Range("A65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:="5"
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
x = Application.Subtotal(9, Rg(1))
End With
End With

If Nb > x Then Nb = x
For Each r In Rg.Rows
A = A + 1
'Pour copier la ligne filtrée sur une autre feuille
'r.Copy Worksheets("Feuil2").Range("A" & A)
If A = Nb Then MsgBox r.Row: Exit For
Next
Worksheets("Feuil1").Range("A1").AutoFilter
Application.ScreenUpdating = True
End Sub
'--------------------------------------



"Jac" a écrit dans le message de groupe de discussion :

Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac




Avatar
MichDenis
C'est quoi ta question???????????????????????????????????????????????????????????????????



"Jac" a écrit dans le message de groupe de discussion :
#
… je suis désolé, mais avec ta première solution, je ne suis pas arrivé
à obtenir ce que je voulais. Maintenant, ça fonctionne, mais c'est pas
tout à fait ce qu'il me faut : je ne sais pas quel n° d'enregistrement
je recherche (Nb = ?) , mais je veux le premier visible après la ligne
15, par exemple, donc le 16, le 20 ou le 39, bref le suivant, ou le
précédent.

MichDenis a écrit :
Bonjour Jac,

Tu recherches des solutions copier-coller. Il faut faire quand même un
minimum d'efforts pour comprendre les procédures proposées. À partir de ma
première proposition, tu aurais pu conclure à ceci :

Tu dois adapter le nom de la feuille (propriété Name)

'---------------------------------------
Sub test()
Dim Rg As Range, R As Range
Dim X As Long, Nb As Long

'Déterminer la ligne de quel enregistrement
'vous désirez obtenir.
'*********************
Nb = 2
'*********************
With Feuil1
If .FilterMode = True Then
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1) _
.Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
'Choisir une autre colonne que A si nécessaire
X = Application.Subtotal(3, .Range("A:A")) - 1
If X < Nb Then
MsgBox "Il n'y a que " & X & " enregistrement(s)."
Exit Sub
End If
For Each R In Rg.Rows
A = A + 1
If A = Nb Then MsgBox R.Row: Exit For
Next
Else
MsgBox "Il n'y a aucun filtre en application."
End If

End With
End Sub
'---------------------------------------




"Jac" a écrit dans le message de groupe de discussion :

Bonjour MichDenis,

merci de te pencher sur mon problème. Je reviens sur ma problématique
non résolue pour le moment par ta solution.

La table est filtrée. J'affiche actuellement dans mon formulaire les
données de la ligne 15. La ligne visible suivante porte le n° 20. Et ce
que j'ai besoin d'obtenir, c'est la valeur 20 ou le contenu de la
cellule A20 qui me permettra de retrouver par une recherche le n° de
ligne correspondant.


MichDenis a couché sur son écran :
Bonjour Jac,

Dans la procédure suivante, tu n'as qu'à renseigner
la variable NB avec le numéro de la ligne de
l'enregistrement à trouver.

Exemple : 3 ième enregistrement : Nb = 3

Évidemment, le nom de la feuille, la plage de cellules
sont à renseigner selon ton application.
'--------------------------------------
Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
With .Range("A1:F" & .Range("A65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:="5"
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
x = Application.Subtotal(9, Rg(1))
End With
End With

If Nb > x Then Nb = x
For Each r In Rg.Rows
A = A + 1
'Pour copier la ligne filtrée sur une autre feuille
'r.Copy Worksheets("Feuil2").Range("A" & A)
If A = Nb Then MsgBox r.Row: Exit For
Next
Worksheets("Feuil1").Range("A1").AutoFilter
Application.ScreenUpdating = True
End Sub
'--------------------------------------



"Jac" a écrit dans le message de groupe de discussion :

Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac




Avatar
Jac
Ligne suivante d'un tableau filtré

MichDenis avait prétendu :
C'est quoi ta
question???????????????????????????????????????????????????????????????????



"Jac" a écrit dans le message de groupe de discussion :
#
… je suis désolé, mais avec ta première solution, je ne suis pas arrivé
à obtenir ce que je voulais. Maintenant, ça fonctionne, mais c'est pas
tout à fait ce qu'il me faut : je ne sais pas quel n° d'enregistrement
je recherche (Nb = ?) , mais je veux le premier visible après la ligne
15, par exemple, donc le 16, le 20 ou le 39, bref le suivant, ou le
précédent.

MichDenis a écrit :
Bonjour Jac,

Tu recherches des solutions copier-coller. Il faut faire quand même un
minimum d'efforts pour comprendre les procédures proposées. À partir de ma
première proposition, tu aurais pu conclure à ceci :

Tu dois adapter le nom de la feuille (propriété Name)

'---------------------------------------
Sub test()
Dim Rg As Range, R As Range
Dim X As Long, Nb As Long

'Déterminer la ligne de quel enregistrement
'vous désirez obtenir.
'*********************
Nb = 2
'*********************
With Feuil1
If .FilterMode = True Then
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1) _
.Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
'Choisir une autre colonne que A si nécessaire
X = Application.Subtotal(3, .Range("A:A")) - 1
If X < Nb Then
MsgBox "Il n'y a que " & X & " enregistrement(s)."
Exit Sub
End If
For Each R In Rg.Rows
A = A + 1
If A = Nb Then MsgBox R.Row: Exit For
Next
Else
MsgBox "Il n'y a aucun filtre en application."
End If

End With
End Sub
'---------------------------------------




"Jac" a écrit dans le message de groupe de discussion :

Bonjour MichDenis,

merci de te pencher sur mon problème. Je reviens sur ma problématique
non résolue pour le moment par ta solution.

La table est filtrée. J'affiche actuellement dans mon formulaire les
données de la ligne 15. La ligne visible suivante porte le n° 20. Et ce
que j'ai besoin d'obtenir, c'est la valeur 20 ou le contenu de la
cellule A20 qui me permettra de retrouver par une recherche le n° de
ligne correspondant.


MichDenis a couché sur son écran :
Bonjour Jac,

Dans la procédure suivante, tu n'as qu'à renseigner
la variable NB avec le numéro de la ligne de
l'enregistrement à trouver.

Exemple : 3 ième enregistrement : Nb = 3

Évidemment, le nom de la feuille, la plage de cellules
sont à renseigner selon ton application.
'--------------------------------------
Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
With .Range("A1:F" & .Range("A65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:="5"
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
x = Application.Subtotal(9, Rg(1))
End With
End With

If Nb > x Then Nb = x
For Each r In Rg.Rows
A = A + 1
'Pour copier la ligne filtrée sur une autre feuille
'r.Copy Worksheets("Feuil2").Range("A" & A)
If A = Nb Then MsgBox r.Row: Exit For
Next
Worksheets("Feuil1").Range("A1").AutoFilter
Application.ScreenUpdating = True
End Sub
'--------------------------------------



"Jac" a écrit dans le message de groupe de discussion :

Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac






Avatar
Daniel.C
Bonsooir.
En modifiant la macro de Denis :

Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
MsgBox Rg.Row
End With
Application.ScreenUpdating = True
End Sub

Daniel

Ligne suivante d'un tableau filtré

MichDenis avait prétendu :
C'est quoi ta
question???????????????????????????????????????????????????????????????????



"Jac" a écrit dans le message de groupe de discussion :
#
… je suis désolé, mais avec ta première solution, je ne suis pas arrivé
à obtenir ce que je voulais. Maintenant, ça fonctionne, mais c'est pas
tout à fait ce qu'il me faut : je ne sais pas quel n° d'enregistrement
je recherche (Nb = ?) , mais je veux le premier visible après la ligne
15, par exemple, donc le 16, le 20 ou le 39, bref le suivant, ou le
précédent.

MichDenis a écrit :
Bonjour Jac,

Tu recherches des solutions copier-coller. Il faut faire quand même un
minimum d'efforts pour comprendre les procédures proposées. À partir de
ma
première proposition, tu aurais pu conclure à ceci :

Tu dois adapter le nom de la feuille (propriété Name)

'---------------------------------------
Sub test()
Dim Rg As Range, R As Range
Dim X As Long, Nb As Long

'Déterminer la ligne de quel enregistrement
'vous désirez obtenir.
'*********************
Nb = 2
'*********************
With Feuil1
If .FilterMode = True Then
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1) _
.Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
'Choisir une autre colonne que A si nécessaire
X = Application.Subtotal(3, .Range("A:A")) - 1
If X < Nb Then
MsgBox "Il n'y a que " & X & " enregistrement(s)."
Exit Sub
End If
For Each R In Rg.Rows
A = A + 1
If A = Nb Then MsgBox R.Row: Exit For
Next
Else
MsgBox "Il n'y a aucun filtre en application."
End If

End With
End Sub
'---------------------------------------




"Jac" a écrit dans le message de groupe de discussion :

Bonjour MichDenis,

merci de te pencher sur mon problème. Je reviens sur ma problématique
non résolue pour le moment par ta solution.

La table est filtrée. J'affiche actuellement dans mon formulaire les
données de la ligne 15. La ligne visible suivante porte le n° 20. Et ce
que j'ai besoin d'obtenir, c'est la valeur 20 ou le contenu de la
cellule A20 qui me permettra de retrouver par une recherche le n° de
ligne correspondant.


MichDenis a couché sur son écran :
Bonjour Jac,

Dans la procédure suivante, tu n'as qu'à renseigner
la variable NB avec le numéro de la ligne de
l'enregistrement à trouver.

Exemple : 3 ième enregistrement : Nb = 3

Évidemment, le nom de la feuille, la plage de cellules
sont à renseigner selon ton application.
'--------------------------------------
Sub Denis()

Dim Rg As Range
Dim A As Long
Dim Nb As Long

'****************************************
Nb = 2 'nombre de lignes du filtre à copier
'****************************************

Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom feuille où sont les données
With .Range("A1:F" & .Range("A65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:="5"
Set Rg = .Range("_FilterDataBase")
Set Rg = Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
'Nb enregistrements trouvés
x = Application.Subtotal(9, Rg(1))
End With
End With

If Nb > x Then Nb = x
For Each r In Rg.Rows
A = A + 1
'Pour copier la ligne filtrée sur une autre feuille
'r.Copy Worksheets("Feuil2").Range("A" & A)
If A = Nb Then MsgBox r.Row: Exit For
Next
Worksheets("Feuil1").Range("A1").AutoFilter
Application.ScreenUpdating = True
End Sub
'--------------------------------------



"Jac" a écrit dans le message de groupe de discussion
:

Bonjour à tous,

je me base sur les données d'un tableau pour afficher dans une autre
feuille les données d'une ligne du tableau (1 ligne = 1 client) en
plusieurs colonnes. Donc j'obtiens 4 colonnes de 30 lignes au lieu
d'une ligne de 120 colonnes. Ça occupe mieux l'écran ou la feuille
imprimée…

Mais la source est un tableau filtré, donc les n° de ligne ne se
suivent pas forcément. Normal.

Connaissant le numéro de la ligne du client affiché, j'ai besoin de
connaiître le n° suivant ou précédent afin d'afficher le client suivant
ou précédent.

Et c'est là que le bas blesse... La ligne 15, actuellement affichée en
fiche, est suivie par la ligne 20 (ou 25) et elle est précédée par la
14 (ou la 13 ou la 8...) et en vba, je ne vois pas comment calculer le
numéro de la ligne recherchée.

Merci d'avance à qui pourrait me mettre sur la voie.

Jac








Avatar
Jac
Je tente de… clarifier avec un exemple :

http://cjoint.com/?gbw0x88nAM

… car, il me semble, je comprends bien ma question et mal vos
suggestions et vous, ce serait l'inverse…
1 2