Utiliser les données depuis un classeur csv.

AntoineM

XLDnaute Junior
bonjour :)

J'ai crée un fichier Excel pour consolider et comparer les données de deux autres classeurs (générés par deux logiciels autres).

Mes deux autres classeurs sont ouverts en même temps que mon classeur.
J'ai crée une macro qui :
- Copie/colle les données de chaque classeur dans les onglets de mon fichier de réconciliation correspondant
- Traite et modifie les données récupérées (avec une fonction de sous-total).

Mon problème est le suivant :
Ma macro fonctionne avec deux classeur xls mais une des deux classeurs est un .csv, et du coup ma macro bug.
Je ne sais pas comment m'y prendre étant débutant en VBA, si je crée le même fichier en xls la macro fonctionne, mais avec le fichier original en .csv ma macro ne fonctionne pas.

Voici mon code :

Code:
Sub Copiedesdonnees()

Application.ScreenUpdating = False

'Dénomination des classeurs
Dim Wbk As Workbook
Dim ClasseurSource As Workbook
Dim ClasseurDest As Workbook
Dim Classeur2 As Workbook
Dim Wsname As String

Set ClasseurSource = ThisWorkbook

For Each Wbk In Application.Workbooks
    If Left(Wbk.Name, 8) = "ISS_File" Then
        Set ClasseurDest = Wbk
               Exit For
    End If
Next Wbk

For Each Wbk In Application.Workbooks
    If Left(Wbk.Name, 8) = "LIST111_" Then
        Set Classeur2 = Wbk
               Exit For
    End If
Next Wbk

'Copie des données ISS dans feuille temporaire
ClasseurSource.Activate
Sheets.Add.Name = "ISStemp"
ClasseurSource.Sheets("ISStemp").Range("A1:I10000") = _
ClasseurDest.Sheets("Comparison details").Range("A1:I10000").Value

'Définition des sous-totaux
    Sheets("ISStemp").Range("A1").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4), _
    Replace:=True, PageBreaks:=False, SummaryBelowData:=True
    ActiveSheet.Outline.ShowLevels RowLevels:=2 'on masque les autres lignes
    
'Copie des lignes de sous total
Sheets("ISStemp").Range("A1:AZ1000").SpecialCells(xlVisible).Copy _
Destination:=Sheets("ISS").Range("A1:AZ1000")

'supression des colonnes inutiles et attribution du nom "quantité"
Columns("B:B").Select
    selection.Delete Shift:=xlToLeft
    selection.Delete Shift:=xlToLeft
Columns("C:C").Select
    selection.Delete Shift:=xlToLeft
    selection.Delete Shift:=xlToLeft
    selection.Delete Shift:=xlToLeft
    Range("B1").Value = "Quantité"
    
Sheets("ISS").Activate
Rows("1").Select
selection.Delete Shift:=xlUp

'supression des colonnes inutiles et attribution des noms
Columns("B:B").Select
    selection.Delete Shift:=xlToLeft
    selection.Delete Shift:=xlToLeft
Columns("C:C").Select
    selection.Delete Shift:=xlToLeft
    selection.Delete Shift:=xlToLeft
    selection.Delete Shift:=xlToLeft
    Range("A1").Value = "Référence"
    Range("B1").Value = "Quantité"

'supression de la ligne "total général"
Dim I As Integer
For I = [A65000].End(xlUp).Row To 1 Step -1
If Not Cells(I, 1).Find("Total général") Is Nothing Then Rows(I).Delete
Next I

'efface les 6 premiers caracteres ("Total ") dans chaque cellule
Dim Nc, Cel As Range
    For Each Cel In Range("A2", [A65000].End(xlUp))
              Nc = Len(Cel)               'compte les caractères
        Cel.Value = Right(Cel, Nc - 6)
    Next Cel
    
'Supression de la feuille ISS et activation de la feuille principale
Application.DisplayAlerts = False
Sheets("ISStemp").Delete
Application.DisplayAlerts = True
    
'Copie des données NesSoft dans l'onglet NesSoft
ClasseurSource.Activate
ClasseurSource.Sheets("Tentative").Range("A1:I10000") = _
Classeur2.Sheets(1).Range("A1:I10000").Value

ClasseurDest.Activate

'ClasseurSource.Activate
'Sheets("Pif").Activate

Application.ScreenUpdating = True

End Sub

Merci d'avanceà tous ceux qui me liront :)
 

Pièces jointes

  • essazi.xlsm
    119.4 KB · Affichages: 37

Staple1600

XLDnaute Barbatruc
Re : Utiliser les données depuis un classeur csv.

Bonjour à tous


Pour ouvrir un CSV, j'utilise ce type de code
Code:
Sub OpenCSV()
Workbooks.OpenText Filename:="C:\Temp\testtemp.csv", local:=True
End Sub

On pourrait donc imaginer un Select Case (qui testerait l'extension du fichier)
et si *.xls alors
Workbooks.Open
sinon
Workbooks.OpenText ....

Mais à la relecture de ton code, il semble que les classeurs *.xls et *.csv sont déjà ouverts, non ?
 

AntoineM

XLDnaute Junior
Re : Utiliser les données depuis un classeur csv.

Bonjour,

Désolé pour le temps de réponse !

Du coup le problème est complexe, quand le classeur est généré par mon logiciel (Que je fais un export to Excel en gros) le classeur est ouvert, j'ai donc une erreur au niveau de :
VB:
 ClasseurSource.Activate
 ClasseurSource.Sheets("Tentative").Range("A1:I10000") = _
 [U]Classeur2.Sheets(1).[/U]Range("A1:I10000").Value

Car Excel ne trouve pas mon "Classeur2".

Par contre, et chose que je ne m'explique pas étant débutant en vba, c'est que mon code fonctionne parfaitement quand je ferme le classeur généré automatiquement par mon logiciel et que je l'ouvre manuellement.

Du coup en attendant une "vrai" solution, je ferme ce classeur et je l'ouvre avec le code suivant :

VB:
Sub Extractioncsv()

Range("C10").Value = "Temp"
'
Range("C10").ClearContents


Application.ScreenUpdating = False


Dim Chemin As String
Dim Part As String


For I = 10 To Range("B" & Rows.Count).End(xlUp).Row
    Chemin = "H:\" 
    If Dir(Chemin & Range("B" & I).Value & ".csv") <> "" Then
        'Ouverture du fichier
        Workbooks.Open Filename:=Chemin & Dir(Chemin & Range("B" & I) & ".csv"), Local:=True
        nom_Csv = ActiveWorkbook.Name
    Else
    End If
Next
   
On Error Resume Next
Workbooks(nom_Csv).Activate
 If Err.Number <> 0 Then
  MsgBox "Vérifiez si vous avez correctement exporté le stock à date dans Excel depuis xx ?"

 Else

ThisWorkbook.Sheets("xx").Range("A1:AZ10000") = Workbooks(nom_Csv).ActiveSheet.Range("A1:AZ10000").Value
ThisWorkbook.Sheets("Consolidation").Activate

End If
 On Error GoTo 0

Application.ScreenUpdating = True

Car mon autre problématique (résolue) était le nom variable (en fonction de la date et de l'heure de création) de cette extraction.

J'éspère avoir été clair, sinon n'hésitez pas à me demander d'être plus précis!

Merci pour votre temps en tout cas.

Antoine
 

AntoineM

XLDnaute Junior
Re : Utiliser les données depuis un classeur csv.

Staple1600; à dit:
Mais à la relecture de ton code, il semble que les classeurs *.xls et *.csv sont déjà ouverts, non ?

Effectivement, c'est un classeur pour gérer des stocks, j'ai un outil qui me permet de compter en scannant toutes mes produits, qui génère et ouvre un classeur .xls, et un logiciel qui compte mes stocks "théorique" en fonction de mes ventes. Sur ce dernier logiciel je proccède à une extraction de mes stocks, sur un classeur qui s'ouvre alors en .csv

Mon fichier importe les chiffres de chaque classeur pour venir les comparer dans un onglet spécifique.

Sinon je pensais à un bout de code du style :

For Each Wbk
Si =/= de *.xls alors on ferme
Sinon on laisse

Comme ça la fermeture n'est pas manuelle et on évite les erreurs, mais j'ai testé et il ne ferme aucun classeur (du coup j'ai supprimé le code, mais j'avais peut être fais une erreur dessus).

Le code fonctionne bien avec un Workbooks.Open, mais par curiosité, pourquoi choisis-tu un Workbooks.OpenText? Qu'est-ce que ca offre de différent?

Merci encore pour le temps que vous m'accordez,

Antoine
 
Dernière édition:

Yaloo

XLDnaute Barbatruc
Re : Utiliser les données depuis un classeur csv.

Bonjour Antoine,

Si ton classeur est en csv pourquoi ne pas l'enregistrer en xls ou xlsx puis ensuite t'en servir normalement.
Quelque chose du style : Si .csv alors on enregistre en .xls (avec SaveAs ou SaveCopyAs) , et définir Classeur2

A+

Martial
 

AntoineM

XLDnaute Junior
Re : Utiliser les données depuis un classeur csv.

Bonjour Martial,

Je n'ai pas la main sur l'enrengistrement de mon classeur. Il est généré par logiciel qui le crée en format .csv, je ne peux pas changer cela a moins d'ouvrir le classeur et de l'enregistrer manuellement.

Ce que je veux, c'est que sur mon classeur autre que le .csv c'est récupéré les données lorsqu'il est actif. Car quand je passe par une macro ouverture, cela fonctionne.

J'aimerais simplement le traiter en direct. Je ne sais pas si j'arrive à exprimer clairement mon besoin,

Dis moi,

Merci pour ton temps
 

Yaloo

XLDnaute Barbatruc
Re : Utiliser les données depuis un classeur csv.

Si ton classeur est ouvert en csv par ton logiciel tiers, par macro tu dois pouvoir enregistrer ce classeur au format xls puis t'en servir pour faire ce que tu as à faire, me trompe-je ?

Lorsque tu boucles sur tous tes classeurs ouverts, tu enregistres le fichier en xls, tu fermes ton csv, puis tu travailles sur le xls, à la fin de ta procédure tu peux supprimer le fichier xls créé précédemment.

A+

Martial
 

Discussions similaires

Statistiques des forums

Discussions
312 229
Messages
2 086 426
Membres
103 206
dernier inscrit
diambote