Import de texte sur plusieurs feuilles

maestro1303 Messages postés 37 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 7 décembre 2019 - 10 avril 2007 à 15:55
maestro1303 Messages postés 37 Date d'inscription mardi 18 juillet 2006 Statut Membre Derniè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!

Merci infiniment!

4 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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...

MPi
0
maestro1303 Messages postés 37 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 7 décembre 2019
14 avril 2007 à 10:09
Bonjour, Merci de votre réponse
Mais je ne sais pas ce qu'est DAta Object Excel, ni ce qu'est Microsoft Forms 2.0 Object Library ni où ça se trouve!


Il serait pourtant intéressent de savoir comment fonctionne ta solutoion!


Pour ce qui est de ma part, et comme je l'ai expliqué dans mon mail, je veux que dans chaque feuille l'import soit suivant :


1. Les tabulations


ou


2.Les Point virgules


ou


3.Les  virgules

Merci infiniment!
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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.

MPi
0
maestro1303 Messages postés 37 Date d'inscription mardi 18 juillet 2006 Statut Membre Derniè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.
 
Merci infiniment!
0
Rejoignez-nous