Recherche d'occurence => décallage dans listview

Byfranck

XLDnaute Occasionnel
Bonjour à tous,

Je me suis permis de créer un nouveau fil car la problématique a évoluée depuis
HTML:
http://www.excel-downloads.com/forum/124794-encore-un-listbox-avec-doublons.html

Voila donc en pièce jointe une nouvelle demande d'aide aux supers callés des tableaux ! :eek:

Dans le fichier ci-joint il y a 3 Usf.
UserFormListviewCh est celui qui a été construit grâce à l'aide deYouk(BJ) et bqtr:
Il permet à partir d'afficher dans un listview toutes les lignes d'une feuille qui contiennent une chaine de caractère spécifiée dans un Textbox.

UserForm7 est un Usf existant dans ma base de données qui me premet d'afficher dans un listview certaines cellules de ma base de donnée:
=> un double click sur la ligne qui m'intéresse et par une recherche faite sur la colonneA de ma feuille, il m'affiche dans les textbox d'un Usf pratiquement toute les valeurs de la ligne sélectionnée .
(l'Usf résultat inclu dans le fichier joint est simplifié: en réel il a 147 textbox ou combobox)

Mon problème est que dans l'Usf UserFormListviewCh je voudrais garder le principe du Dblclick pour ouvrir l'Usf résultat (ou alors le contratrire incorporer une recherche par mots dans l'Usf7)
Là est le hic: :eek: dans UserFormListviewCh la list view est évrit pour afficher en colonne0 le nom de la feuille dont je n'ai absolument pas besoin (je n'ai qu'une feuille de donnée) et pour que mon double click fonctionne il ne faut pas d'information de feuille ou de cellule dans le listview.

dans le fichier joint j'ai bricolé le code de bqtr pour que l'affichage se limite à la feuille "Feuil1" et qu'en 1ere colonne du listview j'ai le contenu de la 1ere colonne de ma "Feuil1" ... mais pas moyen d'afficher correctement le reste des colonnes, il un a toujours une répétition et donc un décallage entre les headers et le contenu des colonnes. :confused:

Si quelqu'un pouvait jetter un oeil sur le code de l'Usf "UserFormListviewCh" et m'expliquer comment supprimer les info indiquant la Feuille et la ref de la cellule ça m'aiderait grandement. :eek:

Merci d'avance pour votre aide et vos conseils

Cordialement
Franck
 

Pièces jointes

  • ByFranck _V9.zip
    46 KB · Affichages: 80
Dernière édition:

Gael

XLDnaute Barbatruc
Re : Recherche d'occurence => décallage dans listview

Bonjour ByFranck, bonjour à tous,

Un essai ci-joint.

J'ai simplifié un peu le code puisque tu n'as qu'une feuille.

@+

Gael
 

Pièces jointes

  • ByFranck _V10.zip
    49.2 KB · Affichages: 84

Gael

XLDnaute Barbatruc
Re : Recherche d'occurence => décallage dans listview

Re,

Petite simplification aussi pour l'affichage su client choisi après le double clic:

Code:
...
    Range("B1").Value = ListView1.SelectedItem
'on cherche cette ref dans onglet onglet Feuil1 colonne A
  ActiveSheet.Columns("A").Cells.Find(what:=Range("B1"), LookIn:=xlFormulas, _
        LookAt:=xlPart, MatchCase:=False).Activate
   résultat.Show
End Sub

J'ai supprimé les options inutiles (After..., searchdirection...)

@+

Gael
 

Byfranck

XLDnaute Occasionnel
Re : Recherche d'occurence => décallage dans listview

Bonjour Gael,

Je viens de tester tes modifs , ça mache plutôt bien. :D
J'ai dû ajouter un Sheets("feuil1").Activate car en démarrant sans il y avait des plantages sur ma base avec d'autres onglets.

Code:
'ICI C'est le Moteur de Recherche
Private Sub CommandButton1_Click()

Dim F As Worksheet
Dim Plage As Range, C As Range
Dim T As String, Firstaddress As String
Dim x As Integer, k As Long, m As Long, n As Long, j As Byte, q As Variant
Dim lig As Integer
Dim Tablo()

    ListView1.ListItems.Clear
    T = Me.TextBox1
    If T = "" Then Exit Sub
    n = 1
[COLOR="blue"]          Sheets("Feuil1").Activate[/COLOR]
          With ActiveSheet
             Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(.Rows.Count, .Columns.Count)))
          End With
          Set C = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart)
            If Not C Is Nothing Then
                Firstaddress = C.Address
                
                Do
                    ReDim Preserve Tablo(0 To 19, 0 To k)
                      For x = 0 To 18
                        Tablo(x, k) = ActiveSheet.Cells(C.Row, x + 1).Text
                      Next
                    Tablo(19, k) = C.Address(False, False)
                    k = k + 1
                  
                  Set C = Plage.FindNext(C)
                Loop While Not C Is Nothing And C.Address <> Firstaddress
            End If
     
      
      On Error Resume Next
        q = UBound(Tablo, 2)
      On Error GoTo 0
      
      If IsEmpty(q) Then
        MsgBox "Le Texte " & T & " n'a pas été trouvé" & vbLf & "Faites un essai sur une partie du nom", vbCritical, Sign
        Exit Sub
      End If
      
      For m = 0 To UBound(Tablo, 2)
        ListView1.ListItems.Add , , Tablo(0, m)
        For j = 1 To 19
          ListView1.ListItems(n).ListSubItems.Add Text:=Tablo(j, m)
        Next
        n = n + 1
      Next
 End Sub

Idem j'ai ajouté .Range("A7").Activate qui évite aussi certains plantages

Code:
'ICI C'est la sélection au Double Click & Sortie du UserForm
Private Sub Listview1_DblClick()
'Dim lig As Long
Dim ligne As ListItem
On Error Resume Next
Set ligne = ListView1.SelectedItem
On Error GoTo 0
If ligne Is Nothing Then
    MsgBox "Aucune ligne n'est sélectionnée."
    Exit Sub
End If

    Range("B1").Value = ListView1.SelectedItem

  With ThisWorkbook.Sheets("Feuil1")
[COLOR="Blue"].Range("A7").Activate[/COLOR]

'on cherche cette ref dans onglet onglet Feuil1 colonne A
  Sheets("Feuil1").Columns("A").Cells.Find(what:=Range("B1"), after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
End With
   résultat.Show
End Sub


je vais aussi utiliser tes derniers codes simplifié, en effet tu a as raison maintenant plus besoin de définir le sens de recherche. ;)


Par contre je me retrouve avec des doublons dans la listview, il faut que je trouve comment les éliminer.

Merci beaucoup Gael pour ton aide :)

Cordialement
Franck
 

Byfranck

XLDnaute Occasionnel
Re : Recherche d'occurence => décallage dans listview

Bonsoir à tous,

Bon, rien à faire je n'y arrive pas.
j'ai fait une version simpifiée de ma base et sur le même Usf il y a 2 boutons de recherche.

Celui de droite lance bien la recherche, mais je ne peux pas choisir les header que je veux avec le code que Gael m'a gentillement fait=> ça me pose un problème car ma vrai base a 248 colonnes .. si dans le listview je dois tout afficher pour pouvoir voir la valeur de la 247eme colonne vous comprennez le problème!

Celui de gauche est une tentative pour avoir les headers dont j'ai besoin .. ça ne fait que planter malgré toutes mes tentatives..

Si quelqu'un a un peu de temps à me consacrer .. moi je suis complètement perdu entre les plages et les Tablo, TabTemp ...

Merci d'avance pour le coup de main que vous pourriez me donner.
Cordialement
Franck
 

Pièces jointes

  • ByFranck _V11 TEST.zip
    46 KB · Affichages: 46

Gael

XLDnaute Barbatruc
Re : Recherche d'occurence => décallage dans listview

Bonsoir Byfrank, bonsoir à tous,

Ci-joint version modifiée.

Pour la recherche qui mélange les colonnes, tu ne peux pas à la fois utiliser un tableau de 1 à n dans une boucle et vouloir des résultats dans un ordre précis différent de celui du tableau. Dans ce cas, il faut mixer les 2 en utilisant une partie du tableau en boucle (ex de 2 à 7) puis mettre les autres éléments séparément.

Sinon, fais attention à l'ordre des With..End with et If...end If.

Dis-moi si c'est OK.

@+

Gael
 

Pièces jointes

  • ByFranck _V11.zip
    50.8 KB · Affichages: 72
Dernière édition:

Byfranck

XLDnaute Occasionnel
Re : Recherche d'occurence => décallage dans listview

Bonjour Gael,


Super: un vrai grand pas pour moi :)
Tu as raison je dois être plus méthodique avec mes End if, End with ... mais hier soir j'avais tellement fait d'esaais que je ne savais plus où j'en était ! :eek:

Je viens de tester et je pense que je vais garder la recherche du Bouton 1, elle est plus compréhensible pour moi si je dois faire des modif plus tard.
Par contre j'ai le problème d'affichage multiple d'un client:
La Listview met une ligne à chaque fois qu'il trouve l'expression recherchée (essai en recherchant " 3 " ) ... si tu savais comment régler ça .. ce serait cool

Il faut aussi que je comprenne autre chose car sur ma base quand je lance la recherche il aparait des clients qui n'ont pas de relation avec le mot recherché et dans la ligne il y a la valeur de la cellule colonne A et le reste de la ligne est vide (même prob avec les 2 boutons de recherche)

Merci dencore pour ton aide; c'est vraiment sympa.
Cordialement
Franck
 

Gael

XLDnaute Barbatruc
Re : Recherche d'occurence => décallage dans listview

Bonjour Byfranck, bonjour à tous,

Pour les lignes qui apparaissent plusieurs fois, j'ai ajouté une variable "Lastrow" et une ligne n'est créée dans la listview que si la ligne de recherche est différente de la précédente. Modif faite sur les 2 macros de recherche.

Pour la deuxième question, ce doit être un problème avec la base de données, si tu pouvais envoyer un exemple avec une partie de la base, je regarderai pourquoi.

Je pars en vacances demain, ne t'étonne pas si tu n'as plus aucune réponse de ma part d'ici la fin du mois ;)

@+

Gael
 

Pièces jointes

  • ByFranck _V12.zip
    51.7 KB · Affichages: 62

Byfranck

XLDnaute Occasionnel
Re : Recherche d'occurence => décallage dans listview

Re-bonjour gael,

Super le Lastrow fait des merveilles !! :)
Avec un peu de chance je vais t'attraper avant ton départ en vacances ..

Pour les lignes vides qui apparaissent dans la listview
Si tu n'a pas le temps ce n'est pas grave je continuerais à "fouiller" ... :eek:

Et de toutes façon je te souhaite de super vacances :)

Au cas où:
Ci-joint la même base rallongée: les problèmes apparaissent.

Je me demande si cela na pas un lien avec le fait que certaine cellules soient vide ?

Cordialement
Franck
 

Pièces jointes

  • ByFranck _V12bis.zip
    48.3 KB · Affichages: 113

Gael

XLDnaute Barbatruc
Re : Recherche d'occurence => décallage dans listview

Bonsoir Byfrank, bonsoir à tous,

En fait c'est le tri automatique qui pose problème. Lors de l'initialisation, tu as mis ".sorted=true" et cela reste valide pour la suite, donc lorsqu'un nouvel item est créé et qu'il n'est pas dans l'ordre, le tri s'effectue et perturbe le reste.

Il suffit de mettre le tri à "False" avant de créer la liste:

Code:
...
If T = "" Then Exit Sub
    [COLOR=red].Sorted = False
[/COLOR]    .FullRowSelect = True
...

@+

Gael
 

youky(BJ)

XLDnaute Barbatruc
Re : Recherche d'occurence => décallage dans listview

Bonsoir ByFranck,
Et moi comme un idiot je viens de refaire la macro recherche sans avoir vu tous les messages qui t'ont été adressés........
Ben...comme je l'ai bien simplifiée je te la joint tout de même pour tester
A+

Code:
'ICI C'est le Moteur de Recherche
Private Sub CommandButton1_Click()
Dim Plage As Range, C As Range
Dim T As String, Firstaddress As String
Dim x, k, lig As Integer
    ListView1.ListItems.Clear
    T = Me.TextBox1
    If T = "" Then Exit Sub
          With Feuil1
    Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(.Rows.Count, .Columns.Count)))
    Set C = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart)
 If Not C Is Nothing Then
                Firstaddress = C.Address
    Do
        If C.Row = lig Then GoTo boucle
        k = k + 1
             ListView1.ListItems.Add k, , .Cells(C.Row, 1)
          For x = 2 To 19
             ListView1.ListItems(k).SubItems(x - 1) = .Cells(C.Row, x)
          Next
        lig = C.Row
boucle:
        Set C = Plage.FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Firstaddress
 End If
   End With
End Sub
 

Byfranck

XLDnaute Occasionnel
Re : Recherche d'occurence => décallage dans listview

Bonsoir Byfrank, bonsoir à tous,

En fait c'est le tri automatique qui pose problème. Lors de l'initialisation, tu as mis ".sorted=true" et cela reste valide pour la suite, donc lorsqu'un nouvel item est créé et qu'il n'est pas dans l'ordre, le tri s'effectue et perturbe le reste.

Ok compris.
J'avais "par hasard" trouvé une solution en supprimant le pavé des .ListItems(x).ListSubItems.Add de l'intialisation.
Je vais d'ailleur laisser comme ça car à l'ouverture le temps de chargement est super long: 6663 lignes et 250 colonnes....
Tellement long que cela donne l'impression qu'on est planté.
Sans l'affichage à l'ouverture c'est plus agréable.

Gael merci pour ton aide précieuse, et très bonnes vacances ... :)

Youki(bj) ... je ne sais que te dire, en tout cas je vais tester ton code ... si j'ai des problèmes je te fais signe Merci quand même ;)

Cordialement
Merci à vous deux.
Franck
 
Dernière édition:

bqtr

XLDnaute Accro
Re : Recherche d'occurence => décallage dans listview

Bonsoir Byfranck, youky(BJ), Gael

Désolé Franck pour mon piètre SAV, mais depuis dimanche je n'ai pas eu trop de temps pour me connecter au forum.

Bonnes vacances Gael :)

A+
 

Discussions similaires

Réponses
19
Affichages
1 K
Réponses
8
Affichages
596

Statistiques des forums

Discussions
312 107
Messages
2 085 358
Membres
102 874
dernier inscrit
Petro2611