Filtrer ListView entre 2 Dates et transfert resultat vers feuille Excel
Bonjour tout le monde,
Je sollicite votre aide pour résoudre un problème concernant le transfert de filtrage de listView entre 2 dates vers autre feuille.
Le transfert s'effectue vers l'autre feuille ,mais ya des cellules en format dates qui se convertissent en "mm/jj/aaaa" au lieu de garder leur format "jj/mm/aaaa".
Et dans les colonnes "D","E" et "F" des cellules se formatent en Texte.La feuille Releve reçoit le résultat du filtrage de la listView
Dans le ficher ci-joint; il ya 3 feuilles: "BD1","BD2", et "Releve". Dans l'UserForm1 il ya la ListView ,la Combobox1 qui permet de choisir l'une des 2BD,
les TextBox1 et TextBox2 qui affichent automatiquement les dates MIN et MAX de la colonne "A" de la base choisie et les TextBox1 et TextBox2 (*) pour saisir dates
Début et Date Fin et enfin le bouton de commande qui appel les macros Filtre et Transfert.
Edit modo : (*) textBox 3 et TextBox4 en lieu et place de Texbox1 et Textbox 2
Bonjour
Allez dans l'usf et modifiez le code ci-dessous
Function CopyDataFromListViewToSheet()
Dim ws As Worksheet
Dim i As Integer, j As Integer
Dim ligne As Integer
Dim derlig As Long
derlig = Range("A" & Rows.Count).End(xlUp).Row
Set ws = ThisWorkbook.Sheets("Releve")
ligne = 4
With ws
For i = 1 To ListView1.ListItems.Count
.Cells(ligne, 1).Value = Format(ListView1.ListItems(i).Text, "mm/dd/yyyy")
For j = 2 - 1 To 6 - 1
.Cells(ligne, j + 1).Value = ListView1.ListItems(i).SubItems(j)
Next j
ligne = ligne + 1
Next i
End With
End FunctionPar ailleurs veillez à la déclaration de variable qui manque dans certains codes.
Vous pouvez aussi modifier le code ci-dessous. On évite les activate et de répéter le nom de la feuille à chaque ligne
Private Sub CommandButton1_Click()
Dim i As Integer
Dim lastline As Integer
With Sheets("Releve")
lastline = .Cells(Rows.Count, "A").End(xlUp).Row
.Range("A4:F" & lastline).Clear
.Range("B1:B2").Clear
.Range("A1:A2") = "Releve de la feuille" & Worksheets(ComboBox1.Value).Name
'Me.TextBox3 = Format(CDate(Me.TextBox3), "dd/mm/yyyy")
.Range("B1") = CDate(Me.TextBox3.Value)
'Me.TextBox4 = Format(CDate(Me.TextBox4), "dd/mm/yyyy")
.Range("B2") = CDate(Me.TextBox4.Value)
End With
Chercher_Entre_Deux_Dates_Dans_listview
CopyDataFromListViewToSheet
Sheets("Releve").Activate
Call Module1.FusionnerA1_A2
End SubNB :
- la macro fusionnerA1_A2 n'est pas dans le fichier posté
- à voir pourquoi vous avez mis les deux lignes me.textbox3.... et me.textbox4...., cela ne me semble pas nécessaire si vous entrez vos dates au format dd-mm-yyyy. Je les ai désactivées dans le code
Vous pouvez aussi modifier ceci :
- Le code Sub ComboBox1_Fil() ne sert à rien. Je ne comprends pas le pourquoi ?? Vous pouvez le supprimer et aussi supprimer les 2 lignes ComboBox1_Fil et ListViewFil dans la sub Initialize
- Sub initialize supprimez aussi la ligne --> Worksheets(ComboBox1.Value).Activate
A voir si si vous voulez que je regarde pour d'autres modifications. Il y a pas mal de petites choses à corriger
Cordialement
Bonjour Dan
ça marche pour la colonne "A" de la feuille "Releve";les dates se mettent correctement en jj/mm/aaaa
Merci
Re
ça marche pour la colonne "A" de la feuille "Releve";les dates se mettent correctement en jj/mm/aaaa
Ok.
Pourquoi me repostez-vous le fichier en fait ? Vous vouliez me montrer les modifications ?
Bonsoir Dan
oui j'ai reposter le fichier si vous voulez voir les modifs
cordialement
Re
Ok. Je vais vous poster ce que vous pouvez modifier mais avant d'avancer; il y a quelque chose que vous devez absolument modifier
Dans chacune de vos feuilles vous avez colorié les lignes et mis des bordures jusqu'au bas de vos feuilles (soit donc jusque la ligne 1048576 !!!)
A ne pas faire, c'est le meilleur moyen d'alourdir votre fichier inutilement. Actuellement votre fichier pèse lourd 1,4 MO alors que vous n'avez qu'un minimum de données.
Je vous suggère donc de supprimer toutes les lignes depuis la ligne 1000 jusque la fin de la feuille, de manière à n'avoir qu'une couleur et les bordures jusque la ligne 1000 ou 2000 si vous voulez. Une fois fait vérifiez bien que vous n'avez plus de bordures et couleur
Une fois fait enregistrez le fichier, fermez le puis le réouvrir. Vous verrez que l'ouverture est plus rapide et surtout que poids de votre fichier va descendre de 1,4 MO à 240 Ko !
Dites moi si ok puis je vous donne les modifications userform
Bonsoir Dan
c'est OK
J'ai suivi tes suggestions(suppression des lignes après le tableau) ; le fichier pèse maintenant 125 ko
Merci
Re
J'ai suivi tes suggestions(suppression des lignes après le tableau) ; le fichier pèse maintenant 125 ko
Parfait cela !
Voici ce que vous pouvez modifier dans les codes de l'userform
1. Sub Initialize : Remplacez la par celle ci-dessous
Private Sub UserForm_Initialize()
Dim i As Byte
With Me
.Label1.Caption = "Choix" + vbCrLf + "Base"
.Label2.Caption = "Relevé" + vbCrLf + "Date Début:"
.Label3.Caption = "Relevé" + vbCrLf + "Date Fin:"
.Label4.Caption = "Date Début >=" + vbCrLf + " Date MIN:"
.Label5.Caption = "Date Fin <=" + vbCrLf + "Date MAX:"
For i = 1 To Sheets.Count
.ComboBox1.AddItem Sheets(i).Name
Next i
End With
With ListView1
.View = lvwReport
.CheckBoxes = False
.FullRowSelect = True
.Gridlines = True
With .ColumnHeaders
.Clear
.Add , , "Date", 50
.Add , , "Ctegorie", 60
.Add , , "Libelle", 260
.Add , , "Debit", 60
.Add , , "Credit", 60
.Add , , "Solde", 60
End With
End With
End Sub2. Sub Combobox1_change : Remplacez-la par celle ci-dessous
Private Sub ComboBox1_Change()
Dim Min As Date, Max As Date
Dim f As Worksheet
Dim lastrow As Integer
ListView1.ListItems.Clear
Set f = Worksheets(ComboBox1.Value)
lastrow = f.Range("A" & Rows.Count).End(xlUp).Row
With f
TextBox1 = Format(CDate(.Range("L1")), "dd/mm/yyyy")
TextBox2 = Format(CDate(.Range("L2")), "dd/mm/yyyy")
.Range("L1").FormulaR1C1 = "=MIN(R[3]C[-11]:R[" & lastrow & "]C[-11])"
.Range("L2").FormulaR1C1 = "=MAX(R[2]C[-11]:R[" & lastrow & "]C[-11])"
End With
Call ListViewFil(f, lastrow)
End Sub3. Sub Listvieewfil --> à remplacer par celle ci-dessous
Sub ListViewFil(f As Worksheet, lastrow As Integer)
Dim r As Integer, c As Integer
Dim li As Object
For r = 4 To lastrow
Set li = ListView1.ListItems.Add(, , f.Cells(r, 1))
For c = 2 To 6
li.ListSubItems.Add , , f.Cells(r, c)
Next c
Next r
End Sub4. Dans les deux feuilles BD1 et BD2, vous pouvez modifier les deux formules qui se trouve en D2 et E2 comme ceci
en D2 --> =SOMME(INDIRECT("D4:D"&NBVAL($C:$C)))
en E2 --> =SOMME(INDIRECT("E4:E"&NBVAL($C:$C)))
Faite un test, les exécutions de code devraient se faire plus vite
Si ok je peux voir pour le reste de codes si vous voulez
Crdlt
EDIT : attention j'ai modifié la sub Combobox1_change reprise au point 2. (J'avais omis une ligne de code)
Bonjour Dan
Avec les modifications l'execution est plus rapide.
OK, tu peux voir le reste. Ya aussi, apres transfert de ListView vers la feuille "Releve"; colonnes "D","E", et "F", des cellules se formatent en Texte.
Crdlt
Re,
Ok parfait.
Toutefois dans la Private Sub ComboBox1_Change(), rajoutez aussi cette ligne juste après la ligne ListView1.ListItems.Clear
cela évite un bug si par hasard vous videz la combox de son info
If ComboBox1.Value = vbNullString Then Exit SubDans mon post précédent point 4, j'ai donné deux formules à placer en D2 et E2. en analysant les autres codes je me suis aperçu que c'était un code dans les feuilles et liés aux boutons Tabl qui mettaient ces formules. Nul besoin d'un code pour cela dans votre cas.
- En F2 --> =E2-D2
- D2 et E2 : voir mon point 4 du post précédent. Pour remettre les formules si elles n'y sont plus (due au code sivous l'avez exécuté avant les changements ci-après)
- Supprimez les codes Private Sub Bouton1_Click() et le bouton Ligne 4 dans les 3 feuilles BD1, BD2 et relevé
- Toujours dans les trois feuilles remplacez le code FinTabl_click par celui ci-dessous :
Private Sub FinTabl_Click()
'selection debut ou fin tableau
Dim DerLin As Long
DerLin = Cells(Rows.Count, 1).End(xlUp).Row
ligne = 4
With FinTabl
If .Caption = "FinTabl" Then
.Caption = "Ligne " & ligne
Cells(DerLin + 1, 1).Select
Else:
.Caption = "FinTabl"
Cells(ligne, 1).Select
End If
End WithFaites un test, et vous verrez que le nom du bouton changera selon le clic effectué.
NB : Si vous voulez vous pouvez changer le nom du code voir le nom du bouton. Dites-moi
apres transfert de ListView vers la feuille "Releve"; colonnes "D","E", et "F", des cellules se formatent en Texte.
En attendant votre retour je regarde ce point
Bonjour Dan
J'ai faits les changements : c marche sauf lorsque je changes l'ancienne Private Sub ComboBox1_Change(), par la nouvelle:
Dans Private Sub ComboBox1_Change(), il ya le f dans: Call ListViewFil(f, lastrow)------>Type d'argument By Ref incompatible
Cordialement.
Bonjour
c marche sauf lorsque je changes l'ancienne Private Sub ComboBox1_Change(), par la nouvelle:
Logique, vous n'avez pas utilisé le code Private Sub ComboBox1_Change() que je vous ai donné ici au point 2 --> https://forum.excel-pratique.com/s/goto/1226278
D'ailleurs je vois d'autres codes qui ne sont pas modifiés comme je vous ai écrit dans mes posts précédents. A mon avis vous êtes reparti d'un mauvais fichier à un moment d'autant que vous avez toujours les couleurs et les bordures jusque la ligne 10485746 dans les feuilles BD2 et relevé. Bizarre.... vous m'aviez écrit avoir supprimé cela
Faites ceci dans votre fichier --> allez dans l'userform et remplacez tous les codes par ceux dans le fichier joint
Ensuite refaites un test
Nb : dans votre feuille Releve, le code Private Sub Bouton1_Click() doit être supprimé aussi
Bonjour Dan
Tout d'abord je m'excuse si j' ai mal suivi une recommandation.
J'ai remplacé les codes du fichier texte et j'ai fait le test il est positif.
Une Grande excuse,suivie d'un grand Merci.
Re
si j' ai mal suivi une recommandation.
Pas grave
Voyez si d'autres points devraient être regardés ou modifiés lors de l'utilisation
Pour ma part, il n'y a une chose qui pourrait être intéressante, c'est de ne pouvoir utiliser le bouton bleu que si les textbox3, 4 et la combo sont complétées
A vous de voir si intérêt
Si ok comme cela et terminé, pensez à cloturer le fil
Cordialement
Bonjour tous Lecteurs de ce sujet
NB: Corrections
Veuillez noter sur mon premier post de ce sujet: Dans l'avant dernière ligne, c'est TextBox3 et TextBox4 de l'UserForm pour la saisie des dates Debut et Fin
et non TextBox1 et TextBox2.
Salutations.
Bonjour
Merci du message. J'ai édité votre premier post
Cordialement