Comment afficher un retour à la ligne dans une textbox ?

Tout fonctionne parfaitement, je vous remercie beaucoup.

EDIT :

La fonction supprimer un élement ne fonctionne pas, c'est étrange.

L'élément est bien supprimé de la Listbox mais pas de la base ('BD')

Private Sub BSuppElement_Click()

If ListBox_body.ListIndex = -1 Then Exit Sub

If MsgBox("Voulez-vous supprimer cet élément ?", vbYesNo + vbDefaultButton2 + vbExclamation) = vbYes Then
    ' Suppression de la ligne contenant le client selectionné
    f.ListObjects(1).ListRows(ListBox_body.ListIndex + 1).Delete
    ListBox_body.RemoveItem (ListBox_body.ListIndex)

    MsgBox "Element supprimé", vbInformation, "Confirmation"
    Exit Sub
End If

MsgBox "Element non supprimé"
End Sub

et la mise à jour d'un élément réalise en fait un duplicate de l'élement dans la base ('BD') :

Private Sub BUpdate_Click()
Dim previous_checkbox_state As Integer

If ListBox_body.ListIndex = -1 Then
    MsgBox "Mise à jour impossible : pas de n° de ligne pour cet élement"
    Exit Sub
End If

previous_checkbox_state = 0

' si la checkbox à été préalablement selectionnée
If Me.CheckBox2 = True Then previous_checkbox_state = 1

Dim i As Byte

With f

    With .ListObjects(1)
        LRow = ListBox_body.ListIndex + 1
        .DataBodyRange(LRow, 1) = UCase(LTrim(Me.TextBox2))

        For i = 2 To 6
            .DataBodyRange(LRow, i) = LTrim(Me.Controls("TextBox" & i + 1))
        Next i

        'MsgBox "Mise à jour base de données effectuée", , "Update"
        Call MsgboxMajElement

        Me.ListBox_body.ListIndex = -1
        Me.ListBox_body.List = .DataBodyRange.Value 'mise à jour listbox_body
    End With

    Call effacer

    ' Retabli la case si celle-ci était cochée avant la sauvegarde de l'élément
    If previous_checkbox_state = 1 Then Me.CheckBox2 = True
End With

End Sub

L'élément est bien supprimé de la Listbox mais pas de la base ('BD')

Oui juste. Vous devez ajouter RANGE devant Delete. la ligne modifiée doit être comme ceci (rem :j'ai aussi modifié dans le post où je vous avais donné le code de suppression)

f.ListObjects(1).ListRows(ListBox_body.ListIndex + 1).Range.Delete

et la mise à jour d'un élément réalise en fait un duplicate de l'élement dans la base ('BD') :

Heu là non, refaite un test car dans le fichier que vous avez posté cela fonctionne

En fait le soucis lié à l'update est le suivant :

Lorsqu'aucun mot clef est recherché et que l'on selectionne une ligne dans la Listbox, LRow est renvoyé de bonne façon.

Ici, "CHIEN" avec le mot clef 1 :"bb" est effectivement positionné en ligne 6 dans la feuille de calcul ("BD")

sans mot clef

En revanche, si on effectue une recherche avec le mot clef "bb", la ligne "CHIEN" correspondante est bien trouvée, mais le LRow affiché est incorrect

Du coup, si on fait une mise à jour de cet élément cela va écraser la ligne 2 alors qu'il aurait fallu mettre à jour la ligne 6 .

avec mot clef

Je joints mon fichier.

Ok oui je vois.

Votre problème vient du faite que vous n'avez pas prévu de N° de ref pour chaque ligne. Ce qui se fait habituellement dans toute base de données...

Idée : Pourquoi ne pas ajouter la ref de ligne en première position dans la listbox ?

Oui, si c'est nécessaire pourquoi pas.

L'idéal serait l'indexation se fasse de façon automatisée lors qu'on ajoute un élément.

On est obligé de passer par ce procédé ?

On est obligé de passer par ce procédé ?
L'idéal serait l'indexation se fasse de façon automatisée lors qu'on ajoute un élément.

Oui on n'a pas le choix. Dans une base de données, c'est la ref article ou ligne dans votre cas qui sert pour repérer la ligne à utiliser
Cela se fera automatiquement en cas d'ajout.
Par rapport à votre dernier fichier posté, faites ces modifications :

1. Feuille BD
- Allez en G1 et ajoutez un titre (genre Ref ou autre)
- en G2, mettez cette formule --> =ligne()-1 (cela va remplir automatiquement la colonne pour chaque ligne du tableau)

2. USF - Code initialize : remplacez le code par celui ci-dessous

Private Sub UserForm_Initialize()
Dim i As Integer

Set f = Sheets("bd")

' Créer les headers dans une listbox header depuis Sheets("BD") ligne 2 :
Call CreateListBoxHeader(Me.ListBox_body, Me.ListBox_header, Array(f.Cells(1, "A"), f.Cells(1, "B"), f.Cells(1, "C"), f.Cells(1, "D"), f.Cells(1, "E"), f.Cells(1, "F")))
Call trier

With Me.ListBox_body
    .ColumnCount = 6
    .List = f.ListObjects(1).DataBodyRange.Value
End With
End Sub

3. USF - Code Private Sub Listbox_body_Click(), remplacez le code par celui-ci

Private Sub Listbox_body_Click()
Dim i As Byte, k As Integer

Me.LRow = vbNullString

On Error Resume Next
For i = 1 To 7
    Me.Controls("Textbox" & i + 1) = ListBox_body.List(ListBox_body.ListIndex, i - 1)
Next i

With Me
    .CheckBox1 = False
    .CheckBox2 = False
    With .ListBox_body
        For k = 0 To .ListCount - 1
            If .Selected(k) Then
                Me.LRow = .List(k, 6)
            End If
        Next k
    End With
End With
End Sub

4. USF - code Private Sub BUpdate_Click(), supprimez cette ligne

'LRow = ListBox_body.ListIndex + 1

NB : au dessus des codes Dim ligne recherchee et Dim SéparationDébut As String, Dim séparationfin ne servent plus.
Il y a aussi quelques variables non déclarées avec le mot Séparation.
Si vous voulez remettre de l'ordre, désactivez les trois puis mettez en première ligne --> Option Explicit
Cette instruction vous montrera ce qu'il manque à l'exécution des codes

Dites moi

Merci beaucoup, l'ajout d'un ID permet le bon fonctionnement des mises à jour / suppressions et créations d’éléments.

Juste une petite question d'ordre esthétique, est il possible de mettre de la couleur dans certaines colonnes de la Listbox, par exemple mot clef1 avec une police de caractère en vert, mot clef2 en bleu ?

Est il possible de faire apparaitre des lignes de séparation dans la Listbox ?

Juste une petite question d'ordre esthétique, est il possible de mettre de la couleur dans certaines colonnes de la Listbox, par exemple mot clef1 avec une police de caractère en vert, mot clef2 en bleu ?

C'est possible oui. Je dois changez le code initialize dans ce cas.

Est il possible de faire apparaitre des lignes de séparation dans la Listbox ?

Pas à ma connaissance. Il faut passer en listview et comme je vous ai écrit précédemment, il faut tout refaire dans les codes de l'USF

Dites moi déjà pour les couleurs si intérêt

L'ajout de couleur dans les colonnes serait un réel plus en effet.

La présence de lignes aussi mais si il faut tout reprendre alors ce sera déjà bien comme cela .

Bon je suis allé trop vite pour répondre. Les couleurs dans la Listbox c'est en fait tout ou rien.

je m'étais basé sur un autre projet mais il s'agit d'une Listview et pas d'une listbox.

Si vous voulez voir allez dans ce fil --> https://forum.excel-pratique.com/excel/affichage-listview-et-interraction-166869

Suffit de charger le fichier, ouvrir l'USF Listedemande et placer le code Actualisation que j'ai mis dans le post suivant
Ensuite lancez le code d'ouverture de l'USF

Quid ?

J'ai essayé le migrer le code existant fonctionnant en Listbox vers un userform en Listview mais je n'y parviens pas.

Pouvez vous me m'indiquer les modifications à effectuer pour pouvoir afficher en couleur, je me rends compte qu'un classement par mot clef avec des couleurs dédiées serait un réel plus pour l'utilisation.

J'ai essayé le migrer le code existant fonctionnant en Listbox vers un userform en Listview mais je n'y parviens pas.

Il faut repartir presqu'à zéro. Je vous donne les premières indications en supposant que vous avez dessiné votre listview

1. Supprimez la listbox --> "ListBox_header"
2. Supprimez le module --> "module_listboxheaders"
3. Pour les DIM en dessous d'option explicit, désactivez tout sauf la déclaration DIm F as worksheet et Dim choix()
4. Remplacez la macro Initialize par ceci (NB : la listview est nommé Listview1 - Laissez ce nom pour l'instant ce sera plus facile pour la suite)

Private Sub UserForm_Initialize()
Dim i As Integer
Dim rng As ListObject
Dim tbltmp()
Dim ncol As Byte, j As Byte

Set f = Sheets("bd")

Call trier

With Me.ListView1
    .ColumnHeaders.Add Text:="Titre", Width:=60
    .ColumnHeaders.Add Text:="Mot clef1", Width:=60
    .ColumnHeaders.Add Text:="Mot Clef2", Width:=50
    .ColumnHeaders.Add Text:="R", Width:=50
    .ColumnHeaders.Add Text:="Chemin", Width:=50
    .ColumnHeaders.Add Text:="Information", Width:=300
    .ColumnHeaders.Add Text:="ligne", Width:=0

    .Gridlines = True 'Affiche les lignes
    .View = lvwReport 'Style d'affichage
    .FullRowSelect = True 'Selectionner une ligne possible avec colorisation
    .Sorted = True 'liste triée

    Set rng = f.ListObjects(1)
    tbltmp = rng.DataBodyRange.Value
    ncol = rng.ListColumns.Count

    For i = 1 To UBound(tbltmp)
        .ListItems.Add , , tbltmp(i, 1)
        For j = 2 To ncol
            .ListItems(i).ListSubItems.Add , , tbltmp(i, j)
            Select Case j
                Case Is = 2: .ListItems(i).ListSubItems(1).ForeColor = vbRed
                Case Is = 3: .ListItems(i).ListSubItems(2).ForeColor = vbGreen
            End Select
        Next j
    Next i
End With
End Sub

Faites un test


edit : code Listview_Click

Private Sub ListView1_Click()
Dim i As Byte

With Me
    .LRow = vbNullString
    .TextBox2 = Me.ListView1.SelectedItem.Text '(1iere colonne)

    On Error Resume Next
    For i = 2 To 7
        Me.Controls("Textbox" & i + 1) = ListView1.SelectedItem.ListSubItems(i - 1)
    Next i
    On Error GoTo 0

    .CheckBox1 = False
    .CheckBox2 = False
    .LRow = .ListView1.SelectedItem.ListSubItems(6).Text
End With
End Sub

J'ai ajouté la Listview1 avec les codes dans le userform et retiré la Listbox.

Une erreur 'variable non définie' pointe sur la ligne suivante :

.View = lvwReport 'Style d'affichage

Une erreur 'variable non définie' pointe sur la ligne suivante :

Le message ne concerne pas la ligne que vous renseignez.
Cela concerne une variable à moins que vous ayez défini "lvwreport" dans une instruction Dim lvwreport as ...

Vérifiez que vous avez bien suivi point par point mes explications dans mon post précédent.

Je n'arrive pas du tout à comprendre d’où vient le problème, lorsque je commente la ligne

.View = lvwReport 'Style d'affichage

le code poursuit mais avec d'autres erreurs ensuite que je ne sais pas résoudre.

Puis je vous demander de regarder mon fichier svp ?

Ok j'ai vu.
En fait il vous manque l'option que l'on trouve dans l'éditeur VBA --> menu Outils --> références : "Micrsoft Common Controls sp6"

Pour faire simple dans l'installation de cette option,
- dans la ligne à souci supprimez = lvwreport
- retaper le = (cela va afficher la liste des possibilités)
- dans la liste choisissez "lvwReport" --> cela va vous afficher un message disant qu'il vous manque une option dans la librairie et vous demande si vous voulez l'ajouter --> Cliquez sur OK

Relancez votre USF

J'ai réussi ajouter le composant manquant : "Micrsoft Common Controls sp6"

Outils -> Reférences : C:\Windows\SysWOW64\MSCOMCTL.OCX

La Listview s'affiche mais ne fonctionne pas, plusieurs lignes vides sont affichées et lorsqu'on choisi une ligne dans la Listbox, rien ne se passe.

La Listview s'affiche mais ne fonctionne pas, plusieurs lignes vides sont affichées....

Oui mais dans votre dernier fichier vous avez changé l'ordre des colonnes donc logique votre souci car ce que je vous ai donné (ici --> https://forum.excel-pratique.com/s/goto/1138566) suppose que votre ID est en colonne G et non en colonne A. Il faut modifier votre feuille. Si vous voulez changer bah faut à nouveau refaire le code

Dites moi

Le fichier que j'aimerai prendre en référence serait sur le modèle de celui posté ce matin.

Voici le dernier fichier que j'ai modifié pour essayer de faire fonctionner la Listview

L'ID : colonne A

Titre : colonne B

Mot Clef_1 : colonne C

Mot Clef_2 : colonne D

Mot Clef_3 : colonne E

Chemin : colonne F

Information : colonne G

--

Dans ce fichier, j'ai rajouté un bouton ENREGISTRER pour sauvegarder le fichier EXCEL sans avoir a quitter le formulaire ( éviter de fermer et clique sur Fichier -> Enregistrer "

Par contre, la macro d'enregistrement du fichier ne semble pas fonctionner à l'intérieur de formulaire, est ce normal ?

--

Est il facile avec une Listview et un bouton paramétrable de créer des filtres prédéfinis ?

Par exemple afficher en 1 clic l'ensemble des lignes qui contiendraient un mot clef présent dans Mot_Clef_1

L'utilisateur nomme un bouton du formulaire , il l'appelle 'CHAT' => le titre du bouton s'affiche alors comme 'CHAT'

lorsqu'on clique dessus , la Listview affiche l'ensemble des lignes contenant le mot clef 'CHAT' dans la colonne Mot Clef_1 ?

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