Récupérer N° ligne dont contenu<>contenu 1ère ligne col B et Filtre auto col D

scribetout - 17 mars 2013 à 13:07
 scribetout - 21 mars 2013 à 08:57
Bonjour Tout le monde,

Débutant j'ai besoin de votre aide. je vous expose mon problème.

Ma feuille contient 13 colonnes et 325 lignes pour le moment. Je voudrais en VBA, faire un filtre auto sur la colonne D, on compare le contenu des cellules de la colonne B par rapport à la 1ère ligne visible (pour déternimer le numéro de la ligne dont la valeur est différente (NligDiff)).

Pour qu'ensuite, on récupère le contenu de la cellule colonne J et ce numéro de ligne (NligDiff), à placer sur la première ligne visible en colonne 13 et supprimer la ligne. (comment récupérer ce numéro de ligne?)

Je vous précise que j'ai effectué des essais de filtrage manuel. J'ai constaté qu'à chaque filtrage, il ne subsiste qu'une seule ligne dont la valeur en colonne B est différente des autres et qu'elle n'est jamais la 1ère ligne visible, par contre sa valeur change. Il faudrait pas exclure l'éventualité qu'il y en ait plus d'une à l'avenir.

Je vous remercie beaucoup.

12 réponses

Bonjour a toi,
pourrais-tu joindre un fichier exemple pour que cela soit plus clair parce que je m'y perd un peu dans tes colonnes et dans ce que tu veux exactement.


Fabien
0
Bonjour Fabien, je te remercie d'avoir répondu à mon message. je suis débutant et me démène comme je peux pour arriver à mes fins dans un but d'apprentissage. Je suis parvenu à faire une macro qui me fait une partie du travail. j'ai aussi allégé la BD.

Pour le reste, je sais que je dois comparer les chaînes de caractères après filtrage de la colonne B par contre cette fois-ci le filtrage se fait avec 2 critères. Vu mon niveau, il se peut que je sois à côté de la plaque.
http://dl.free.fr/iKkWSPII9
Je te remercie beaucoup.
0
Bonjour, j'ai ouvert ton classeur et j'ai ouvert la macro... il faudrait déjà commencer par faire du ménage dans tes variables, tu en déclares au moins la moitié qui ne sont pas utilisées dans ton code.


Fabien
0
Bonjour Fabien,

Effectivement, il y a beaucoup de variables déclarées non utilisées pour la simple raison, que je n'ai laissé que le code qui concerne cette partie du travail (le code fait partie d'une macro qui me prépare l'entête du document final à imprimer) . Je te signale que pour simplifier le problème, il faudrait peut-être trier les colonne B et C afin de mettre les données sur la première colonne visible. Comme, je suis débutant, j'ai fait cette partie en utilisant l'enregistreur de macro et j'essaie de simplifier le code obtenu.

Je ne sais pas si tu as bien compris le résultat que je veux obtenir. En fait, pour alléger un rapport. Certaines données, peuvent être mises en observation sur une ligne ayant pour la colonne C:chaine string d'une contenue dans une autre chaine string et pour la colonne D la même valeur, et par suite supprimer ces lignes "superflues". Au final, il aura beaucoup moins de lignes.


Je te remercie beaucoup pour ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
il faudrait peut-être trier les colonnes B et C afin de mettre les données sur la première colonne visible


Désolé, il faut lire La première ligne visible.
au lieu de faire un aperçu, j'ai cliqué sur "envoyer le message"

Merci.

Scribetout
0
Rebonjour,

Pourrais-tu m'indiquer comment faire pour étendre ma plage déjà définie dans le code ci-dessous jusqu’à la colonne M. J'ai essayé avec offset mais ça ne fonctionne pas.
Set bd = Sheets("BD")
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row
Set pl = bd.Range("B8:B" & dl)

merci beaucoup.
0
si tu veux étendre du type range("B8:M" & dl) c'est normal le offset te déplace d'un nombre de colonne ou de ligne, mais ne te l'élargit pas. Sinon tu change, tu fais set pl = bd.range("B8:M" & dl)


Fabien
0
Je te remercie, c'est ce que j'avais déduit. Je voulais dire en faisant référence à la première plage définit dans le code:pl = bd.Range("B2:B" & dl)
J'ai fait un peu le ménage dans la macro et j'ai rajouté au début le tri sur la feuille BD. Voici le code:
Sub Stt()
Dim bd As Object '(onglet BD)
Dim dl As Integer '(Dernière Ligne)
Dim pl As Range 'PLage)
Dim dico As Object '(DICtiOnnaire)
Dim cel As Range '(CELlule)
Dim temp As Variant '(tableau TEMPoraire)
Dim i As Integer '(Incrément)
Dim o As Object '(Onglet)
Dim dics As Object 'DICtionnaireS)
Dim teo As Variant '(tableau TEmporaire Outils)
Dim z As Integer 'variable z
Dim lg As Integer
Dim dercol As Integer '(Dernière colonne)
Dim Obs As String

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Application.ScreenUpdating = False
Set bd = Sheets("BD")
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row
Set pl = bd.Range("B2:B" & dl)

'Tri BD avant traitement

Range("B2:M" & dl).Select
        bd.Sort.SortFields.Add Key:=Range( _
        "B2:B" & dl), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    bd.Sort.SortFields.Add Key:=Range( _
        "C2:C" & dl), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With bd.Sort
        .SetRange Range("B1:M71")
        .Apply
    End With
' Fin tri BD

'Début concaténation et suppression ligne pour "Stt"
    
    bd.Range("A1").AutoFilter Field:=2, Criteria1:="Stt"
    
    Set dico = CreateObject("Scripting.Dictionary")
    For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible)
        dico(cel.Value) = ""
    Next cel
    temp = dico.keys
    For i = 0 To UBound(temp)
    
    bd.Range("A1").AutoFilter Field:=4, Criteria1:=temp(i)
 
    If bd.Range("B:B").SpecialCells(xlCellTypeVisible).Areas(1).Count > 1 Then
       lg = 2
     Else
       lg = bd.Range("B:B").SpecialCells(xlCellTypeVisible).Areas(2).Item(1).Row
     End If

        z = Application.Subtotal(3, [pl])
                    
    'concatener
    If z > 1 And Cells(lg, 3) <> Cells(lg + 1) Then
               
        Obs "I " & Cells(lg + 1, 3) & " " & Cells(lg + 1, 10) & "mA " & " ; " & Cells(lg + 1, 13) & " ; " & Cells(lg, 13)
        Obs = Replace(Obs, Chr(10) & Chr(10), Chr(10))
        Cells(lg, 13).Value = Obs
        Rows(lg + 1).Delete
          
    End If
   Next i
    
   bd.Range("A1").AutoFilter
   
MsgBox "terminé!"
End Sub


Je te remercie pour ton aide.

Scribetout
0
Bon j'ai vu ton fichier excel avec dans la première feuille ta liste, mais je ne comprend vraiment pas ce que tu veux... qu'est ce que tu entend pas concaténer ? Pour moi concaténer c'est : "BON" et "JOUR" si tu concatènes, ca fait "BONJOUR"...


Fabien
0
Bonjour Fabien,
Pour moi concaténer c'est : "BON" et "JOUR" si tu concatènes, ca fait "BONJOUR"...

C'est ça concaténer, mais aussi faire: "BON JOUR".

En fait, je veux réduire le nombre de lignes, car seules 3 informations m’intéresse (col I-J-M). Comme je te l'ai dit je suis débutant. D'après moi, on scanne les cellules de la colonne C, et si on retrouve les caractères d'une ligne dans une autre, on copie (I&J&M) et on supprime la ligne.
D'après mon fichier, je te donne un exemple: si tu filtre sur la colonne D (T16), on a 5 lignes (2,10,18,29,31). la 1ère ligne visible (2) en colonne C on trouve "G1". on recherche donc cette valeur dans les autres cellules, que l'on retrouve en ligne 28 dans la chaine "PC_G1". ici, on concatène I28&J28&M28&M2 (pour ne pas supprimer la donnée en M2), puis on supprime la ligne 28 et ainsi de suite (on fait une boucle).(on a le même cas, pour ligne 17 et 31).

j'ai travaillé de mon côté mais rien de concluant. je me donne du temps pour tout revoir car je pense que j'ai 3 cas (select case). j'ai fait des tests mes grandes difficultés sont le traitements des chaines de caractères et la récupération du numéro de lignes visibles.

je te remercie quand même de t'être pencher sur mon problème.
0
Aurais-tu une idée pour récupérer le numéro des lignes visibles d'un filtre?
Pas de la première ligne visible.
je te remercie.
0
Bonjour Fabien, C'est juste pour te dire que j'ai solutionné mon problème. Si tu n'as pas bien compris ce que je recherchais, est surement de ma faute car débutant je ne suis pas habitué à exposer un problème dans le jargon des développeurs.

Mon souci était de récupérer les numéros des lignes visibles d'un filtre auto. J'ai donc fait des copies de ces lignes visibles et j'ai fait 3 petites macros, le temps d’exécution est un peu long mais l'essentiel est le résultat final.

Mais ma question reste toujours posées: quelles astuces pour récupérer les numéros des lignes visibles?

Je te remercie.

Cordialement,
Scribetout
0
Rejoignez-nous