maestro1303
Messages postés37Date d'inscriptionmardi 18 juillet 2006StatutMembreDernière intervention 7 décembre 2019
-
10 avril 2007 à 15:55
maestro1303
Messages postés37Date d'inscriptionmardi 18 juillet 2006StatutMembreDernière intervention 7 décembre 2019
-
15 avril 2007 à 12:35
Bonjour à tous, je suis débutant et j'ai de très gros fichiers séparés par des virgules (format csv).
Mon premier problème était de mettre automatiquement le texte dans plusieurs feuilles. Mais depuis que j'ai trouvé sur le net le script suivant, ce problème a été reglé.
Sub ImportGrosFichier()
'
' Macro1 Macro
' Macro enregistrée le 2007.02.08 par Admin
'
'Attribute VB_Name = "ImportVeryBigTextFile"
'Importer dans un classeur un fichier texte de grande taille
'(ajoute des feuilles chaque fois que le fichier importé
'remplit 65000 lignes)
'Sören Lindqvist, mpep
'""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'Dimension Variables
Dim ResultStr As String
Dim FileName As String
Dim FileNum As Integer
Dim Counter As Double
FileName = "C:\cdrmaurit.txt"
'If you want an inputbox use the below:
'InputBox("Write name of file and path")
If FileName = "" Then End
FileNum = FreeFile()
Open FileName For Input As #FileNum
Application.ScreenUpdating = False
Workbooks.Add template:=xlWorksheet
Counter = 1
Do While Seek(FileNum) <= LOF(FileNum)
Application.StatusBar = "Importerar Rad " & _
Counter & " xxxx TextFil " & FileName
Line Input #FileNum, ResultStr
If Left(ResultStr, 1) = "=" Then
ActiveCell.Value = "'" & ResultStr
Else
ActiveCell.Value = ResultStr
End If
If ActiveCell.Row = 55536 Then
' I'll need some space below
'If file is larger than (65500.st)
ActiveWorkbook.Sheets.Add
Else
ActiveCell.Offset(1, 0).Select
End If
Counter = Counter + 1
Loop
Close
Application.StatusBar = False
End Sub
Mon deuxième problème est que je n'arrive pas à personnaliser cet import car tout est mis dans une seule colonne sans séparateur!!!
Or je veux dans le code précédent introduire le fait qu'il prenne en compte le format csv et me mettre à la place d'une virgule un saut de colonne . COMMENT SVP?
Ce code suivant est tiré d'une macro qui, justement travaille dans ce sens (respect du format csv)
With ActiveSheet.QueryTables.Add(Destination:=Range("A1"))
.Name = "17032007"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 2, 2, 2, 2, 2)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Comment peut on par exemple insérer efficacement ce code dans le code précedent! ou trouver une autre parade à mon souci!
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 11 avril 2007 à 00:58
Peut-être en utilisant le DataObject d'Excel (?)
C'est un genre de ClipBoard d'Excel
Pour l'utiliser, tu dois créer une référence à Microsoft Forms 2.0 Object Library
Il suffirait de lire 65000 lignes du fichier, disons, et tout stocker dans une variable String
Ensuite, tu te sers du DataObject pour stocker cette variable
Finalement, tu colles cette variable dans la feuille
Je le fais avec divers fichiers et ça conserve le format des colonnes et aucun réajustement n'est nécessaire par la suite.
Mais comme je ne peux faire le test avec tes fichiers, c'est difficile à dire si ça fonctionnera dans ton cas...
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 14 avril 2007 à 11:40
Pour créer une référence, tu vas dans le menu Outils / Références de l'IDE Excel (là où tu codes)
Ensuite, tu déclares un objet DataObject pour pouvoir l'utiliser
Dim MyDataObject as DataObjet
Donc, premièrement
Tu lis ton fichier jusqu'à ce que le compteur soit rendu à 65000
FF = FreeFile
Open "MonFichier" For Input as #FF
Do Until EOF(FF)
Line Input #FF, strTemp 'lecture d'une ligne
strResult = strResult & strTemp 'stocker chaque ligne lue
compteur = compteur + 1
If compteur = 65000 then
Call ÉcrireDonnées(strResult) 'appel de la fonction avec le texte à écrire
compteur = 0 'se préparer pour le reste du fichier
strResult = ""
End If
Loop
.....
Et tu crées une fonction pour écrire ton texte
Sub ÉcrireDonnées(LeTexte as string)
Dim MyDataObject As DataObject
'Ici, tu peux remplacer le séparateur, si nécessaire
'remplacer les virgules par des points-virgules (ou autre chose)
LeTexte = Replace(LeTexte, ",", ";")
Set MyDataObject = New DataObject
'définir le texte que l'objet va utiliser
MyDataObject.SetText LeTexte
'l'envoyer dans le presse-papier
MyDataObject.PutInClipboard
'copier ce texte dans la feuille - la créer ou la choisir au préalable
Sheets("Feuille").Range("A1").PasteSpecial
'vider le presse-papier
MyDataObject.Clear
End sub
NB: J'ai écrit ce bout de code à main levée sans tester, mais ça devrait ressembler à ça.
maestro1303
Messages postés37Date d'inscriptionmardi 18 juillet 2006StatutMembreDernière intervention 7 décembre 2019 15 avril 2007 à 12:35
Merci MPi,
Ta lettre m'apprend certainement beaucoup de choses. Mais je ne sais pas si tu as compris ma question; car tu me parle de créer des feuilles. Le programme que j'ai envoyé et que j'ai pris sur le site Microsoft, crée autnat de feuilles que nécessaire. Mais dans chaque feuille il met toutes les données dans une même colonne, la colonne A.
Donc ce programme ne tient pas compte des séparateurs, et il met tout en vrac dans la colonne A de chaque feuille et c'est ça qui me crée tous ces problèmes.
Je pensais que je pouvais trouver un petit bout de code à mettre (en fonction des données à importer, notamment le nombre de colonnes du fichier d'import) à l'intérieur de programme qui met un fichier volumineux entre plusieurs feuilles et dont j'ai envoyé la source.