VBA : Ligne suivante d'un tableau filtr

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichDenis
Le #19462371
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"
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
isabelle
Le #19462511
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




Jac
Le #19462701
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"
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


Jac
Le #19462691
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




MichDenis
Le #19463981
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"
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"
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


Jac
Le #19464331
… 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"
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"
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




MichDenis
Le #19464781
C'est quoi ta question???????????????????????????????????????????????????????????????????



"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"
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"
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




Jac
Le #19464771
Ligne suivante d'un tableau filtré

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



"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"
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"
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






Daniel.C
Le #19465601
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" #
… 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"
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" :

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








Jac
Le #19466201
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…
Publicité
Poster une réponse
Anonyme