Comment afficher un retour à la ligne dans une textbox ?

Bonjour,

J'ai modifié le code comme suggéré.

L'affichage est donnée dans la Listview fonctionne parfaitement , merci beaucoup.

Quelles seraient les modifications à apporter dans les autres macros ?

Bonjour,

Déjà supprimez les codes qui reprennent la réference listbox_body. Ensuite dites-moi s'il manque quelque chose

Je regarderai

Crdlt

Bonjour,

Pour un nouveau besoin, je cherche a adapter ce code permettant de faire des recherches dans une feuille de calcul.

Ma feuille "BD" contient plus de 500 lignes, du coup la recherche prend mal de temps et les résultats tardent à arriver dans la listview

Comment puis modifier cette ligne ?

ligne = rng.ListRows(i).Range.Find(TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart).Row - 1

Afin que la recherche du mot clef entré dans Textbox1 soit recherché uniquement dans les colonnes A, C et R de "BD" ?

j'ai essayé ceci, mais ça ne fonctionne pas bien, les résultats obtenus ne sont pas cohérents :

Set rngSearch = Union(rng.ListRows(i).Range.Offset(2, 0).Columns("A:A"), _
rng.ListRows(i).Range.Offset(2, 2).Columns("C:C"), _
rng.ListRows(i).Range.Offset(2, 5).Columns("R:R"))

ligne = rngSearch.Find(TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart).Row - 1

Voici mon fichier

Bonjour

Le tout est de d'abord savoir si la sélection que vous mettez dans la textbox doit se faire dans toute la base BDD ou non
de base c'est ce que ce que faisait ce que je vous avais proposé.

Important :
1. Au vu de changement que vous avez fait, un premier point est de supprimer la variable j dans tous les codes car vous avez supprimé la boucle For j = 2 To ncol ... dans le code remplir. Vérifiez bien car cette variable est un peu partout
2. Les variables Dim ncol As Byte, Dim SeparationFin As String et Dim SeparationEnTete As String, ne servent à rien. Vous pouvez les supprimer


Pour répondre à ce que vous demandez, vous pouvez toujours tester ce code en lieu et place

Private Sub TextBox1_Change()
Dim i As Integer
Dim li As ListItem
Dim c As Range
Dim prem

ListView1.ListItems.Clear

Set c = rng.DataBodyRange.Find(TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)
If Not c Is Nothing Then
    prem = c.Address
    Do
        i = c.Row - rng.HeaderRowRange.Row
        Call remplir(i, li)
        Set c = rng.Range.FindNext(c)
    Loop While Not c Is Nothing And c.Address <> prem
End If
End Sub

Rem : il faut aussi que vous vous rendiez compte que le code précédent et celui proposé, cherche des infos dans votre feuille BD qui contient +/- 30000 cellules...

Au point : je ne vois pas pourquoi vous mettez des numéros de colonne en ligne 1 de votre feuille BD. SI vous voulez voir le numéro de colonnes, il vous suffit d'aller dans les options d'excel via menu Fichier --> Options--> formule et aller cocher la case "reference L1C1".
Après vous pouvez supprimer la ligne 1.

Le code que vous me proposez effectue une recherche dans l'ensemble des colonnes de "BD" n'est ce pas ?

De mon coté j'avais modifié le code initial pour restreindre la recherche à 3 colonnes seulement, ça fonctionne mais je n'ai pas rapide donc je pense que ça pourrait peut être s'optimiser ?

avec ce code on utilise toujours "tbltmp"

Private Sub Textbox1_Change()

    Dim ligne As Integer, i As Integer
    Dim li As ListItem
    Dim rngSearch As Range
    Dim nombreResultats As Integer

    ListView1.ListItems.Clear

    If TSearch.Value = vbNullString Then
        For i = 1 To UBound(tbltmp)
            Call remplir(i, li, tbltmp)
        Next i
        Exit Sub
    End If

    For i = 1 To UBound(tbltmp)
        On Error Resume Next

        ' Chercher dans les colonnes A, R , B
        Set rngSearch = Union(rng.ListRows(i).Range.Columns("A:A"), _
                              rng.ListRows(i).Range.Columns("R:R"), _
                              rng.ListRows(i).Range.Columns("B:B")))

        ligne = rngSearch.Find(TSearch.Value, LookIn:=xlValues, LookAt:=xlPart).Row - 1

        On Error GoTo 0

        If ligne > 0 Then
            'Call remplir(i, li, j, tbltmp)
            Call remplir(i, li, tbltmp)
            ligne = 0
        End If

    Next i

    ' Si il n'y a qu'un seul résultat affiché dans listview1 alors on le sélectionne

    nombreResultats = Me.ListView1.ListItems.Count

    If nombreResultats = 1 Then

        ListView1.FullRowSelect = True
        ListView1.ListItems(1).Selected = True
        ListView1.SetFocus

        ligne_BD = ListView1.selectedItem.Text

    End If
End Sub

Le code que vous me proposez effectue une recherche dans l'ensemble des colonnes de "BD" n'est ce pas ?

Oui exact.

De mon coté j'avais modifié le code initial pour restreindre la recherche à 3 colonnes seulement, ça fonctionne mais je n'ai pas rapide donc je pense que ça pourrait peut être s'optimiser ?

Dans votre fichier c'était désactivé et vous n'avez pas précisé l'utilisation de 3 colonnes

Que dois-je faire ?
Tsearch c'est quoi dans votre projet ?

TSearch c'est en fait Textbox1 renommée.

J'aurai bien aimé optimiser Textbox1_change pour permettre une recherche restrictive dans 3 colonnes seulement : A, R et B dans la feuille "BD"

J'aurai bien aimé optimiser Textbox1_change pour permettre une recherche restrictive dans 3 colonnes seulement : A, R et B dans la feuille "BD"

Avec votre dernier code posté cela le fait non ?

Ce code fonctionne oui, mais il n'est pas rapide .

est ce qu'il pourrait être optimisé ?

Dans votre code Tsearch c'est quoi ?

Je ne trouve pas cela dans votre fichier

Non, c'est juste que j'avais renomné Textbox1 en TSearch, pour être plus parlant mais on peut rester sur Textbox1

Ok mais là dans ce lien https://forum.excel-pratique.com/s/goto/1179128 vous écrivez que cela fonctionne mais là votre première ligne mentionne Textbox1_change et votre textbox est nommée Textbox1, donc le code mentionné comme cela ne donnera rien du tout.
Si vous utilisez Tsearch, mettez le partout dans ce code y compris sur la première ligne et votre textbox doit être nommée Tsearch aussi.

Dans l'ensemble c'est bon Essayez le code comme ceci :

Private Sub Textbox1_Change()
Dim ligne As Integer, i As Integer
Dim li As ListItem
Dim rngSearch As Range

Application.ScreenUpdating = False
ListView1.ListItems.Clear

If Textbox1.Value = vbNullString Then
    For i = 1 To UBound(tbltmp)
        Call remplir(i, li)
    Next i
    Exit Sub
End If

Set rngSearch = Union(rng.ListColumns(1).DataBodyRange, rng.ListColumns(2).DataBodyRange, rng.ListColumns(18).DataBodyRange)

For i = 1 To UBound(tbltmp)
    On Error Resume Next
    ligne = rngSearch.Find(Textbox1.Value, LookIn:=xlValues, LookAt:=xlPart).Row - 2
    On Error GoTo 0

    If ligne > 0 Then
        Call remplir(i, li)
        ligne = 0
    End If
Next i

' Si il n'y a qu'un seul résultat affiché dans listview1 alors on le sélectionne
With ListView1
    If .ListItems.Count = 1 Then
        .FullRowSelect = True
        .ListItems(1).Selected = True
        .SetFocus
    End If
End With
Application.ScreenUpdating = True
End Sub

J'ai déplacé notamment la ligne set rngsearch avant la boucle For i =..... inutile de redéfinir la plage à chaque variation de i

Le code me semble plus rapide mais bon garder en mémoire que vous cherchez toujours la donnée de votre textbox sur 3 colonnes à chaque ligne.
Avec Excel la rapidité diminue dans ce cas.

Merci beaucoup

Il y a quelquechose de curieux que je n'explique pas :

Parfois, lorsqu'on rempli Textbox1 pour faire une recherche, il y a des temps en temps l'erreur "indice n'appartient pas à la selection" sur cette ligne :

Set rngSearch = Union(rng.ListColumns(1).DataBodyRange, rng.ListColumns(2).DataBodyRange,

Bonjour

Parfois, lorsqu'on rempli Textbox1 pour faire une recherche, il y a des temps en temps l'erreur "indice n'appartient pas à la selection" sur cette ligne :

Vous pouvez déjà déplacer le ON ERROR RESUME NEXT qui se trouve dans la boucle FOR i =... et mettez-le juste avant la ligne --> Set rngsearch

Sinon le mieux serait que vous me donniez un exemple de ce que vous mettez dans la textbox lorsque vous avez cette erreur

Ca fonctionne à présent.

Pour améliorer la visibilité du tableau Listview1, j'aimerai bien que lorsque l'on clique sur une ligne , l'ensemble des colonnes passent en rouge ( je voulais dans un premier temps surligner la ligne sélectionné dans listview1 mais apparemment on ne peut pas en VBA Excel)

Pour passer chaque colonne de la ligne sélectionné en rouge, j'ai adapté Listview1_click() comme ceci mais ça ne fonctionne pas, pourriez vous me dire pourquoi svp ?

Quand on clique sur une ligne, celle - ci passe en rouge mais les autres lignes ne reprennent pas les couleurs prédéfinies .

Si il y a beaucoup de choix proposés dans listview1, ça peut même faire planter excel.

Private Sub ListView1_Click()
Dim i As Byte
Dim li As ListItem
Dim k As Byte

With Me

If .ListView1.ListItems.Count = 0 Then
    Exit Sub
End If

.LRow = vbNullString

On Error Resume Next

For i = 2 To 7
    Me.Controls("Textbox" & i) = ListView1.SelectedItem.ListSubItems(i - 1)
Next i

' Passe l'ensemble des colonnes des lignes affichées dans des couleurs prédéfinies
For k = .ListView1.SelectedItem.Index To .ListView1.ListItems.Count
.ListView1.ListItems(k).ListSubItems(1).ForeColor = RGB(0, 0, 128) ' Couleur bleu foncé
.ListView1.ListItems(k).ListSubItems(2).ForeColor = RGB(0, 0, 128) ' Couleur bleu foncé
.ListView1.ListItems(k).ListSubItems(3).ForeColor = RGB(0, 0, 128) ' Couleur vert foncé
.ListView1.ListItems(k).ListSubItems(4).ForeColor = vbYellow        ' Couleur jaune
.ListView1.ListItems(k).ListSubItems(5).ForeColor = vbBlack         ' Couleur noir
.ListView1.ListItems(k).ListSubItems(6).ForeColor = vbBlue          ' Couleur bleu
Next k

' Applique sur chaque colonne de la ligne sélectionné la couleur ROUGE
For i = 1 To .ListView1.ListItems(.ListView1.SelectedItem.Index).ListSubItems.Count
.ListView1.ListItems(.ListView1.SelectedItem.Index).ListSubItems(i).ForeColor = RGB(255, 0, 0) ' Red color
Next i

On Error GoTo 0
.LRow = .ListView1.SelectedItem.Text

End With
End Sub

Pour passer chaque colonne de la ligne sélectionné en rouge, j'ai adapté Listview1_click() comme ceci mais ça ne fonctionne pas, pourriez vous me dire pourquoi svp ?

Mais pourquoi voulez-vous passer en rouge à la sélection ?. Par défaut excel colorise la ligne sélectionnée en bleue, pourquoi vouloir changer la couleur ?
Je ne vois pas en quoi le fait de mettre en rouge au lieu de bleu, va améliorer la visibilité et de plus, ce sont des lignes de code à rajouter qui n'améliore pas la rapidité

Pour les colonnes, au départ vous mettez tout en bleu et jaune et là vous voulez changez à la sélection.
Alors je dirais que cela ne sert à rien de mettre des colonnes en couleur à l'ouverture prévue dans le code "Remplir"
Dites-vous bien qu'à chaque fois que vous allez cliquer sur une nouvelle ligne, il va falloir remettre les couleurs de la ligne précédente à leur couleur de base (bleu, jaune...), puis mettre les couleurs que vous demandez sur la ligne sélectionner.

Ne compliquez pas trop sans quoi votre fichier deviendra une "usine à gaz". Restez simple

Edit :

Un point essentiel est de savoir si vous voulez mettre en rouge chaque sélection que vous effectuez et la conserver. Genre de multisélection dont la couleur serait rouge

Je cherche une façon simple de mettre en valeur la ligne sélectionnée dans listview1 afin qu'elle se différencie des autres éléments affichés.

lorsqu'on selectionne une ligne, j'arrive à passer chaque colonne de celle-ci en rouge mais si ensuite je selectionne une autre ligne dans listview1, alors la ligne qui a été selectionné dans un premier temps reste rouge, du coup si plusieurs clic dans listview1 sont effectué, le tableau se rempli bien vite en rouge.

je voudrai que seule la ligne selectionnée soit rouge ou présente un visuel différent des autres lignes affichées.

Je cherche une façon simple de mettre en valeur la ligne sélectionnée dans listview1 afin qu'elle se différencie des autres éléments affichés.

La ligne sélectionnée est toujours en bleu avec police en blanc. C'est de base une fonction d'excel
Via code, la couleur rouge n'apparait que si vous sélectionnez une autre ligne

presse papier02

Ou je comprends pas ce que vous voulez ??? mais là, la sélectionnée en bleu, cela me parait clair

Rechercher des sujets similaires à "comment afficher retour ligne textbox"