David7342
Messages postés5Date d'inscriptionjeudi 2 juin 2011StatutMembreDernière intervention 6 avril 2012
-
2 juin 2011 à 17:59
David7342
Messages postés5Date d'inscriptionjeudi 2 juin 2011StatutMembreDerniè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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)