LISTVIEW Ajouter Modifier Supprimer

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Bonjour le Forum, Bebere, Fo_rum,

Je suis en train de finaliser ce fichier. Et mince, en faisant des testes, j'ai aperçu que le listview ne fonctionne pas correctement.

Je m'explique.

pour afficher une catégorie, on fait un tri. Prenons un exemple:

- par nom;
- on choisie un nom.

De l'apparence tout va bien, mais si on prend un nom qui existe plusieurs fois (tyty), les données affichées ensuite dans les textbox correspondent uniquement pour la première ligne dans le tableau Feuil1, même si on clique sur les diffrentes lignes dans le istview. Autrement dit, le tri ne fonctionne pas.
A+
Avec une listview il faut utiliser impérativement une clé pour connaître le numéro de ligne de la base de donnée.

Le code suivant recherche le nom dans la base de donnée, il prend le premier trouvé.

Code:
Li = .Cells.Find(Item, , Lookat:=1).Row    'ligne de l'item

Ci dessous le code à utiliser

Code:
Private Sub Listview1_ItemClick(ByVal Item As MSComctlLib.ListItem)
   .................................................................
    If ListView1.ListItems.Count = 0 Then Exit Sub ' pour éviter une erreur si la listview est vide
        With ListView1.ListItems(ListView1.SelectedItem.Index)
              Li = Val(Replace(.Key, "A", ""))' on récupère le numéro de ligne
        End With
    With Sheets("Feuil1")
               For Nb = 1 To 18
            Me("TextBox" & Nb) = .Cells(Li, Nb)
        Next
    End With
.......................................
A tester

JP
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Autant pour moi il faut écrire : For Each Ctrl In Me.Controls

JP
 

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

MAGNIFIQUE ! CA FONCTIONNE ! MERCI BEAUCOUP !

Par contre, je n'arrive pas non plus de vider les text et combobox, ah.

En effet, je veux juste éviter la réouverture d'Userform à chaque nouvelle saisie, s'il y a plusieurs choses à rentrer dans la base à la fois.
Mais bon, c'est un détail.

Merci encore et à +
 

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

OUAI, c'est parti pour les textbox, merci !

Si j'ai plusieurs combobox, il faut que je site chacune avec .Clear ?

Pas de moyen comme avec les textbox ?

A +
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Il faudrait rajouter un bouton pour quitter l'application et supprimer les Unload me sauf pour le bouton.
Pour initialiser les les controles la méthode clear permet de vider les Combobox, Listbox, Listview. Pour les textbox il faut les effacer.
Pour réinitialiser il faut lancer la procédure "Userform_initialize"

JP
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

OUAI, c'est parti pour les textbox, merci !

Si j'ai plusieurs combobox, il faut que je site chacune avec .Clear ?

Pas de moyen comme avec les textbox ?

A +
clear vide le Combo ou listbox, la propriété count est égale à 0

Il suffit de rajouter, le principe est toujours le même, par exemple

If TypeName(Ctrl) = "ComboBox" Then Ctrl = ""
If TypeName(Ctrl) = "ListBox" Then Ctrl = ""
If TypeName(Ctrl) = "OptionButton" Then Ctrl.value = False
...........................................................................
Concernant les ComboBox on peut écrire ComboBox.ListIndex=-1

JP
 
Dernière édition:

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Génial,

j'ai donc ajouté

PHP:
If TypeName(Ctrl) = "ComboBox" Then Ctrl = ""
et tout va comme je veux.

Merci encore et à+
 

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour tout le monde.

Bebere, je reviens vers vous pour le côté "PARAMETRES" de ce fichier.

2 choses:

1. Pour "modifier" : si on saisie qqchose dans la textbox2 de la multipage Modifier sans faire le choix dans la listtbox2, ça bog.

2. Je voudrais qu'après avoir AJOUTé une donnée, la textbox sur la page Ajoute se vide. J'ai essaié le code, mais il ne marche pas:

HTML:
Dim Ctrl As MSForms.Control
For Each Ctrl In Me.Controls
    If TypeName(Ctrl) = "Textbox" Then Ctrl = ""
    If TypeName(Ctrl) = "ComboBox" Then Ctrl = ""
Next Ctrl
Une idée? où, plutôt, deux?

Merci d'avance.

A+
 
Dernière édition:

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Ci joint l'userform avec quelques modifications.
Après décompression il faut l'importer dans l"éditeur VBA


A tester

JP
 

Fichiers joints

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour,

JP, j'ai peur que je n'arrive pas d'ouvrire le bon fichier.

est-il possible de l'envoyer en zip normal svp?

Merci d'avance,

A+
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Ce n'est pas un fichier excel mais 2 fichiers un .frm (contient le code VBA) et un .frx (dessin de l'usf)
VBA n'affichera qu'un seul fichier UsmParam.frm
Il faut renommer l'userform du fichier excel s'il existe déjà dans le projet.
JP
 
Dernière édition:

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Suis désolé, je néarrive pas à ouvrir le dessin.

J'essaierai ce soir chez moi.

Merci.
 

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Bonsoir le Forum,

JP, comment on importe USF dans VBA?

Cordialement
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonsoir

Première opération renommer l'userform existant.
Menu Fichier : Importer un fichier.
Rechercher le fichier .frm pour les userform .bas pour les modules.

JP
 

Fichiers joints

Dernière édition:

ChTi160

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour terpick
Bonjour le Forum

je me permets , afin de saluer les participants de ce fil Lol

et pour ne pas venir les mains vides Lol

Pour ce qui est de l'effacement de certains Objets (pas toujours du même type ) il est possible de mettre en propriété Tag , des objets a effacer , par exemple OK

et ensuite on boucle sur les contrôles et ceux qui ont la propriété Tag = OK , on les efface qu'il soit ComBobox ou TextBox etc .
Exemple :

Code:
Dim Ctrl as Control
For Each Ctrl in Me.Controls
 if Ctrl.Tag= OK then Ctrl.Clear
Next Ctrl
je n'ai pas encore pris le temps de faire la Manip de JP
j'y cours Lol

Bonne Journée
Amicalement
Jean Marie
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Bonjour tout le monde.
Je voudrais qu'après avoir AJOUTé une donnée, la textbox sur la page Ajoute se vide. J'ai essaié le code, mais il ne marche pas:
HTML:
Dim Ctrl As MSForms.Control
For Each Ctrl In Me.Controls
    If TypeName(Ctrl) = "Textbox" Then Ctrl = ""
    If TypeName(Ctrl) = "ComboBox" Then Ctrl = ""
Next Ctrl
Merci d'avance.
A+
L'erreur est très difficile à trouver car on est sûr de son code, on peut y passer des jours à se creuser la tête.

Textbox s'écrit TextBox.

JP
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Ci dessous le code à coller dans l'usf usfParam
J'ai décomposé les procédures pour simplifier leur utilisation.


Code:
Private Adr As String
Private Li As Integer    'déclare la varible li
Private Sub Userform_initialize()    'à l'initialisation de l'Userform'
' pour mise au point
'col = 1: NomDefini = "pays"
'*******************
RemplirListbox
Me.MultiPage1.Value = 0    'définit la page active
End Sub

Private Sub CommandButton1_Click()    'bouton "ajouter"
Dim L As Long
If Me.TextBox1.Value = "" Then
    Call MsgBox("Vouds devez indiquer un : " & NomDefini, vbExclamation, "")
End If
'condition : si la TextBox1 n'est pas vide
TextBox1 = StrConv(Application.WorksheetFunction.Trim(TextBox1.Value), vbProperCase)
   'prend en compte l'onglet "paramètres" *
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.List(i) = TextBox1 Then
                MsgBox TextBox1.Value & " Existe déjà"
                Me.TextBox1.Value = ""
                Me.TextBox1.SetFocus
                Exit Sub
                End If
    Next i
L = CLng(ListBox1.List(ListBox1.ListCount - 1, (ListBox1.ColumnCount - 1))) + 1
    Sheets("parametres").Cells(ListBox1.ListCount + 1, col) = TextBox1
    'mise à jour des composants de la ListBox1
TrierColonne
RemplirListbox
EffaceTextBox
End Sub

Private Sub CommandButton2_Click()    'bouton "sortir" (page "ajouter")
    mv = 0    'réinitialise la variable mv (déclarée publique)
    col = 0
    Unload Me    'vide et ferme l'UserForm

End Sub


Private Sub ListBox1_Click()    'au clic dans la ListBox1
'définit la variable li (utilise la fonction "Rechercher" (Find) pour le numéro de la ligne dans lequel se trouve la donnée recherchée)
    Adr = ListBox1.List(ListBox1.ListIndex, 1)
End Sub

Private Sub CommandButton3_Click()    'bouton "supprimer"
'condition : si "oui" au message, supprime la donnée dans l'onglet "Liste"
    If MsgBox("Êtes-vous sûr(e) de vouloir supprimer cette donnée ?", vbYesNo, "ATTENTION !") = vbYes Then
        Sheets("parametres").Range(Adr).Delete Shift:=xlShiftUp    'suppression de la donnée
    End If    'fin de la condition
    'mise à jour des composants de la ListBox1
TrierColonne
RemplirListbox
EffaceTextBox
Adr = ""
End Sub

Private Sub CommandButton4_Click()    'bouton "annuler" (page "supprimer")
CommandButton2_Click
End Sub

Private Sub ListBox2_Click()    'au clic dans la ListBox2
    Me.TextBox2.Value = Me.ListBox2.Value    'place le contenu de la donnée sélectionnée dans la TextBox2
    Adr = ListBox1.List(ListBox1.ListIndex, 1)
'définit la variable li (utilise la fonction "Rechercher" (Find) pour le numéro de la ligne dans lequel se trouve la donnée recherchée)
    On Error Resume Next    'vite le bug si on délectionne une donnée dans la page "modifier" et on change de page...
    'sélection de l'ancienne donnée
    Me.TextBox2.SetFocus    'place le curseur dans la TextBox2
    Me.TextBox2.SelStart = 0    'début de la sélection
    Me.TextBox2.SelLength = Len(Me.TextBox2.Value)    'longueur de la sélection
End Sub

Private Sub CommandButton6_Click()    'bouton "modifier"
'condition : si "oui" au message, modifie la donnée dans l'onglet "Liste"
    TextBox2 = StrConv(Application.WorksheetFunction.Trim(TextBox2.Value), vbProperCase)
    If MsgBox("Êtes-vous sûr(e) de vouloir modifier cette donnée ?", vbYesNo, "ATTENTION !") = vbYes Then
        Sheets("parametres").Adr.Value = Me.TextBox2.Value    'remplace la donnée par le contenu de la TextBox2'
    End If    'fin de la condition
    'mise à jour des composants de la ListBox2
TrierColonne
RemplirListbox
EffaceTextBox
Adr = ""
End Sub

Private Sub CommandButton5_Click()    'bouton "sortir" (page "modifier")
CommandButton2_Click
End Sub
Private Sub RemplirListbox()
Dim Dl1 As Long
Dim Plg1 As Range
Dim cellule As Range
Dl1 = Worksheets("parametres").Cells(Columns(col).Cells.Count, col).End(xlUp).Row
Set Plg1 = Worksheets("parametres").Range(Cells(1, col), Cells(Dl1, col))
With Me.ListBox1
    .Clear
    .ColumnCount = 3
    .ColumnWidths = "200;0;0"
    For Each cellule In Plg1
            .AddItem cellule.Value
            .List(.ListCount - 1, 1) = cellule.Address
            .List(.ListCount - 1, .ColumnCount - 1) = cellule.Row
    Next cellule
End With
With Me.ListBox2
    .Clear
    .List = Me.ListBox1.List
End With
End Sub
    
Private Sub TrierColonne()
Dim Dl1 As Long
Dim Plg1 As Range
Dim Plg2 As Range
Dl1 = Worksheets("parametres").Cells(Columns(col).Cells.Count, col).End(xlUp).Row
Set Plg1 = Worksheets("parametres").Range(Cells(1, col), Cells(Dl1, col))
Set Plg2 = Worksheets("parametres").Range(Cells(1, col), Cells(1, col))
Plg1.Sort Key1:=Plg2
End Sub
Private Sub EffaceTextBox()
Dim ctrl As MSForms.Control
For Each ctrl In Me.Controls
    If TypeName(ctrl) = "TextBox" Then
        ctrl = ""
    End If
Next ctrl
End Sub
Bon Week end

JP
 

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

BONSOIR le FORUM et tous se gens qui m'aident à monter mon dossier. C'est vraiment sympa de votre part à me filer un coup de man pour ce projet.
Merci Bebere, JP, ChTi160, CHALET53, YANN-56, Fo_rum, Si... , merci tout le monde !
 

Discussions similaires


Haut Bas