Comment afficher un retour à la ligne dans une textbox ?
1. Mais pourquoi laissez-vous la listbox_body ?? c'est à supprimer
2. dans la listview, est-ce que vous voulez voir l'ID ou pas ?
3.
Par contre, la macro d'enregistrement du fichier ne semble pas fonctionner à l'intérieur de formulaire, est ce normal ?
je vous ai écrit qu'il faut tout revoir.
4. Question : est-ce votre dernier fichier est le bon ?
NB : Ne me repostez pas de fichier
Oui.
4. Question : est-ce votre dernier fichier est le bon ?
Oui.
Merci
A. Dans le code Intialize,
1. déplacez la ligne ci-dessous et mettez là juste en dessous de With Me.listview1
.ColumnHeaders.Add Text:="ligne", Width:=02. Toujours dans cette ligne, remplacez le 0 par 20
3. dans la ligne ci-dessous
.ColumnHeaders.Add Text:="R", Width:=50Remplacez le "R" par "Mot Clef 3"
B. code Listview1_Click : remplacez-le par celui ci-après
Private Sub ListView1_Click()
Dim i As Byte
With Me
.LRow = vbNullString
On Error Resume Next
For i = 2 To 7
Me.Controls("Textbox" & i) = ListView1.SelectedItem.ListSubItems(i - 1)
Next i
On Error GoTo 0
'.CheckBox1 = False
.CheckBox2 = False
.LRow = .ListView1.SelectedItem.Text
End With
End SubNB :J'ai laissé la ligne Lrow mais je pense que vous n'aurez plus besoin de votre information LRow puisque cela correspond à l'ID de la ligne choisie dans la listview
C. Quid de ma question au point 1. si vous utilisez la listview, vous devez supprimer la listbox
La Listview s'affiche bien à présent, cependant elle affiche constamment l'intégralité de la liste de la Feuille ('BD')
Si je supprime la Listbox_body, on a une erreur car elle est appelée par :
Private Sub TextBox1_Change()
Me.ListBox_body.List = rng.ValueLa Listview s'affiche bien à présent, cependant elle affiche constamment l'intégralité de la liste de la Feuille ('BD')
Non du tout. C'est juste que vous avez l'impression à cause des lignes vide mais c'est juste le graphisme de la listview. Essayez de cliquer dans une ligne vide....
Si je supprime la Listbox_body, on a une erreur car elle est appelée par :
Rappelez vous que je vous ai écrit que l'on devrait changer les codes. Cela concerne aussi le code de la textbox1. Donc supprimez cette listbox_body
Je reviens pour vous donner un nouveau code Private Sub TextBox1_Change()
Pour raison de simplicité, je vous propose de repartir du dernier fichier que vous avez posté et éventuellement de supprimer toutes les macros dans l'USF
Faites en premier les modifications ci-dessous :
1. En premières lignes de l'USF, mettez ces lignes
Option Explicit
Dim rng As ListObject
Dim tbltmp()
Dim f As Worksheet
Dim ncol As Byte
Dim SeparationFin As String
Dim SeparationEnTete As StringNB : enlevez les accents dans Séparation, la ponctuation avec VBA est à éviter
2. Code Initialize
Private Sub UserForm_Initialize()
Dim i As Integer
Dim j As Byte
Dim li As ListItem
Set f = Sheets("bd")
Call trier
With Me.ListView1
With .ColumnHeaders
.Add Text:="ligne", Width:=20
.Add Text:="Titre", Width:=60
.Add Text:="Mot clef1", Width:=60
.Add Text:="Mot Clef2", Width:=50
.Add Text:="Mot Clef3", Width:=50
.Add Text:="Chemin", Width:=50
.Add Text:="Information", Width:=300
End With
.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)
Call remplir(i, li, j)
Next i
End With
End Sub3. Ajouter ce code en dessous du code Intialize
Private Sub remplir(i As Integer, li As ListItem, j As Byte)
With ListView1
Set li = .ListItems.Add(, , tbltmp(i, 1))
For j = 2 To ncol
li.ListSubItems.Add , , tbltmp(i, j)
Select Case j
Case Is = 3: li.ListSubItems(2).ForeColor = vbRed
Case Is = 4: li.ListSubItems(3).ForeColor = vbGreen
End Select
Next j
End With
End Sub4. les codes Private Sub ListView1_Click() et Effacer peuvent rester tel que proposés avant
5. Code Textbox1_change
Private Sub TextBox1_Change()
Dim ligne As Integer, i As Integer
Dim j As Byte
Dim li As ListItem
ListView1.ListItems.Clear
If TextBox1.Value = vbNullString Then
For i = 1 To UBound(tbltmp)
Call remplir(i, li, j)
Next i
Exit Sub
End If
For i = 1 To UBound(tbltmp)
On Error Resume Next
ligne = rng.ListRows(i).Range.Find(TextBox1.Value, LookIn:=xlValues, lookat:=xlPart).Row - 1
If ligne > 0 Then
On Error GoTo 0
Call remplir(i, li, j)
ligne = 0
End If
Next i
End SubFaites un test pour voir si ok sur ces points là
Je sais que c'est un peu long mais pour que vous compreniez, je pense préférable de vous mettre les instructions pas à pas pour que vous fassiez par vous même plutot que de vous poster un fichier sans plus ni moins.
Si vous n'y voyez pas d'intérêt, dites moi. Il n'y a pas de soucis
Merci, pas à pas c'est bien pour comprendre en effet.
Le code fonctionne bien pour les recherches tapées depuis textbox1, la Listview se met à jour correctement.
Par contre on a maintenant une erreur de variable non définie avec :
Private Sub TextBox7_change()
If Me.CheckBox2 = False Then TextBoxResultat = UCase(LTrim(TextBox2)) & Chr(13) & Chr(10) & Chr(13) & Chr(10) & TextBox7
If Me.CheckBox2 = True Then TextBoxResultat = UCase(LTrim(TextBox2)) & Chr(13) & Chr(10) & Chr(13) & Chr(10) & TextBox7 & Chr(13) & Chr(10) & Chr(13) & Chr(10) & SéparationFin
End SubPar contre on a maintenant une erreur de variable non définie avec :
Hum... vous ne lisez pas bien ce que j'écris... La réponse se trouve au point 1 de mon post précédent
J'avais bien ajouté les déclaration en début de code ,
Ca fonctionne très bien en fait, c'est top.
Le soucis venait juste du fait que la variable 'Separationfin' est appelée dans le reste du code avec un accent sur le 'é' et elle était déclaré sans accent.
Merci beaucoup pour les explications car je ne connais pas du tout le concept des Listview.
---
Sauriez vous me si il est possible d'ajouter boutons avec des libellés personnalisables , qui en fonction de ce libellé permettrait de lancer une recherche dans textbox1 avec le mot clef du libellé ?
Une sorte de recherche immédiate personnalisable , cette fonctionnalité me ferait gagner pas mal de temps si j'arrive à l'ajouter au code existant.
Utiliser le libellé d'un bouton et l'utiliser pour une recherche me semble faisable, mais je ne sais pas si il est possible depuis un userform de modifier aisément le libellé d'un bouton sans avoir a éditer le code VBA.
Le soucis venait juste du fait que la variable 'Separationfin' est appelée dans le reste du code avec un accent sur le 'é' et elle était déclaré sans accent.
Oui je sais, c'était pour vous éviter une erreur que j'avais mentionné une remarque dans le point 1
Sauriez vous me si il est possible d'ajouter boutons avec des libellés personnalisables , qui en fonction de ce libellé permettrait de lancer une recherche dans textbox1 avec le mot clef du libellé ?
Oui c'est possible mais combien de bouton et quel libellé ? Cependant à chaque bouton vous aurez un code différent... Cela pourrait devenir compliqué...
Plus simple serait d'ajouter une Combobox avec la liste des mots clefs et selon le choix, cela remplirait la textbox1... à voir si intérêt ou si vous préférez un bouton par mot clef.
Bonjour
Je me permets de reposer une question sur le fichier Listview :
Si je vide totalement la base de son contenu (onglet BD) et que j’essaie d'ajouter de nouvelles informations par le biais du formulaire, l'ID n'est pas incrémenté et ajouté dans la 1ere colonne ce qui génère une erreur.
On dirait que si le tableau (BD) le code de recherche et d'ajout d'informations ne fonctionne plus.
Pouvez vous m'indiquer d'ou vient le problème svp ?
Merci beaucoup
Bonjour
Je vous avais donné la solution ici --> https://forum.excel-pratique.com/s/goto/1138566 mais pour la cellule G2 car initialement l'ID était en G. Donc à refaire pour A2
Si je vide totalement la base de son contenu (onglet BD) et que j’essaie d'ajouter de nouvelles informations par le biais du formulaire, l'ID n'est pas incrémenté et ajouté dans la 1ere colonne ce qui génère une erreur.
La question est de d'abord savoir comment vous videz la base parce là dans votre feuille BD, la formule n'est pas en A2. Dites-moi
Merci pour le rappel,
En effet, pour vider j'ai manuellement sélectionné l'ensemble des lignes du tableau à partir de la ligne 2 puis clic droit et supprimer.
Du coup, la formule =ligne()-1 en A2 avait disparue.
Il faudrait que je créé un bouton pour effacer toute la base de bonne façon avec une macro.
Pour que le code fonctionne , il faut au moins en A2 la formule que vous avez rappelé.
Par contre lorsqu'on ajouter un élement dans la base, la listview n'affiche pas les données correctement, il a une sorte de doublons dans la liste d'affichage
c'est uniquement lorsqu'on tape une recherche dans textbox2 que l'affichage redevient correct.
Par exemple si BD est vide avec uniquement en A2 la formule =ligne()-1, on a ceci :
On ajoute un élément appelé TEST , l'affichage devient ainsi :
On tape une recherche , l'affichage redevient correct :
En effet, pour vider j'ai manuellement sélectionné l'ensemble des lignes du tableau à partir de la ligne 2 puis clic droit et supprimer.
Du coup, la formule =ligne()-1 en A2 avait disparue.
Déjà là je pense que vous avez sélectionné l'entièreté de chaque ligne de votre feuille et pas seulement les lignes concernées par la tableau. Sans quoi dans l'option Supprimer vous auriez eu l'option "ligne de tableau"
Pour que le code fonctionne , il faut au moins en A2 la formule que vous avez rappelé.
Par contre lorsqu'on ajouter un élement dans la base, la listview n'affiche pas les données correctement, il a une sorte de doublons dans la liste d'affichage
Non vous n'avez pas de doublons si rien n'est enregistré dans la feuille.
Je pense que vous vous y prenez mal. Du coup je vous réexplique. Merci de suivre pas à pas sans sauter une étape
1. Mettez la formule en A2 comme indiqué. Si vous avez plusieurs lignes actuellement la formule va être recopiée automatiquement dans les autres lignes.
2. Sélectionnez A2 à Gx (x étant la dernière ligne du tableau)
3. Faites un click droite puis choisissez "Supprimer" --> "Lignes de tableau" (Important !! vous devez absolument voir "ligne de tableau"). Là vous ne verrez plus la formule en A2 et donc pas de chiffre 1.
4. Ouvrez votre USF. La listview sera vide
5. Ajoutez un élement puis cliquez sur le bouton Ajouter comme élément
La feuille Base sera complétée et la listview fera apparaitre la donnée enregistrée
Dites moi
Pour supprimer les données de votre feuille BD, ajoutez ces lignes de code au bouton que vous aller créer dans l'USF
With ThisWorkbook.Sheets("BD").ListObjects(1)
On Error Resume Next
.DataBodyRange.Delete
On Error GoTo 0
End WithJ'ai suivi les étapes proposées, seulement lorsque le tableau est vide et que j'ouvre le userform, j'ai une erreur d'execution '91'
J'ai aussi remarqué que mon bouton ENREGISTRER pour sauvegarder le fichier en cours n'avait pas d'effet.
J'ai suivi les étapes proposées, seulement lorsque le tableau est vide et que j'ouvre le userform, j'ai une erreur d'execution '91'
Dans le code Private sub initialize, juste en dessous de la ligne Set rng = f.ListObjects(1), ajoutez cette ligne
On Error Resume NextAvec l'ajout de cette ligne, il n'y a plus d'erreur c'est bon.
Par contre si on ajoute un élement et qu'ensuite on cherche à l'éditer pour le modifier, le code renvoyer le message d'alerte d'une message box indiquant :
" Mise à jour impossible : pas de numéro de ligne pour cet élément"
Si par contre on ajoute un second nouvel élement, la listview fait apparaitre des doublons , pour ré-initialiser la vue de la listview il faut taper un caractère dans la textbox de recherche puis effacer ce caractère, le refresh de la vue de la listview devient alors correct.
BOnjour
Par contre si on ajoute un élement et qu'ensuite on cherche à l'éditer pour le modifier, le code renvoyer le message d'alerte d'une message box indiquant :
" Mise à jour impossible : pas de numéro de ligne pour cet élément"
Bah oui c'est normal puisque vous passer en Listview. Il faut refaire chaque code. Tous les codes où est mentionné Listbox_body ne sont plus d'actualité.
Et vous devez supprimer la listbox_Body de votre USF aussi
Pour le code modification, je suppose que le bouton utilisé est "mise à jour élément". Si oui, remplacez le code ci-dessous
Private Sub BUpdate_Click()
Dim previous_checkbox_state As Integer
If LRow = vbNullString Then
MsgBox "Mise à jour impossible : pas de ligne sélectionnée dans la liste"
Exit Sub
End If
' si la checkbox à été préalablement selectionnée
If Me.CheckBox2 = True Then previous_checkbox_state = 1
Dim i As Integer
Dim j As Byte
Dim li As ListItem
' Mise à jour de ('BD') grace à DataBodyRange avec le contenu des textboxes
With f.ListObjects(1)
.DataBodyRange(LRow, 2) = UCase(LTrim(Me.TextBox2))
For i = 3 To 7 ' i = textboxes de 3 à 7
.DataBodyRange(LRow, i) = LTrim(Me.Controls("TextBox" & i))
Next i
Call trier
Call MsgboxMajElement 'MsgBox "Mise à jour base de données effectuée", , "Update"
ListView1.ListItems.Clear
tbltmp = rng.DataBodyRange.Value
For i = 1 To UBound(tbltmp)
Call remplir(i, li, j)
Next i
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 SubBonjour et merci à vous,
Avec la modif apportée, il y a toujours une duplication d'éléments précédents qui se fait dans la Listview dès que l'on ajoute un nouvel élément.
Pour obtenir un affichage cohérent de la Listview, il faut taper un caractère dans la textbox1 puis l'efface, à ce moment là se refraichi l'affichage et les données présentes sont bien les bonnes.
Avec la modif apportée, il y a toujours une duplication d'éléments précédents qui se fait dans la Listview dès que l'on ajoute un nouvel élément.
Logique puisque vous relancez chaque fois la sub initialize sans vider la listview
Modifiez ceci dans la Private Sub BCreerElement_Click() :
1. Remplacez Dim i as byte par
Dim i As Integer2. Entre les instructions Call Trier et Call Effacer, mettez ces lignes de code
Dim li As ListItem
Dim j As Byte
ListView1.ListItems.Clear
tbltmp = rng.DataBodyRange.Value
For i = 1 To UBound(tbltmp)
Call remplir(i, li, j)
Next i3. A la fin du code, supprimer l'instruction --> Call UserForm_Initialize
4. Déplacez l'instruction MsgboxCreationNouvelElement et mettez là juste avant l'instruction Call effacer
5. A la fin juste en dessous du ELSE, supprimez l'instruction EXIT SUB
Rem : Il y aura d'autres macro à modifier, raison pour laquelle je vous écrivais de supprimer tout ce qui est listbox_body
Ne me repostez pas votre fichier, j'ai votre fichier sur lequel je travaille