LISTVIEW Ajouter Modifier Supprimer

terpick

XLDnaute Occasionnel
Bonjour le Forum!

J'ai de nouveau besoin de votre aide.

J'essaie de créer un logiciel pour gérer les données dans un tableau avec les options de base: Ajouter Modifier Supprimer

En bidoullant sur le forum j'ai appris que cela est possible à faire avec ListView. J'ai pris un exemplaire pour la base ( https://www.excel-downloads.com/threads/modifier-ligne-listview-via-textbox.168595/ ) et après qques modifications j'ai réussi d'avoir qqchose presque potable... mais rien ne marche...
Mais "connaissances" ne me permettent pas aller plus loin.

Peut-être qqun peut éclairer la situation?

Merci
 

Pièces jointes

  • Classeur1.xls
    85 KB · Affichages: 235
  • Classeur1.xls
    85 KB · Affichages: 217
  • Classeur1.xls
    85 KB · Affichages: 247
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 !
 

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Bonsoir Papou,

Merci pour votre intérêt. je m'en doute pas, que j'ai plein d’erreurs dans mon fichier. Votre formule est bien évidement, celle qu'il me faut, mais je n'arrive pas à la bien placer.

Du coup, j'ai triché.
Dans la colonne C 'Base' j'ai ma date, mais le j'ai toujours le format pas souhaitable Par contre le bon format apparait après le tableau, dans la colonne L, je ne sait même pas comment et pourquoi.

j'ai donc masqué la colonne C et travaille avec la L

Mais bon, je voudrai faire des changements. Dans la ListView je veux donner la possibilité de faire un tri par moi et année. C'est primordiale, mais ça sent une nouvelle usine à gaz. Je ne sais pas trop, de quel pied il faut danser.

Je joins mon fichier allégé sur le fil uù on a monté ce fichier depuis plusieurs mois.

Merci d'avance !
 

Pièces jointes

  • test(1).xlsm
    219.9 KB · Affichages: 128
  • test(1).xlsm
    219.9 KB · Affichages: 129
  • test(1).xlsm
    219.9 KB · Affichages: 137

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Bonsoir,

Ci-joint la dernière version qui commence à prendre forme.
JP, Usfparam boge, je ne trouve pas pourquoi?

Bon dimanche à tous.
 

Pièces jointes

  • test(1) (version 1).xls
    896 KB · Affichages: 172
  • test(1) (version 1).xls
    896 KB · Affichages: 161
  • test(1) (version 1).xls
    896 KB · Affichages: 159

Bebere

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

bonjour Terpick,Jp,Chti
dans RemplirListbox la variable col=0


Private Sub Userform_initialize() 'à l'initialisation de l'Userform'
' pour mise au point
'col = 1: NomDefini = "pays" mis en commentaire
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour
Salut Bebere

Les codes comme ci dessous sont à modifier dans l'usf "Quelle_Mission"
Code:
Private Sub OptionButton4_Click()

    If OptionButton4 Then
        col = 1: NomDefini = "ens"
        UsfParam.Label1.Caption = "Saisissez le nom "
        UsfParam.Show
        Unload quelle_mission
    End If
La variable UsfParam.Label1 n'existe pas si l'usf n'est pas crée.
Il faut passer par une variable publique


PS pour faire les essais de l'usf "UsfParam" sans passer par "quelle_mission" il faut mettre des valeurs dans les variables.

A tester

JP
 
Dernière édition:

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Ci joint le fichier modifié pour les paramètres

A tester

JP
 

Pièces jointes

  • test(1) (version 1).xls
    922.5 KB · Affichages: 148
  • test(1) (version 1).xls
    922.5 KB · Affichages: 143
  • test(1) (version 1).xls
    922.5 KB · Affichages: 149

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Bonsoir Papou,

Mais bon, je voudrai faire des changements. Dans la ListView je veux donner la possibilité de faire un tri par moi et année. C'est primordiale, mais ça sent une nouvelle usine à gaz. Je ne sais pas trop, de quel pied il faut danser.

Dans une listeview les données sont du type string. Pour trier les dates il faut les transformer, en calculant le nombre de jours depuis l'année 1901, excel le fait très bien, ou en écrivant la date sous la forme année mois jour.

Le plus simple est de créer une colonne ( en dernière position ) avec comme largeur 0, elle sera invisible.

Modifications
Rajouter une colonne de taille 0
Code:
        For col = 1 To 4: .ColumnHeaders.Add , , Sheets("Base").Cells(2, col), 50: Next
        .ColumnHeaders.Add , , "Date", 0

Inscrire une valeur dans cette colonne en transformant la date en nombre
Code:
       If .Cells(L, col) = Me.ComboBox5 Then
         ListView1.ListItems.Add , "A" & L, .Cells(L, 1)
         For C = 2 To 4
           ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , .Cells(L, C)
         Next
          ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , Sheets("Base").Cells(L, 3) * 1
       End If

Si on clique sur la colonne "Date", on indique au programme qui réalise l'opération que la colonne date est la dernière.
Code:
Private Sub Listview1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
Dim colonne As Byte
colonne = ColumnHeader.Index - 1
If colonne = 2 Then colonne = 4
    With ListView1
        .Sorted = False
        .SortKey = colonne

Si on désire faire un tri uniquement par mois et année il faut écrire
Code:
         If Len(Month(Sheets("Base").Cells(L, 3))) = 1 Then
            date1 = Year(Sheets("Base").Cells(L, 3)) & "0" & Month(Sheets("Base").Cells(L, 3))
        Else
            date1 = Year(Sheets("Base").Cells(L, 3)) & "0" & Month(Sheets("Base").Cells(L, 3))
        End If
         
          ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , date1

A tester

JP
 
Dernière édition:

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour à tous,

JP, merci pour les indices. J'ai inséré les macros dans VBA (j'espère là, où il faut).
Mais... pas de résultat souhaité... j'ai peur de m'avoir trompé.

Pour la partie Paramètres. Ca bog pour les trois actions:

En ajoutant - on saisie un mot, mais quand on clock pour confirmer il y a un message d'erreur :
Code:
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 = (Application.WorksheetFunction.Trim(TextBox1.Value), vbProperCase)
En modifiant, dès qu'on clique sur une ligne, qu'on veut modifier :
HTML:
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)

En supprimant, ça va jusqu'à la confirmation, mis après hélas, erreur :
HTML:
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

A+
 

Pièces jointes

  • test(1) (version 2).xls
    912 KB · Affichages: 137
  • test(1) (version 2).xls
    912 KB · Affichages: 136
  • test(1) (version 2).xls
    912 KB · Affichages: 156
Dernière édition:

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonjour

Bonjour à tous,

Pour la partie Paramètres. Ca bog pour les trois actions:

En ajoutant - on saisie un mot, mais quand on clock pour confirmer il y a un message d'erreur :
Code:
Private Sub CommandButton1_Click()    'bouton "ajouter"
Dim L As Long
If Me.TextBox1.Value = "" Then
    Call MsgBox("Vouds devez indiquer un : " & NomDefini, vbExclamation, "")

[/QUOTE]
Quand on a un message d'erreur, il faut quitter la procédure avec "Exit sub" que j'ai oublié d'écrire.




[QUOTE]

En modifiant, dès qu'on clique sur une ligne, qu'on veut modifier : [HTML]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)[/HTML]

En supprimant, ça va jusqu'à la confirmation, mis après hélas, erreur : [HTML]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[/HTML]

A+[/QUOTE]

La procédure fonctionne si la feuille active est la feuille "parametres". 

Ci dessous le code modifié, a tester

[CODE]Private Sub TrierColonne()
Dim Dl1 As Long
Dim Plg1 As Range
Dim Plg2 As Range
With Worksheets("parametres")
Dl1 = .Cells(Columns(col).Cells.Count, col).End(xlUp).Row
Set Plg1 = .Range(.Cells(1, col), .Cells(Dl1, col))
Set Plg2 = .Range(.Cells(1, col), .Cells(1, col))
Plg2.Sort Key1:=Plg1

End With

End Sub

Je n'ai pas lu suffisamment l'aide de VBA
Notez le point devant chaque occurrence de la propriété Cells. Le point est nécessaire si le résultat de l'instruction With précédente doit être appliqué à la propriété Cells ; dans le cas présent, il permet d'indiquer que les cellules se trouvent dans la feuille de calcul 1 (sans le point, la propriété Cells renverrait les cellules de la feuille active).

JP
 
Dernière édition:

terpick

XLDnaute Occasionnel
Re : LISTVIEW Ajouter Modifier Supprimer

Bonsoir JP

La procédure fonctionne si la feuille active est la feuille "parametres".

Ci dessous le code modifié, a tester

Avec le nouveau code ça fonctionne pour SUPPRIMER. Néanmoins, pour sortir CommandButton2 se met en défaut avec le même message :projet ou bibliothèque introuvable.

Quand on a un message d'erreur, il faut quitter la procédure avec "Exit sub" que j'ai oublié d'écrire.

Que veut dire QUITTER LA PROCÉDURE?

Merci d'avance

A+
 

jp14

XLDnaute Barbatruc
Re : LISTVIEW Ajouter Modifier Supprimer

Bonsoir

Suite au message, il ne faut pas continuer la macro, il faut la quitter d’où "exit sub"

Code:
If Me.TextBox1.Value = "" Then
    Call MsgBox("Vouds devez indiquer un : " & NomDefini, vbExclamation, "")
    exit sub
End If

Je n'ai pas de problème pour quitter l'userform

Code:
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
JP
 
Dernière édition:

Statistiques des forums

Discussions
312 078
Messages
2 085 108
Membres
102 780
dernier inscrit
bouratinou