IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Windows Discussion :

Filtrer entre 2 dates un fichier excel à partir de visual studio [Débutant]


Sujet :

Développement Windows

  1. #1
    Candidat au Club
    Femme Profil pro
    Développement personnel
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développement personnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Filtrer entre 2 dates un fichier excel à partir de visual studio
    Bonjour à tous,

    J'utilise une base Excel dans visual studio 2015 community.
    J'arrive à filtrer une colonne Excel sur une date issue d'un datetimepicker

    Voici le code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim date_debut As Date
     
    date_debut = dt_debut.Text
    date_debut = DateSerial(date_debut.Year, date_debut.Month, date_debut.Day)
     
    tfeuille = classeur.Worksheets("travaux")
    tfeuille.Range("A1:Z10000").AutoFilter(Field:=6, Criteria1:= date_debut.ToShortDateString)
    En revanche si je veux filtrer en utilisant supérieur ou inférieur à la date ou entre 2 dates ça ne fonctionne pas correctement.
    Excel prends bien en compte les bornes mais n'affiche rien du tout, si je rentre manuellement dans le filtre chrologique puis filtre personnalisé tout est correctement configuré et lorsque je clique sur ok les données filtrées apparaissent.
    Capture d'écran de filtre personnalisé :
    Nom : ecran.jpg
Affichages : 659
Taille : 98,2 Ko

    Voici le code qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim date_debut As Date
    Dim date_fin As Date
     
    date_debut = dt_debut.Text
    date_fin = dt_fin.Text
    date_debut = DateSerial(date_debut.Year, date_debut.Month, date_debut.Day)
    date_fin = DateSerial(date_fin.Year, date_fin.Month, date_fin.Day)
     
    tfeuille = classeur.Worksheets("travaux")
    tfeuille.Range("A1:Z10000").AutoFilter(Field:=6, Criteria1:=">=" & date_debut.ToShortDateString, Operator:XlAutoFilterOperator.xlAnd, Criteria2:="<=" & date_fin.ToShortDateString, VisibleDropDown:=True)
    J'ai fais pleins d'essais mais rien ne fonctionne, si quelqu'un a une idée je suis preneuse car la je sèche ...

    Merci d'avance

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    J'essaie de suivre, mais cela ne marche pas.

    1) Ton DateTimePicker est-ce un DatetimePIcker VB.net, ou un calendrier affiché par Excel quand tu cliques sur le calendrier dans la boîte de dialogue d'Excel ?
    2) Je me demande aussi pourquoi tu filtres directement dans Excel, au lieu de juste lire les données d'Excel dans une DataTable .net que tu pourrais filtrer dans un DataView ou une BindingSource. Cela me semble plus simple et plus efficace que de filtrer dans Excel.
    3) Comment fais-tu le lien avec Excel ? Est-ce un complément que tu fais avec VSTO ou une liaison par Interop.
    4) Je pense que tu devrais mettre tout ton code et quelques lignes de données, même si tu les maquilles au besoin.
    5) C'est quoi qui ne marche pas? As-tu un ou des messages d'erreur et où ?
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Candidat au Club
    Femme Profil pro
    Développement personnel
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développement personnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    bonjour,
    pour répondre à tes questions:
    1) le datetimepicker est un vb.net
    2) Je suis débutante en visual studio, j'ai réussi à afficher la feuille excel dans un datagridview, mais pas à ajouter des filtres. j;ai donc essayé de filtrer directement dans excel en pensant que ça serait plus simple
    3) je fais un lien interop
    4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Imports Microsoft.Office.Interop.Excel
     
     Private Sub cmd_import_Click(sender As Object, e As EventArgs) Handles cmd_import.Click
     
            Dim tfeuille As Microsoft.Office.Interop.Excel.Worksheet
            Dim choix_immeuble As String
            Dim choix_appart As String
            Dim type_travaux As String
            Dim date_debut As Date
            Dim date_fin As Date
     
            choix_immeuble = cb_choix_immeuble.Text
            choix_appart = cb_choix_appart.Text
            type_travaux = cb_type_travaux.Text
            date_fin = dt_fin.Text
            date_debut = dt_debut.Text
     
            Call ouverture_base()
     
            tfeuille = classeur.Worksheets("travaux")
            tfeuille.Activate()
     
            date_debut = DateSerial(date_debut.Year, date_debut.Month, date_debut.Day)
            date_fin = DateSerial(date_fin.Year, date_fin.Month, date_fin.Day)
     
            'filtre qui pose problème
            tfeuille.Range("A1:Z10000").AutoFilter(Field:=6, Criteria1:=">=" & date_debut.ToShortDateString, Operator:=XlAutoFilterOperator.xlAnd, Criteria2:="<=" & date_fin.ToShortDateString)
     
            ' affichage des données Excel dans la datagridview
            tfeuille.Range("A1").CurrentRegion.Select()
            'on prend connaissance de la taille du tableau a importer
            Dim indGauche = tfeuille.Range("A1").End(XlDirection.xlToLeft).Column.ToString
            Dim indDroite = tfeuille.Range("A1").End(XlDirection.xlToRight).Column.ToString
            Dim indHaut = tfeuille.Range("A1").End(XlDirection.xlUp).Row.ToString
            Dim indBas = tfeuille.Range("A1").End(XlDirection.xlDown).Row.ToString
     
            ' on redientionne le datagridview
            dgv_travaux.ColumnCount = indDroite - indGauche
     
            'On colore les en-têtes, on met les fonts
            With dgv_travaux.ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.White
            End With
     
            Dim row(indDroite - indGauche) As String
            'Création d'un tableau de strings pour chaque ligne
            For i As Integer = 0 To indBas - indHaut - 1
                For j As Integer = 0 To indDroite - indGauche - 1
                    row(j) = tfeuille.Cells(i + indHaut, j + indGauche).value2
                Next
                'MsgBox(row(0))
                With dgv_travaux.Rows
                    .Add(row)
                End With
            Next
     
            With dgv_travaux
                'Ordre des colonnes
                For i As Integer = 0 To indDroite - indGauche - 1
                    .Columns(i).DisplayIndex = i
                    .Columns(i).HeaderText = i + 1
                Next
            End With
     
            'Ajouter les lignes
            dgv_travaux.Rows.Add()
     
            'Enlever la ligne pointée
     
            If dgv_travaux.SelectedRows.Count > 0 AndAlso Not dgv_travaux.SelectedRows(0).Index = dgv_travaux.Rows.Count - 1 Then
                dgv_travaux.Rows.RemoveAt(dgv_travaux.SelectedRows(0).Index)
            End If
        End Sub
    5) il n'y a pas de message d'erreur, excel s'ouvre avec le filtre activé sur la bonne colonne, mais aucune donnée n'est affichée. lorsqu'on positionne la souris sur le filtre, il s'affiche "supérieur ou égal à dd/mm/yyyy et inférieur ou égal à dd1/mm1/yyyy".
    pour que les données s'affichent il faut rentrer manuellement dans le filtre personnalisé et cliquer sur ok.

    merci d'avoir répondu aussi rapidement à ma question et de m'aider à solutionner mon problème

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    VIte fait comme cela, as-tu essayé d'enregistrer une macro dans ton fichier Excel, en filtrant selon tes paramètres. Tu vas pouvoir comparer le code de filtrage généré par Excel avec le tien. Tu pourrais peut-être y retrouver un début de réponse.

    Bon, chez-moi, il est 19 h30 lundi. Je vais récupérer ton code et y jeter un œil, plus tard ce soir, ou demain.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  5. #5
    Candidat au Club
    Femme Profil pro
    Développement personnel
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développement personnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    j'ai déjà essayé cette manip, le code est similaire à ce que j'ai mis dans visual studio.
    Par contre si tu sais comment faire, je veux bien que tu m'explique comment ajouter des filtres dans le datagridview, qui était ma première idée.
    Merci pour ton aide

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je t'ai mis un zip que j'ai patenté hier soir. Il y a quelque chose qui m'énerve encore, mais l'exemple devrait être assez parlant.

    Dans la procédure d'événement du Form_Load, je construis une table de données qui correspond aux données de mon fichier Excel. (C'est plus simple de conserver les mêmes noms de champs)

    Dans le bouton Importer, je récupère la plage nommée Données de mon fichier Excel. (IL est dans le dossier Bin\debug de la solution)
    L'idée de base est que la plage nommée (l'entête plus les données) devient la Table de données pour une requête SQL
    Le résultat de la requête est ensuite mis dans la table que j'ai créée plus haut et affiché dans le DataGridView
    Le DataGridView (DataSource) est alimenté directement de la table

    Dans le bouton Date, j'utilise le composant DataView (cela pourrait aussi être un BindingSource) pour filtrer la table et obtenir les données du 1er juin au 15 juin et triées dans l'ordre croissant des dates. Là, le DataGridView (DataSource, toujours) est alimenté par le DataView, au lieu d'être alimenté par la table.

    Dans le bouton Nom, je filtre la même table pour les données de Obélix et de Gaston, triées en ordre décroissant des noms. Là, le DataGridView (DataSource, toujours) est alimenté par le DataView, au lieu d'être alimenté par la table.

    Et surtout, le truc infaillible ou presque. Un clic sur un mot-clef inconnu et

    Et tu n'as plus besoin d'avoir de référence à Excel. (Même si j'ai oublié de l'enlever)

    P.S. Le BindingSource est plus gourmand en ressources que le DataView. Par contre, il est beaucoup plus versatile.
    Fichiers attachés Fichiers attachés
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  7. #7
    Candidat au Club
    Femme Profil pro
    Développement personnel
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développement personnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    J'ai récupéré ce que tu m'as joins pour le tester et voir le fonctionnement malheureusement lorsque je clique sur le bouton importer ça ne fonctionne pas et j'ai le message d'erreur suivant :
    Nom : erreur.png
Affichages : 306
Taille : 22,3 Ko

    Ensuite sur ton code j'ai une question sur la partie suivante de ton code:
    "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=DémoExcel.xlsx;Extended Properties=Excel 12.0;")
    le 12.0 correspond à quoi? si c'est une version comment trouver la bonne?
    Pendant mes recherches pour lier mon fichier excel à ma datagridview, j'ai vu cette ligne de code avec différentes valeurs (4.0,8.0,12.0), aucune n'a fonctionnée

    Merci pour ton travail

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Le moteur ACE, c'est le moteur de base de données d'Access. Tu peux le télécharger là
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  9. #9
    Candidat au Club
    Femme Profil pro
    Développement personnel
    Inscrit en
    Novembre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développement personnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    J'ai téléchargé le moteur ACE et le code fonctionne.
    Je l'ai donc transposé dans mon programme et j'ai réussi à l'adapter pour faire des filtres en fonction du textbox.
    Je te remercie pour ton aide et ton travail, tu m'as grandement aidé

    C'est super de croiser des gens comme toi qui prennent le temps d'apporter des réponses claires, rapides et très complètes.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2009, 00h19
  2. Réponses: 2
    Dernier message: 06/04/2005, 13h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo