Récupération de données .csv dans une macro
Bonjour à toutes et à tous,
Je me présente brièvement. Je suis actuellement en DUT Génie électrique et informatique industrielle en 2eme année. J'ai un stage en entreprise à réaliser et je suis bloqué sur une amélioration technique que j'aimerais apporter à un document excel.
J'ai fait énormément de recherches avant de venir vers vous et essayez beaucoup de choses, mais sans succès.
Mon objectif: Je dispose d'un fichier .csv que j'ouvre en fonction de 2 paramètres, la date et le nom du produit. J'arrive à créer mon chemin pour ouvrir ce fichier, j'arrive aussi a l'ouvrir sous forme de tableau et non de texte. Je dois ensuite récupérer des données pour effectuer des calculs. C'est ici que je bloque. Il m'est impossible de récupérer les données de mon tableau. J'ai essayer différentes cellules mais rien n'y fait. J'ai aussi essayer de récupérer les premières cases dans un type string mais même là j'obtient une variable vide.
Auriez-vous des suggestions ?
Pour des raisons de confidentialités je ne peux pas vous donner les fichiers excel et csv sur lesquels je travaille mais je peux vous montrer la partie du code qui me pose problème.
Sub AutoFill()
'Variables
Dim iLastRowProd, iLastRowData, iOT As Integer
Dim dOT As Double
Dim dOpenning, dClosing As Date
Dim sOT As String
Set Destination = ActiveSheet
Application.DisplayAlerts = False
iLastRowProd = Destination.Range("A" & Rows.Count).End(xlUp).Row 'Last filling row
If iLastRowProd < 4 Then 'to begin at the row number 5
iLastRowProd = 4
End If
Destination.Select
sPath = Workbooks(ActiveWorkbook.Name).Path 'get the path of the folder
sPath = sPath & "\"
'create the complete path of the file depending on the product name and the date of the last row
sName = Destination.Cells(iLastRowProd, 5) 'get the product name
sName = sName & "_normal_"
sName = sName & DateTime.Day(Destination.Cells(iLastRowProd, 1)) & "_" 'get the production date
sName = sName & DateTime.Month(Destination.Cells(iLastRowProd, 1)) & "_"
sName = sName & DateTime.Year(Destination.Cells(iLastRowProd, 1))
'******************to open a file .csv as a .xls*********************************
Workbooks.Open Filename:=(sPath & sName & ".csv")
Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
Semicolon:=True
'********************************************************************************
Set Data = ActiveSheet
iLastRowData = Data.Range("A" & Rows.Count).End(xlUp).Row 'Last filling row
dOT = Data.Cells(10, 6).Value
End SubJ'ai déjà essayé les choses suivantes:
- Sauvegarder au format .xls/.xlsm/.xlsx et utiliser ce fichier
- Utiliser une macro pour transformer le fichier .csv en .xls et utiliser ce fichier
- Créer une copie aux formats .xls/.xlsm/.xlsx et utiliser la copie
Rien de tout ceci marche. La seule chose que je suis capable de faire c'est de chercher la dernière ligne remplie du fichier.
De plus, j'ai simplement besoin de lire des données, aucune modification ne doit être faite sur le .csv
Voilà, j'espère avoir énoncé clairement mon problème et qu'il vous inspirera de nombreuses solutions
Merci d'avance et bonne journée à toutes et à tous.
Bonjour,
proposition de modification de ta macro.
Sub AutoFill()
'Variables
Dim iLastRowProd, iLastRowData, iOT As Integer
Dim dOT As Double
Dim dOpenning, dClosing As Date
Dim sOT As String
Set Destination = ActiveSheet
Application.DisplayAlerts = False
iLastRowProd = Destination.Range("A" & Rows.Count).End(xlUp).Row 'Last filling row
If iLastRowProd < 4 Then 'to begin at the row number 5
iLastRowProd = 4
End If
Destination.Select
sPath = Workbooks(ActiveWorkbook.Name).Path 'get the path of the folder
sPath = sPath & "\"
'create the complete path of the file depending on the product name and the date of the last row
sName = Destination.Cells(iLastRowProd, 5) 'get the product name
sName = sName & "_normal_"
sName = sName & DateTime.Day(Destination.Cells(iLastRowProd, 1)) & "_" 'get the production date
sName = sName & DateTime.Month(Destination.Cells(iLastRowProd, 1)) & "_"
sName = sName & DateTime.Year(Destination.Cells(iLastRowProd, 1))
'******************to open a file .csv as a .xls*********************************
set csvwb=Workbooks.Open(Filename:=(sPath & sName & ".csv"))
set data=csvwb.sheets(1)
data.Columns("A:A").TextToColumns Destination:=data.Range("A1"), DataType:=xlDelimited, _
Semicolon:=True
'********************************************************************************
iLastRowData = Data.Range("A" & Rows.Count).End(xlUp).Row 'Last filling row
dOT = Data.Cells(10, 6).Value
End SubBonjour h2so4,
Merci pour la rapidité de ta réponse tout d'abord.
Le code fonctionne comme l'ancien, la mise en page est correcte tout est affiché sous forme de lignes et de colonnes.
Mais lorsque je met un point d'arrêt sur la dernière ligne:
dOT = Data.Cells(10, 6)Je devrais obtenir une valeur que j'ai mise par défaut, 99.99 et j'obtient toujours 0, comme précédemment.
J'ai aussi essayé avec un Cell().Value et un Cell().Text
Si vous avez d'autres idées je suis preneur.
Bonne fin de journée!
bonjour,
et que contient cette cellule F10 ?
Bonjour,
Elle contient 99.99 quand j'ouvre mon fichier .csv
Bonjour,
Je viens de faire un test de copier/coller et lorsque je copie/colle la cellule F10 par exemple, j'obtient bien la valeur 99.99 mise par défaut. Donc je ne comprend vraiment pas pourquoi je ne peux pas stocker cette valeur dans une variable...
bonjour,
si dot vaut 0 c'est qu'il n'y a rien ou zéro en F10.
mets
msgbox data.cells(10,6)
msgbox data.cells(10,1)
juste avant l'instruction
dOT = Data.Cells(10, 6)
et regarde d'où pourrait provenir l'erreur
Les message box affichent les bons résultats pour les deux cellules.
Mais quand je passe mon curseur sur ma variable dOT j'obtient encore 0, je ne vois vraiment pas d'où ça peut provenir, j'ai déjà essayé avec différents types pour ma variable mais rien à faire.
Bonjour,
si tu passes ton curseur sur la variable alors que la ligne est jaune, c'est normal que tu aies 0, l'instruction n'a pas encore été exécutée.
Bonjour,
Oui je viens de voir ça en fait tout fonctionne --'
Désolé pour la perte de temps !