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

VB.NET Discussion :

Récupération de valeurs Excel


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut Récupération de valeurs Excel
    Bonjour tout le monde,

    Voici un morceau de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      excelFile = CommonDialog1Open.FileName : appXls = New Excel.Application : appXls.Visible = False
                        book = appXls.Workbooks.Open(excelFile)
                        rowCount = book.Worksheets("données").Range("A65536").End(Excel.XlDirection.xlUp).Row
    Donc là j'ouvre un fichier excel. Je veux ensuite récupérer certaines valeurs de ce fichier, et les ajouter à une liste de points de la dll Zedgraph, permettant de faire des graphiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                        For I = 14 To rowCount
     
                            pointsCourbeY1.Add(book.Worksheets("données").Cells(I, "A").Value, book.Worksheets("données").Cells(I, "B").Value)
                            pointsCourbeY2.Add(book.Worksheets("données").Cells(I, "A").Value, book.Worksheets("données").Cells(I, "E").Value)
                        Next
    Le soucis est que ça prend énormément de temps ! pour 11000 lignes, ça prend quelque chose comme 6 minutes sur mon portable.

    Cependant, si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                      For I = 14 To 11000
                            pointsCourbeY2.Add(1, 1)
                            pointsCourbeY1.Add(1, 1)
                        Next
    Ca se fait en moins d'une seconde. J'imagine que ça vient de la recherche de la valeur dans le fichier excel.

    Bref ! je cherche un moyen de récupérer ces valeurs sans que ça prenne trois heures. Je viens donc ici voir si vous auriez des idées qui pourraient m'aider ?

    Merci de m'avoir lu

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Oui, tu as le moyen de te connecter au fichier Excel, comme à une base de données (donc très performant pour des jeux de données importants), et exécuter une requête SQL.
    Pour plus d'informations, voir : Lire et écrire dans les classeurs Excel fermés (c'est en VBA, mais tu pourras facilement le traduire en VB.NET).

  3. #3
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Ok je vais regarder àa avec beaucoup d'attention !

    Merci skalp

  4. #4
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Oui, tu as le moyen de te connecter au fichier Excel, comme à une base de données (donc très performant pour des jeux de données importants), et exécuter une requête SQL.
    Pour plus d'informations, voir : Lire et écrire dans les classeurs Excel fermés (c'est en VBA, mais tu pourras facilement le traduire en VB.NET).

    Rebonjour Skalp,

    Selon toi (ou quelqu'un d'autre ), quelle serait la meilleure façon de mettre une rangée de cellules (par exemple "A1:A10000" dans un tableau ?

    Par exemple, je cherche à mettre dans mon tableau de double toutes les valeurs contenues dans les cellules A1 jusqu'à A10000. Comment réaliser cette opération le plus rapidement possible ?

    Par avance merci !

  5. #5
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par GriffinK Voir le message
    Rebonjour Skalp,

    Selon toi (ou quelqu'un d'autre ), quelle serait la meilleure façon de mettre une rangée de cellules (par exemple "A1:A10000" dans un tableau ?

    Par exemple, je cherche à mettre dans mon tableau de double toutes les valeurs contenues dans les cellules A1 jusqu'à A10000. Comment réaliser cette opération le plus rapidement possible ?

    Par avance merci !
    Quelque chose dans ce genre peut-être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim varA(2000) As Object
    varA = book.Worksheets("données").Range("A1:A1000")
    ...marche pas malheureusement

  6. #6
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Il existe une FAQ qui traite de cette problématique : Comment transférer des données sous Excel rapidement ?

  7. #7
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Il existe une FAQ qui traite de cette problématique : Comment transférer des données sous Excel rapidement ?
    Bonjour Skalp,

    Voici mon code

    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
    Dim xlApp As Excel.Application
     
            Try
                xlApp = GetObject(, "excel.application")
            Catch
                xlApp = New Excel.Application
            Finally
                xlApp.Visible = False
            End Try
     
            'ajout d'une page et sélection 
            Dim xsTransfert As Excel.Worksheet = xlApp.Workbooks.Add.ActiveSheet
            Dim StrConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.XLS;Extended Properties=Excel 8.0;"
     
            Try
                ' ici on crée la chaine de connexion
                ' (on se connecte à SQL Server dans notre exemple)
                With xsTransfert.QueryTables.Add(StrConn, Destination:=xsTransfert.Range("A1"))
                    .CommandText = "Select * from [feuil1$]" ' ou requete SELECT
                    .Name = "données"
                    .FieldNames = True
                    .RowNumbers = True
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .BackgroundQuery = True
                    .RefreshStyle = Excel.XlCellInsertionMode.xlOverwriteCells
                    .SavePassword = False
                    .SaveData = False
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .PreserveColumnInfo = True
                    .Refresh(BackgroundQuery:=False)
                End With
     
                ' affichage 
                xlApp.Visible = True : xlApp.Visible = Excel.XlSheetVisibility.xlSheetVisible : xsTransfert.Visible = Excel.XlSheetVisibility.xlSheetVisible
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    Le but est de récupérer les valeurs excel dans une autre feuille excel ? au final je me retrouverai toujours avec des milliers de données dans la nouvelle feuille, du coup je ne serai guère avancé, mais j'imagine qu'il y a quelque chose que je ne vois pas / comprends pas ?

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Il existe une FAQ qui traite de cette problématique : Comment transférer des données sous Excel rapidement ?
    Ah pardon, tu veux faire l'inverse :
    Citation Envoyé par GriffinK Voir le message
    Selon toi (ou quelqu'un d'autre ), quelle serait la meilleure façon de mettre une rangée de cellules (par exemple "A1:A10000" dans un tableau ?

    Par exemple, je cherche à mettre dans mon tableau de double toutes les valeurs contenues dans les cellules A1 jusqu'à A10000. Comment réaliser cette opération le plus rapidement possible ?
    Une solution rapide pour récupérer les valeurs des cellules A1 à A10000 est de te connecter au fichier Excel et de récupérer les valeurs avec une requête SQL.

    Dans ce cas, le lien que je t'ai donné plus haut : Lire et écrire dans les classeurs Excel fermés devrait t'aider. Je pense que tu n'as pas lu cet article, sinon tu ne serais plus bloqué

  9. #9
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Ah pardon, tu veux faire l'inverse :
    Une solution rapide pour récupérer les valeurs des cellules A1 à A10000 est de te connecter au fichier Excel et de récupérer les valeurs avec une requête SQL.

    Dans ce cas, le lien que je t'ai donné plus haut : Lire et écrire dans les classeurs Excel fermés devrait t'aider. Je pense que tu n'as pas lu cet article, sinon tu ne serais plus bloqué
    Oui, je m'étais énervé dessus 20 minutes et n'arrivant à rien, j'ai abandonné..y a des jours comme ça
    Bref, j'ai lu de nouveau, et c'est ok, je peux récupérer mes valeurs, l'opération se fait en 1 seconde !

    Voici le code

    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
            Dim Fichier, Cellules As String
            Dim test(50, 4) As Object
     
            'Définit le classeur fermé servant de base de données
            Fichier = "C:\monfichier.XLS"
            Cellules = "A1:E51"
     
            Dim Source As ADODB.Connection
            Source = New ADODB.Connection
            Source.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";")
            Dim Rst As ADODB.Recordset
            Dim ADOCommand As ADODB.Command
            ADOCommand = New ADODB.Command
            With ADOCommand
                .ActiveConnection = Source
                .CommandText = "SELECT * FROM [Feuille1$" & Cellules & "]"
            End With
            Rst = New ADODB.Recordset
            Rst.Open(ADOCommand, , ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
     
            Rst.MoveFirst()
            test = Rst.GetRows(-1, 0, )
     
            Rst.Close()
            Source.Close()
            Source = Nothing
            Rst = Nothing
            ADOCommand = Nothing
    Les valeurs sont effectivement dans le tableau test. Mais (et oui ), je récupère des valeurs bizarres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >? Rst.Fields(0).Value
    #12/30/1899# {Date}
        Date: #12/30/1899#
    puis #12/30/1899 12:00:37 AM# puis #12/30/1899 12:01:17 AM# etc...

    Alors que la ligne sur mon fichier excel est
    0:00:00 0.023 0:00:00 5.43

    Les cellules sont respectivement des formats de cellule
    • Personnalisée (hh:mm:ss)
    • Standard
    • Personnalisée (hh:mm:ss)
    • Standard


    Je cherche ce qui pourrait expliquer l'erreur. Tu as peut-être une suggestion ?

  10. #10
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Et bizarrement, si je mets 1 2 3 4 dans les cellules de la première ligne puis laisse le reste sans y toucher, ca fonctionne

  11. #11
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par GriffinK Voir le message
    Et bizarrement, si je mets 1 2 3 4 dans les cellules de la première ligne puis laisse le reste sans y toucher, ca fonctionne
    La première ligne du fichier contient-elle des données ou les entêtes de colonne ? Peux-être tu devras modifier la chaîne de connexion :
    Citation Envoyé par ConnectionStrings.com
    "HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite.
    "IMEX=1;" tells the driver to always read "intermixed" (numbers, dates, strings etc) data columns as text. Note that this option might affect excel sheet write access negative.
    http://connectionstrings.com/?carrier=excel

  12. #12
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Skalp Voir le message
    La première ligne du fichier contient-elle des données ou les entêtes de colonne ? Peux-être tu devras modifier la chaîne de connexion :
    http://connectionstrings.com/?carrier=excel
    Bonjour Skalp,

    Merci encore pour ta réponse.

    J'ai trouvé un workaround qui me permet d'arriver d'arriver à ce que je veux faire, sans être pour autant une soluce à l'arrache

    Pour info, la ligne de commande sous dotnet doit être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "data source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"""
    sans quoi ça plante.

    Merci beaucoup pour ton aide, elle fut très appréciée

  13. #13
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Une dernière question:

    Losque, après utilisation de mon logiciel, je regarde mes processus, je vois autant de processus Excel que de sessions ouvertes.

    Voici mon code
    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
     
            appXls = New Excel.Application : appXls.Visible = False
            book = appXls.Workbooks.Open(Fichier)
            '...
            book.Close() : book = Nothing : appXls.Visible = True : appXls.Quit() : appXls = Nothing
     
            Dim Source As ADODB.Connection
            Source = New ADODB.Connection
            Source.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "data source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1""")
            Dim Rst As ADODB.Recordset
            Dim ADOCommand As ADODB.Command
            ADOCommand = New ADODB.Command
            With ADOCommand
                .ActiveConnection = Source
                .CommandText = "SELECT * FROM [données$" & Cellules & "]"
            End With
            Rst = New ADODB.Recordset
            Rst.Open(ADOCommand, , ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
            '...
            Rst.Close()
            Source.Close()
            Source = Nothing
            Rst = Nothing
            ADOCommand = Nothing
    J'imagine que j'oublie de fermer quelque chose mais je n'arrive pas à voir quoi ?

  14. #14
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par GriffinK Voir le message
    Losque, après utilisation de mon logiciel, je regarde mes processus, je vois autant de processus Excel que de sessions ouvertes.

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    appXls = New Excel.Application : appXls.Visible = False
    book = appXls.Workbooks.Open(Fichier)
    book.Close() : book = Nothing : appXls.Visible = True : appXls.Quit() : appXls = Nothing
    J'imagine que j'oublie de fermer quelque chose mais je n'arrive pas à voir quoi ?
    Oui, du moment que tu ne pilotes plus Excel par automation, tu n'as plus besoin de ce bout de code (voir ci-dessus, dans la citation).

  15. #15
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Oui, du moment que tu ne pilotes plus Excel par automation, tu n'as plus besoin de ce bout de code (voir ci-dessus, dans la citation).
    Tu as raison, c'est bien ça qui pose problème. Le soucis est que j'ai besoin de ce code pour récupérer le numéro de la première ligne où il n'y a pas de valeur.

    Mais effectivement, lorsque je code en dur les valeurs trouvées par ce petit bout de code, ça fonctionne sans problème !

    Me reste plus qu'à trouver l'équivalent de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rowCount = book.Worksheets("Feuil1").Range("B65536").End(Excel.XlDirection.xlUp).Row
    et j'en aurai fini avec ça

    Merci encore

    EDIT: J'ai trouvé une petite astuce pour contourner le problème, mais si tu as l'info en tête je suis preneur !

  16. #16
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Tu n'as qu'à faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT COUNT(*) FROM [données$" & Cellules & "]"

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

Discussions similaires

  1. Communication RS232-Excel : Récupération de valeurs chiffrées
    Par vba.v123 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/07/2011, 07h19
  2. [XL-2007] Macro Excel - récupération contenu valeur + moyenne
    Par clem16031983 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/12/2009, 16h27
  3. Récupération de valeurs distinctes dans excel
    Par developpeur62 dans le forum Excel
    Réponses: 1
    Dernier message: 23/10/2006, 11h41
  4. récupération de valeur de lien
    Par sex-sansbol dans le forum ASP
    Réponses: 3
    Dernier message: 07/06/2004, 10h43
  5. Récupération de valeurs d'un tableau
    Par leeloo076 dans le forum ASP
    Réponses: 12
    Dernier message: 25/03/2004, 10h59

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