Import Heure de Excel à VB.NET

Résolu
David7342 Messages postés 5 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 6 avril 2012 - 2 juin 2011 à 17:59
David7342 Messages postés 5 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 6 avril 2012 - 8 juin 2011 à 18:36
Bonjour à tous !

Tout d'abord, j'espère ne pas m'être tromper quand au rangement de ce post.

Je rencontre un soucis qui me bloque depuis pas mal de temps dans le développement d'un petit chronomètre en VB.NET.

J'ai un table excel très simple de 3 colonnes. Par exemple :
DOSSARD TEMPS COMMENTAIRES
125 02:04:56
145 02:05:22
113 02:08:12
187 02:12:20

Ensuite je viens charger ce petit tableau excel

Public Function ImportTemps(ByRef XlsFileName As String) As Data.DataTable
        Dim ExcelApplication As Application
        Dim ExcelBook As Workbook
        Dim ExcelWorksheet As Worksheet
        Dim aDataSet As New DataSet
        aDataSet.Tables.Add("TEMPS")
        ExcelApplication = CType(CreateObject("Excel.Application"), Application)
        ExcelBook = ExcelApplication.Workbooks.Open(XlsFileName)
        ExcelWorksheet = ExcelBook.Worksheets(1)

        ' ici on compte le nombre de lignes et de colonnes du datatable
        Dim nbrLigne As Integer = ExcelWorksheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Row - 1
        Dim nbrColonne As Integer = ExcelWorksheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Column
        Dim x, y As Integer

        For x = 0 To nbrColonne - 1
            ' ici on prends le titre des colonnes du datatable
            Dim aColumnName As String = ExcelWorksheet.Cells(1, x + 1).Value
            aDataSet.Tables("TEMPS").Columns.Add(aColumnName)
        Next
        For y = 0 To nbrLigne - 1
            ' pour chaque colonne et chaque ligne on transfert les données      
            Dim aRow As DataRow
            aRow = aDataSet.Tables("TEMPS").NewRow
            For x = 0 To nbrColonne - 1
                aRow.Item(x) = ExcelWorksheet.Cells(y + 2, x + 1).value
            Next
            aDataSet.Tables("TEMPS").Rows.Add(aRow)
            aRow = Nothing
        Next
        ' on quitte l'application et on détruit les objets
        ExcelApplication.Quit()
        frmPrincipale.ProgressBar.Visible = False
        frmPrincipale.ProgressBar.Value = 0
        ExcelWorksheet = Nothing
        ExcelBook = Nothing
        ExcelApplication = Nothing
        Return aDataSet.Tables("TEMPS")
        aDataSet = Nothing
    End Function


Tout fonctionne très bien à part le fait que lorsque les cellules de la colonne 'TEMPS' sont chargés, ces temps sont automatiquement transformés en 'Double' ce qui me donne :
02:04:56 ==> 0,0867592592592593
02:05:22 ==> 0,0870601851851852
02:08:12 ==> 0,0890277777777778
02:12:20 ==> 0,0918981481481482

et donc impossible de récupérer une heure... :'(

Voilà en espérant avoir été clair !

Je reste à disposition,

Mille Merci

David

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 juin 2011 à 08:26
Salut

Oui, les temps et dates sont stockées au format Double dans Excel. Seule le formatage d'affichage permet de les voir 'correctement'.
Donc, sous Excel, qui dit "formatage d'affichage" dit lecture des données par .Value2 ou .Text

Pour transformer un Double en heure, tu dois :
- Multiplier ce chiffre par 24 (heures)
- Transformer la partie décimale en minutes en la divisant par 60
- Transformer la partie décimale restante en secondes en la divisant par 60
Exemple
0,0867592592592593 * 24 = 2.082222
Enlève la partie entière = heures
0.082222 * 60 = 4.9333
Enlève la partie entière = minutes
0.9333 * 60 = 56 secondes

Sinon, tu peux aussi affiner ton code :
Quand tu déclares tes colonnes dans ta table, tu ne précises aucun type.
Je pense que si tu lui disais que la colonne a un format Date/Heure, il pourrait peut-être (pas testé) faire la conversion seul.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
David7342 Messages postés 5 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 6 avril 2012
8 juin 2011 à 18:36
Bonjour,

Et désolé de la réponse tardive,

Mais merci beaucoup de ces précisions, je ne connaissais pas du tout ces méthodes !

En tout problème résolu !

Merci encore !

David
0
Rejoignez-nous