Problème sur Usf traitement de demande et exportation

franckyonfire

XLDnaute Nouveau
Bonjour à tous,

Encore une fois c'est vers vous que je me tourne car je n'arrive plus à avancer sur mon projet.
Je vous explique les fonctions que doit remplir mon fichier.
1. Un formulaire permet de saisir des informations et les archives dans l'onglet "journal" ;) pour lui pas de problème
2. Un outil de traitement des demandes reprend les infos se trouvant dans le journal et donne le choix d'envoyer via une feuille formatée les infos par mail.
3.La possibilité d'extraire et d'archiver une période d'un mois (dans un fichier que l'on précise) un fichier .xls

J'ai déjà créé les différents Userforms pour cela mais je ne comprends vraiment pas comment fonctionne les listviews.
J'ai été sur différents forums et récupéré des exemples mais pas moyen de l'adapter à mon fichier... Au mieux j'arrive juste à mettre des informations dans la listview mais pas celles de mon fichier.

Comme un petit exemple vaut mieux qu'un grand discourt, je mets mon fichier en pièce jointe et vous remercie grandement pour l'aide que vous pourrez m'apporter.



:mad: Bon je viens de faire des vérifs dans mon fichier et je viens de constater que j'avais oublié de mettre une frame (Contrat) qui est indispensable ><" et la boucle de Control des OptionButton refuse de prendre en compte les informations...

Vos remarques et commentaires sont les bienvenus.

Merci d'avance
 

Pièces jointes

  • Journal activité badges.xlsm
    169.7 KB · Affichages: 99
  • Journal activité badges.xlsm
    169.7 KB · Affichages: 105
  • Journal activité badges.xlsm
    169.7 KB · Affichages: 105
Dernière édition:

jp14

XLDnaute Barbatruc
Re : Problème sur Usf traitement de demande et exportation

Bonjour

Concernant la listview,
Il faut dans un premier temps définir la listview, le plus simple est d'utiliser l'option "personnalisé" des propriétés du contrôle.
En cochant
.View = lvwReport 'affichage en mode Rapport
.Gridlines = True 'affichage d'un quadrillage
.FullRowSelect = True 'Sélection des lignes comlètes
.LabelEdit = 1 'empêcher la modification manuelle des données en spécifiant la valeur 1
.MultiSelect = True 'Pour autoriser la multi sélection, vous devez tout d'abord passer la propriété Multiselect à True. Ensuite sélectionnez les lignes en gardant enfoncée la touche Ctrl.
En définissant les colonnes Entête, largeur

Ensuite au niveau du code il faut remplir la listview

Code:
With Me.Controls("ListView1")
       .ListItems.Add , "K" & Lig, Sheets(nomfeuille).Range(Colonne & £Lig)
       .ListItems(.ListItems.Count).ListSubItems.Add , , Sheets(nomfeuille).Range(Colonne1 & Lig)
       .ListItems(.ListItems.Count).ListSubItems.Add , , Sheets(nomfeuille).Range(Colonne2 & Lig)
       ......................................
 End With
"K"& Lig : ce code permet de créer un lien logique entre une ligne de la listview et la base de donnée.

JP
 

Pièces jointes

  • listview.jpg
    listview.jpg
    65.4 KB · Affichages: 121
  • listview.jpg
    listview.jpg
    65.4 KB · Affichages: 132
  • listview.jpg
    listview.jpg
    65.4 KB · Affichages: 133

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Merci beaucoup pour le coup de main mais voila qu'à présent j'ai une erreur. La classe n'est pas enregistrée Recherche d'un objet avec CLSID:{7EBDAAE1-8120-11CF-899F-00AA00688B10}
J'ai donc été sur le meilleur des forums concernant Excel ^^ et j'ai trouvé une solution... Enfin je croyais!
https://www.excel-downloads.com/threads/classe-non-enregistree.130967/
Quand j'applique la méthode, une fenêtre s'ouvre pour me dire: DllRegisterServer dans c:\windows\system32\mscomctl.ocx réussi.
Mais le problème persiste. J'ai essayé de fermer puis relancer Excel et refaire ma manip' entre deux ouvertures mais rien n'y fait.
J'ai même supprimé le contrôle complémentaire des listviews pour le remettre après mais toujours pareil et le problème est également présent lorsque je fais un test sur un autre UserForm (un document trouver sur le net et qui fonctionne) contenant une listview. Impossible de modifier les propriétés "personnaliser"...
Dans le doute.... Je reboot!
Je vous tiens au courant des suites de l'affaire
 

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Bon... J'ai tellement bidouillé qu'au final j'ai été obligé de reprendre une version précédente posté il y a peu sur le forum car j'avais des bugs dans tous les sens avec les transferts d'informations du UserForm1 vers la feuille "Journal"
Je sens que je ne vais pas aller me coucher tout de suite moi :s
 

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

:eek: J'ai réussi à récupérer les bêtises faites cette nuit, mais le problème de message d'erreur persiste mais ne m’empêche pas d'utiliser les listviews.

Code:
Private Sub ListView1_Initialize()
With Me.Controls("ListView1")
       .ListItems.Add , "K" & Lig, Sheets(Journal).Range(Colonne & £Lig)
       .ListItems(.ListItems.Count).ListSubItems.Add , , Sheets(Journal).Range(Colonne1 & Lig)
       .ListItems(.ListItems.Count).ListSubItems.Add , , Sheets(Journal).Range(Colonne2 & Lig)
.View = lvwReport 'affichage en mode Rapport
.Checkboxes = True 'affichage des cases à cocher
.Gridlines = True 'affichage d'un quadrillage
.FullRowSelect = True 'Sélection des lignes comlètes
.LabelEdit = 1 'empêcher la modification manuelle des données en spécifiant la valeur 1
.MultiSelect = True 'Pour autoriser la multi sélection
.View = lvwReport

 End With
End Sub


'*********************Controle la combobox pour afficher les périodes sans doublons *********************


Private Sub UserForm_Initialize()

Dim sd As Object 'déclare la variable sd (Sans Doublons)
Dim pl As Range 'déclare la variable pl (PLage)
Dim Cel As Range 'déclare la variable cel (CELlule)
Dim tbl As Variant 'déclare la variable tbl (TaBLeau)
Dim i As Integer 'déclare la variable i (incrément)
Dim j As Integer 'déclare la variable j (incrément)
Dim temp As Variant 'déclare la variable temp (valeur TEMPoraire)
 
Set sd = CreateObject("Scripting.Dictionary") 'définit la variable sd
With Sheets("Journal") 'prend en compte l'onglet "Base_de_donnees"
    Set pl = .Range("A2:A" & .Cells(Application.Rows.Count, 1).End(xlUp).Row) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "Base_de_donnees"
For Each Cel In pl 'boucle sur toutes les cellules cel de la plage pl
    sd(Cel.Value) = "" 'alimente la liste sans doublons
Next Cel 'prochaine cellule de la boucle
tbl = sd.keys 'définit le tableau des valeurs sans doublons
'tri alphabétique
For i = 0 To UBound(tbl) 'boucle 1 de 0 au nombre de valeur du tableau
    For j = 0 To UBound(tbl) 'boucle 2 de 0 au nombre de valeur du tableau
        If tbl(i) < tbl(j) Then 'condition : si la valeur de la boucle 1 est invérieure à la valeur de la boucle 2
            temp = tbl(i) 'définit la valeur temporaire temp
            tbl(i) = tbl(j) 'la valeur de la boucle un devient la valeur de la boucle 2
            tbl(j) = temp 'la valeur de la boucle deux devient la valeur temporaire temp
        End If 'fin de la condition
    Next j 'prochaine valeur de la boucle 2
Next i 'prochaine valeur de la boucle 1
Me.ComboBox1.List = tbl 'alimente la ComboBox1 sans doublons et trié par ordre alphabétique




End Sub



Private Sub CommandButton2_Click() 'Bouton Annuler
Unload UserForm2
End Sub

Je remets du coup mon fichier mis à jour en pièce jointe car je bloque totalement là. Je débute et ne comprends pas pourquoi ça marche pas.

Merci d'avance pour le coup de main.
 

Pièces jointes

  • Journal activité badges.xlsm
    169.7 KB · Affichages: 81
  • Journal activité badges.xlsm
    169.7 KB · Affichages: 83
  • Journal activité badges.xlsm
    169.7 KB · Affichages: 80
Dernière édition:

jp14

XLDnaute Barbatruc
Re : Problème sur Usf traitement de demande et exportation

Bonjour

Avant d'utiliser la listview il faut la définir

ILfaut dans un premier temps définir la listview, le plus simple est d'utiliser l'option "personnalisé" des propriétés du contrôle.
En définissant les colonnes Entête, largeur

Chaque colonne de la listview devra correspondre à une colonne de la feuille excel. Cette correspondance sera utilisé lors du remplissage de la listview.

JP
 
Dernière édition:

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Bonjour et merci pour ta réponse, hélas comme je le disait, j'ai une erreur lorsque je clic sur personnalisé.
Concernant la listview, j'ai réussi à adapter mon code par rapport à ce lien EXCEL VBA - FILTRER LE CONTENU D'UNE LISTVIEW excel, vba, listview, filtre, Source N°44288 Visual Basic, VB6, VB.NET, VB 2005, VB
Il me permet même de filtrer les résultats.
Bon, à présent il faut que j'arrive à faire en sorte que lorsque j'ai fait une sélection multiple dans ma listview CERTAINES informations se transfèrent vers des cellules bien précises d'une autre feuille en fonction des Checkbox sélectionnées (ex: Si CheckBox_OBM = true, alors copie information "Badge", "Debut", "Fin", "TxtOBM") les une derrière les autres.
Pffff !!! J'ai du mal à être clair il me semble.
Encore une fois je renvois mon fichier avec les dernières mise à jour.
Je rajoute des notes également pour être plus clair. :)
 

Pièces jointes

  • Journal activité badges.xlsm
    169.7 KB · Affichages: 123
  • Journal activité badges.xlsm
    169.7 KB · Affichages: 122
  • Journal activité badges.xlsm
    169.7 KB · Affichages: 121

jp14

XLDnaute Barbatruc
Re : Problème sur Usf traitement de demande et exportation

Bonsoir


Ci dessous les modifications et ajouts à faire

ListView1.View = lvwReport
ListView1.MultiSelect = True a rajouter pour permettre la multiselection

ligne à modifier pour récupérer le numéro de ligne
Set oItem = ListView1.ListItems.Add(, "K" & oRng.Row, oRng.Offset(0, 0))

Code pour trouver les lignes de la base de données sélectionnées

Code:
Private Sub CommandButton1_Click()
Dim i As Integer

With ListView1
For i = 1 To .ListItems.Count
    If .ListItems(i).Selected = True Then
    MsgBox "Ligne sélectionnée " & Val(Replace(.ListItems(i).Key, "K", ""))
    End If
Next i
End With

End Sub

Code pour utiliser les données d'une ligne d'une listview avec les lignes sélectionnées

Code:
With ListView1
ReDim valeur(.ColumnHeaders.Count)
For i = 1 To .ListItems.Count
    If .ListItems(i).Selected = True Then
        valeur(0) = .ListItems(i).Text
        For j = 1 To .ColumnHeaders.Count - 1
              valeur(j) = .ListItems(i).ListSubItems(j).Text
        Next j
        For j = LBound(valeur) To UBound(valeur)
            MsgBox valeur(j)
        Next j
        
    End If

Next i

A utiliser en fonction de la méthode choisie, copier une ligne ou copier des cellules.

A tester

JP
 

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Je commence à me sentir comme une poule face à une fourchette...
Je pense que le plus sage est de recréer un tableau avec mes 13 lignes d'entête et ne bosser que sur la listview pour le moment.
Bon il est minuit, j'ai encore un peu de temps pour essayer de comprendre comment ça marche pour charger et transférer
Si une âme charitable se porte volontaire pour m'aider ;p merci d'avance
 

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Bonjour le forum,
Une nuit de sommeil m'a aidé à y voir plus clair :)
Merci encore JP14 pour tes conseils, je pense que j'étais tellement dedans que je ne comprenais même plus tes explications pourtant très clair.

Voici à quoi ressemble mon code à présent:
Code:
Option Explicit

Private Sub Annuler_Click() 'Bouton Annuler
    Unload UserForm2
End Sub

Private Sub ListView1_BeforeLabelEdit(Cancel As Integer)

End Sub

Private Sub TextBox1_Change()
    Call LVW_Fill(Trim$(TextBox1.Text), ComboBox1.ListIndex)
End Sub

Private Sub UserForm_Activate()
    Me.Caption = "Historique des enregistrements"
    Call CBO_Fill
    Call LVW_Fill("", 0)
End Sub

Private Sub CBO_Fill()
    'Variables locales
    Dim iCnt As Integer
    Dim oRng As Excel.Range

    'Remplit la Combo
    Set oRng = Feuil1.Cells(1, 1)
    For iCnt = 0 To 13 '-- 14 colonnes
        ComboBox1.AddItem oRng.Offset(0, iCnt)
    Next iCnt
    ComboBox1.ListIndex = 0
End Sub

Private Sub LVW_Fill(ByVal sFilter As String, ByVal iCol As Integer)
    'Variables locales
    Dim iCnt As Integer
    Dim iRnd As Integer
    Dim oRng As Excel.Range
    Dim oItem As ListItem

    'Initialisation de la ListView
    ListView1.ColumnHeaders.Clear
    ListView1.FullRowSelect = True
    ListView1.ListItems.Clear
    ListView1.View = lvwReport
    ListView1.MultiSelect = True

    'Remplissage de la ListView
    Set oRng = Feuil1.Cells(1, 1)
    Do Until oRng.Value = ""
        '-- En-têtes
        If oRng.Row = 1 Then
            For iCnt = 0 To 13 '-- 14 colonnes
                ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt)
            Next iCnt
        '-- Données
        Else
            iRnd = Int((4 * Rnd) + 1)
            If LCase$(Left$(oRng.Offset(0, iCol), Len(sFilter))) = LCase$(sFilter) Then
                Set oItem = ListView1.ListItems.Add(, "K" & oRng.Row, oRng.Offset(0, 0))
                For iCnt = 1 To 14 '-- 14 colonnes
                    oItem.ListSubItems.Add , , oRng.Offset(0, iCnt)
                Next iCnt
            End If
        End If
        Set oRng = oRng.Offset(1, 0)
    Loop
End Sub

Private Sub CommandButton1_Click()
Dim j As Integer, i As Integer


With ListView1
ReDim valeur(.ColumnHeaders.Count)
For i = 1 To .ListItems.Count
    If .ListItems(i).Selected = True Then
        valeur(0) = .ListItems(i).Text
        For j = 1 To .ColumnHeaders.Count - 1
              valeur(j) = .ListItems(i).ListSubItems(j).Text
        Next j
        For j = LBound(valeur) To UBound(valeur)
            MsgBox valeur(j)
        Next j
        
    End If

Next i
End With

End Sub

Lorsque je clic sur CommandButton1 (après avoir sélectionné une ligne dans la listview), j'ai bien toute une série de MsgBox (16 au total) avec les information se trouvant sur la ligne puis des message vide.
Donc si je comprends bien, je dois ensuite définir des variables pour chacune des colonnes???
J'ai bon ???
 

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Vu que j'avance tout doucement voici l'avancé de mon code, on ne sait jamais ... Ça pourrait peut être servir à un autre débutant comme moi ^^
Code:
Option Explicit

Private Sub Annuler_Click() 'Bouton Annuler
   Unload UserForm2
End Sub

Private Sub ListView1_BeforeLabelEdit(Cancel As Integer)

End Sub

Private Sub TextBox1_Change()
    Call LVW_Fill(Trim$(TextBox1.Text), ComboBox1.ListIndex)
End Sub

Private Sub UserForm_Activate()
    Me.Caption = "Historique des enregistrements"
    Call CBO_Fill
    Call LVW_Fill("", 0)
End Sub

Private Sub CBO_Fill()
    'Variables locales
   Dim iCnt As Integer
    Dim oRng As Excel.Range

    'Remplit la Combo
   Set oRng = Feuil1.Cells(1, 1)
    For iCnt = 0 To 13 '-- 14 colonnes
       ComboBox1.AddItem oRng.Offset(0, iCnt)
    Next iCnt
    ComboBox1.ListIndex = 0
End Sub

Private Sub LVW_Fill(ByVal sFilter As String, ByVal iCol As Integer)
    'Variables locales
   Dim iCnt As Integer
    Dim iRnd As Integer
    Dim oRng As Excel.Range
    Dim oItem As ListItem

    'Initialisation de la ListView
   ListView1.ColumnHeaders.Clear
    ListView1.FullRowSelect = True
    ListView1.ListItems.Clear
    ListView1.View = lvwReport
    ListView1.MultiSelect = True

    'Remplissage de la ListView
   Set oRng = Feuil1.Cells(1, 1)
    Do Until oRng.Value = ""
        '-- En-têtes
       If oRng.Row = 1 Then
            For iCnt = 0 To 14 '-- 14 colonnes
               ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt)
            Next iCnt
        '-- Données
       Else
            iRnd = Int((4 * Rnd) + 1)
            If LCase$(Left$(oRng.Offset(0, iCol), Len(sFilter))) = LCase$(sFilter) Then
                Set oItem = ListView1.ListItems.Add(, "K" & oRng.Row, oRng.Offset(0, 0))
                For iCnt = 1 To 14 '-- 14 colonnes
                   oItem.ListSubItems.Add , , oRng.Offset(0, iCnt)
                Next iCnt
            End If
        End If
        Set oRng = oRng.Offset(1, 0)
    Loop
End Sub

Private Sub CommandButton1_Click()
Dim j As Integer, i As Integer
Dim iDate As Date, Nom As String, Prenom As String, Badge As Variant, CodeService As Integer, OBM As Integer, Sodexo As String, Etat As String, Debut As Date, Fin As Date



With ListView1
ReDim valeur(.ColumnHeaders.Count)
For i = 1 To .ListItems.Count
    If .ListItems(i).Selected = True Then
        valeur(0) = .ListItems(i).Text
        For j = 1 To .ColumnHeaders.Count - 1
              valeur(j) = .ListItems(i).ListSubItems(j).Text
        Next j
        For j = LBound(valeur) To UBound(valeur)
            'Pour vérifier qui est où utiliser le MsgBox suivant:
            '(J'ai un bug obligé de cliquer 16 fois pour fermer le MsgBox)
            'MsgBox .ListItems(i).ListSubItems.Item(IciLeNumeroDeLaColonne).Text
            iDate = .ListItems(i).Text
            Nom = .ListItems(i).ListSubItems.Item(1).Text
            Prenom = .ListItems(i).ListSubItems.Item(2).Text
            Badge = .ListItems(i).ListSubItems.Item(3).Text
            CodeService = .ListItems(i).ListSubItems.Item(5).Text
            OBM = .ListItems(i).ListSubItems.Item(6).Text
            Sodexo = .ListItems(i).ListSubItems.Item(10).Text
            Etat = .ListItems(i).ListSubItems.Item(11).Text
            Debut = .ListItems(i).ListSubItems.Item(13).Text
            Fin = .ListItems(i).ListSubItems.Item(14).Text
            'Pour vérifier si tout est bon utiliser ce MsgBox avec le nom de la variable
            '(Même bug qu'au dessus)
            MsgBox Debut
        Next j
        
    End If

Next i
End With

End Sub

Je vais ensuite déclencher la procédure pour envoyer les éléments qui m'intéressent vers l'autre feuille concerné lors du clic

... To be continued !
 
Dernière édition:

jp14

XLDnaute Barbatruc
Re : Problème sur Usf traitement de demande et exportation

Bonjour

For j = LBound(valeur) To UBound(valeur)
'Pour vérifier qui est où utiliser le MsgBox suivant:
'(J'ai un bug obligé de cliquer 16 fois pour fermer le MsgBox)
'MsgBox .ListItems(i).ListSubItems.Item(IciLeNumeroDeLaColonne).Text
iDate = .ListItems(i).Text
Nom = .ListItems(i).ListSubItems.Item(1).Text
Prenom = .ListItems(i).ListSubItems.Item(2).Text
Badge = .ListItems(i).ListSubItems.Item(3).Text
CodeService = .ListItems(i).ListSubItems.Item(5).Text
OBM = .ListItems(i).ListSubItems.Item(6).Text
Sodexo = .ListItems(i).ListSubItems.Item(10).Text
Etat = .ListItems(i).ListSubItems.Item(11).Text
Debut = .ListItems(i).ListSubItems.Item(13).Text
Fin = .ListItems(i).ListSubItems.Item(14).Text
'Pour vérifier si tout est bon utiliser ce MsgBox avec le nom de la variable
'(Même bug qu'au dessus)
MsgBox Debut
Next j

Si on utilise ListItems(i).ListSubItems.Item(14).Text il n'y a pas besoin de mettre une boucle.

Le code peut s'écrire
Code:
For i = 1 To .ListItems.Count
    If .ListItems(i).Selected = True Then
           iDate = .ListItems(i).Text
            Nom = .ListItems(i).ListSubItems.Item(1).Text
            Prenom = .ListItems(i).ListSubItems.Item(2).Text
            Badge = .ListItems(i).ListSubItems.Item(3).Text
            CodeService = .ListItems(i).ListSubItems.Item(5).Text
            OBM = .ListItems(i).ListSubItems.Item(6).Text
            Sodexo = .ListItems(i).ListSubItems.Item(10).Text
            Etat = .ListItems(i).ListSubItems.Item(11).Text
            Debut = .ListItems(i).ListSubItems.Item(13).Text
            Fin = .ListItems(i).ListSubItems.Item(14).Text
             'écrire le code pour utiliser les variables
            '..............................................................
    End If

Next i

A tester

JP
 

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Effectivement ça évite qu'il m'affiche 16 fois le même MsgBox.
J'ai une erreur qui ressort sur la ligne

Debut = .ListItems(i).ListSubItems.Item(13).Text

Erreur d'exécution '13':
Incompatibilité de type

La variable est pourtant bien signalé comme étant Date !?!?
 

franckyonfire

XLDnaute Nouveau
Re : Problème sur Usf traitement de demande et exportation

Du coup j'ai changé Date par String pour la déclaration de la variable et ça semble fonctionner.
Je vais commencer à paramétrer la feuille OBM pour qu'elle puisse recevoir les infos "Badge" entre C12:C27
Bon je vais décrocher un peu avant que Madame ne rentre, je reprends le fil d'ici 1h ou 2
+++
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 838
dernier inscrit
Christelle.B86