IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

importer fichier long


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut importer fichier long
    bonsoir à tous

    je voudrais importer un long fichier texte avec 1000 colonnes environ,
    je veux qu'il soit réparti sur plusieurs feuilles !
    j'ai le code suivant mais ca ne marche pas
    Merci bcp pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub Fichier_TXT_Volumineux()
    Dim Resultat, Chemin As String
    Dim Lecture As Integer
    Dim Compteur As Variant
    Chemin = Application.GetOpenFilename
    If Chemin = "" Then End
    Lecture = FreeFile()
    Open Chemin For Input As #Lecture
    Application.ScreenUpdating = False
    Compteur = 1
    Do While Seek(Lecture) <= LOF(Lecture)
    Line Input #Lecture, Resultat
    ActiveCell.Value = Resultat
    If ActiveCell.Row = 65536 Or ActiveCell.Column = 256 Then
    ActiveWorkbook.Sheets.Add
    Else
    ActiveCell.Offset(1, 0).Select
    End If
    Compteur = Compteur + 1
    Loop
    Close
    Application.ScreenUpdating = True
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    j'ai le code suivant mais ca ne marche pas
    C'est à dire message d'erreur ? Le résultat n'est pas celui attendu ?

    Merci d'être clair dans vos explications.

    Philippe

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    oui voila ce n'est pas le résultat attendu
    j'ai un fichier avec 1031 colonnes
    je veux que chaque 256 colonnes soient affiché dans une feuille du même classeur
    pouvez vous m'aider ?

  4. #4
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    bonjour,

    d'après ce que je peux voir, ton code copie une ligne de ton fichier texte sur une cellule, la ligne suivante est copiée sur la cellule du dessous, etc...
    ton code ajoute une feuille dès qu'il arrive à la ligne 65536 sur ton fichioer excel

    Aussi, il y a une variable compteur dont l'utilité n'est pas claire...

    il y a t-il un délimiteur de colonnes dans le fichier texte?

    ce que tu dois faire, c'est d'abord découper la ligne par tranche de 256 colonnes( soit en 5 ), copier chaque partie de la ligne sur une feuille distincte. ensuite, seulement passer à la ligne suivante.

    si on dépasse 65536 lignes, recréer 5 feuilles et continuer l'opération sur ces 5 feuilles, jusqu'a la fin du balayage du fichier texte.

    voilà en gros ce que j'ai déduis/compris de ton probleme

    si tu as des questions...
    Alleï Bonjour chez vous!

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    oui effectivement c'est ce que je veux faire mais je suis débutant en vba
    si tu peux m'aider stp ?

  6. #6
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    je peux mais il faut répondre a toutes les questions
    il y a t-il un délimiteur de colonnes dans le fichier texte?
    Alleï Bonjour chez vous!

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    oui le |
    Si vous avez un email je peux vous envoyer le fichier !

  8. #8
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    voici un peu à quoi le code devrais ressembler

    a adapter selon les besoins

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Sub Fichier_TXT_Volumineux()
    Dim Resultat, Chemin As String
    Dim Lecture As Integer
    Dim tRow, R, C, S, Sh, NS
    Dim Compteur As Variant
    Dim MS As Worksheet
    Dim nbFeuilles As Integer, nbCol As Integer, StartCol As Integer
     
    Chemin = Application.GetOpenFilename
     
    If Chemin = "False" Then Exit Sub
     
    Lecture = FreeFile()
    Open Chemin For Input As #Lecture
    Application.ScreenUpdating = False
    R = 1
    'le nombre de feuilles nécessaires est colonne de départ- nb de colonnes / 256 arrondi au dessous
    StartCol = 600
    nbCol = 1031
    nbFeuilles = Fix((nbCol - StartCol) / 256)
     
    'on ne laisse que nbfeuilles feuilles
    If Sheets.Count > nbFeuilles Then
        For S = nbFeuilles + 1 To Sheets.Count
            Sheets(S).Delete
        Next S
    Else
        If Not Sheets.Count = nbFeuilles Then
            For S = Sheets.Count To nbFeuilles - 1
                Sheets.Add
            Next S
        End If
    End If
    S = 0
     
    Do While Not EOF(Lecture)
        Line Input #Lecture, Resultat
        'on splitte la ligne par colonne
        tRow = Split(Resultat, "|")
        C = 1: NS = 1
        'on saute les trois premère ligne
        If Not Left(Trim(tRow(0)), 1) = "#" Then
            'on copie à partie de la colonne 600
            For S = StartCol - 1 To nbCol - 1
                'on défini la feuille de destination
                If C > 256 Then
                    C = 1
                    Sh = Sh + 1
                End If
                'on copie la donnée dans la cellule
                Sheets(Sh).Cells(R, C) = tRow(S)
                C = C + 1
            Next S
            S = 0
            R = R + 1
            'si on dépasse les 65536 lignes on ajoute des feuilles si elle n'existent pas encore
            If R > 65536 Then
                On Error Resume Next
                Set MS = Sheets(Sh + nbFeuilles)
                On Error GoTo 0
                If MS Is Nothing Then Sheets.Add , Sheets(Sheets.Count), nbFeuilles
                R = 1
            End If
        End If
    Loop
     
    Close
     
    Application.ScreenUpdating = True
     
    End Sub
    les explication sont en commentaires

    PS: j'ai pas pu tout tester
    Alleï Bonjour chez vous!

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    merci beaucoup

    Mais quand je le teste il me permet de choisir le fichier mais après il me sort un message " les feuilles sélectionnées peuvent contenir des données" si j'appuie sur supprimer, il supprime la feuille active. Par la suite, la fenetre du vba maffiche le message
    Erreur d'éxécution '9'
    après débogage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Sh).Cells(R, C) = tRow(S)
    ==> devient jaune


  10. #10
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    c'est exact

    au temps pour moi!

    voici le corrigé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Sub Fichier_TXT_Volumineux()
    Dim Resultat, Chemin As String
    Dim Lecture As Integer
    Dim tRow, R, C, S, Sh, NS
    Dim Compteur As Variant
    Dim MS As Worksheet
    Dim nbFeuilles As Integer, nbCol As Integer, StartCol As Integer
     
    Chemin = Application.GetOpenFilename
     
    If Chemin = "False" Then Exit Sub
     
    Lecture = FreeFile()
    Open Chemin For Input As #Lecture
    Application.ScreenUpdating = False
    R = 1
    Sh = 1
     
    'le nombre de feuilles nécessaires est colonne de départ- nb de colonnes / 256 arrondi au dessous
    StartCol = 600
    nbCol = 1031
    nbFeuilles = Fix((nbCol - StartCol) / 256) + 1
     
    'on ne laisse que nbfeuilles feuilles
    Application.DisplayAlerts = False
    If Sheets.Count > nbFeuilles Then
        Do While Sheets.Count > nbFeuilles
            Sheets(1).Delete
        Loop
    Else
        If Not Sheets.Count = nbFeuilles Then
            For S = Sheets.Count To nbFeuilles - 1
                Sheets.Add
            Next S
        End If
    End If
    Application.DisplayAlerts = True
    S = 0
     
    Do While Not EOF(Lecture)
        Line Input #Lecture, Resultat
        'on splitte la ligne par colonne
        tRow = Split(Resultat, "|")
        C = 1: NS = 1
        'on saute les trois premère ligne
        If Not Left(Trim(tRow(0)), 1) = "#" Then
            'on copie à partie de la colonne 600
            For S = StartCol - 1 To nbCol - 1
                'on défini la feuille de destination
                If C > 256 Then
                    C = 1
                    Sh = Sh + 1
                End If
                'on copie la donnée dans la cellule
                Sheets(Sh).Cells(R, C) = tRow(S)
                C = C + 1
            Next S
            S = 0
            R = R + 1
            'si on dépasse les 65536 lignes on ajoute des feuilles si elle n'existent pas encore
            If R > 65536 Then
                On Error Resume Next
                Set MS = Sheets(Sh + nbFeuilles)
                On Error GoTo 0
                If MS Is Nothing Then Sheets.Add , Sheets(Sheets.Count), nbFeuilles
                R = 1
            End If
        End If
        'on redéfinit la feuille de destination
        Sh = Sheets.Count - nbFeuilles + 1
    Loop
     
    Close
     
    Application.ScreenUpdating = True
     
    End Sub
    Alleï Bonjour chez vous!

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    ca marche à merveille merci beaucoup vous me sauvez la vie
    Pour la ligne ou ya les titres ya moyens de la mettre sur toutes les feuilles ?
    et si je veux que les feuilles qu'il crée soit ouvert avec un autre classeur pas dans le classeur ou s'éxécute la macro

  12. #12
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    Alors, un exemple pour répondre à tes questions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Option Explicit
     
    Dim tRow As Variant, NS As Variant
    Dim R As Integer
    Dim nbFeuilles As Integer, nbCol As Integer, StartCol As Integer
    Dim WB As Workbook
    Sub Fichier_TXT_Volumineux()
    Dim Resultat, Chemin As String
    Dim Lecture As Integer, Sh As Integer
     
    Chemin = Application.GetOpenFilename
     
    If Chemin = "False" Then Exit Sub
     
    Lecture = FreeFile()
    Open Chemin For Input As #Lecture
    Application.ScreenUpdating = False
    R = 1
    Sh = 1
     
    'le nombre de feuilles nécessaires est colonne de départ- nb de colonnes / 256 arrondi au dessous
    StartCol = 600
    nbCol = 1031
    nbFeuilles = Fix((nbCol - StartCol) / 256) + 1
     
    'on ouvre nouveaux book & on ne laisse que nbfeuilles feuilles
    Application.DisplayAlerts = False
    Set WB = Workbooks.Add
    If WB.Sheets.Count > nbFeuilles Then
        Do While WB.Sheets.Count > nbFeuilles
            WB.Sheets(1).Delete
        Loop
    Else
        If Not WB.Sheets.Count = nbFeuilles Then
            Do While WB.Sheets.Count < nbFeuilles
                WB.Sheets.Add
            Loop
        End If
    End If
    Application.DisplayAlerts = True
     
    Do While Not EOF(Lecture)
        Line Input #Lecture, Resultat
        'on splitte la ligne par colonne
        tRow = Split(Resultat, "|")
        'on saute les trois premère ligne
        If Not Left(Trim(tRow(0)), 1) = "#" Then
            'on considére la première ligne comme étant les noms de champs
            'on les place dans une variable
            If IsEmpty(NS) Then NS = tRow
            'on copie les données
            CopyData tRow, Sh, R
            R = R + 1
            'si on dépasse les 65536 lignes on ajoute des feuilles si elle n'existent pas encore
            If R > 3 Then
                WB.Sheets.Add , WB.Sheets(WB.Sheets.Count), nbFeuilles
                Sh = Sh + nbFeuilles
                'on copie les noms de champs
                CopyData NS, Sh
                R = 2
            End If
        End If
    Loop
     
    Close
     
    Application.ScreenUpdating = True
     
    End Sub
     
    Private Sub CopyData(ByVal NR As Variant, ByVal StartSheet As Integer, Optional DestRow As Integer = 1)
    Dim C As Integer, S As Integer
     
    C = 1
     
    'on copie à partie de la colonne 600
    For S = StartCol - 1 To nbCol - 1
        'on défini la feuille de destination
        If C > 256 Then
            C = 1
            StartSheet = StartSheet + 1
        End If
        'on copie la donnée dans la cellule
        WB.Sheets(StartSheet).Cells(DestRow, C) = NR(S)
        C = C + 1
    Next S
     
    End Sub
    Alleï Bonjour chez vous!

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    merci bcp
    c'est exactement ce ke je voulé merci de mavoir aidé !

  14. #14
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    de rien

    heureux d'avoir pu t'aider
    Alleï Bonjour chez vous!

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 17
    Points
    17
    Par défaut calcul avec une boucle
    Bonsoir à tous,

    J'ai le code suivant pour faire des calculs dans une feuille, je veux que ma macro me fasse les calculs jusqu'à la ligne 676 dans les deux colonnes A et B, les deux equation ne sont pas fixes je les changerai par la suite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sheets("Feuil1").Select
     
    i = 2
        Range("A1").Select
        ActiveCell.FormulaR1C1 = "T"
     
        Range("B1").Select
        ActiveCell.FormulaR1C1 = "Attach Failure Ratio"
     
        Do While ??? ''''''' jusqu'a la ligne 676
        Range("A&i").Select
        ActiveCell.FormulaR1C1 = _
            "=('Données(4)'!R[3]C[113]+'Données(4)'!R[3]C[115]+'Données(4)'!R[3]C[101]+'Données(4)'!R[3]C[103]+'Données(4)'!R[3]C[105]+'Données(4)'!R[3]C[107])"
     
        Range("B&i").Select
        ActiveCell.FormulaR1C1 = _
            "=('Données(4)'!R[3]C[215]+'Données(4)'!R[3]C[212]+'Données(4)'!R[3]C[225]-RC[-1])/('Données(4)'!R[3]C[215]+'Données(4)'!R[3]C[212]+'Données(4)'!R[3]C[195]+'Données(4)'!R[3]C[193])"
        i = i + 1
        Loop

    NB: Le code ne marche pas

  16. #16
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    bonjour,

    je n'ai pas testé les formules
    mais je pense que ton problemes était la boucle

    j'ai modifié le code en ce sens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub marchepas()
    Dim I
    Dim sh As Worksheet
     
    'définir une référence sur la feuille
    Set sh = Sheets("Feuil1")
     
    'ligne de départ
    I = 2
     
    'attribuer des valeurs
    sh.Range("A1").Value = "T"
    sh.Range("B1").Value = "Attach Failure Ratio"
     
    'départ de la boucle
    Do Until I = 676    'I étant le numéro de ligne, on boucle jusque la 676eme
        sh.Cells(I, 1).FormulaR1C1 = _
            "=('Données(4)'!R[3]C[113]+'Données(4)'!R[3]C[115]+'Données(4)'!R[3]C[101]+'Données(4)'!R[3]C[103]+'Données(4)'!R[3]C[105]+'Données(4)'!R[3]C[107])"
        sh.Cells(I, 2).FormulaR1C1 = _
            "=('Données(4)'!R[3]C[215]+'Données(4)'!R[3]C[212]+'Données(4)'!R[3]C[225]-RC[-1])/('Données(4)'!R[3]C[215]+'Données(4)'!R[3]C[212]+'Données(4)'!R[3]C[195]+'Données(4)'!R[3]C[193])"
        I = I + 1
    Loop
     
    End Sub
    Alleï Bonjour chez vous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQLServer]Script import fichier .txt
    Par Jenbi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/08/2006, 16h49
  2. import fichier
    Par chbruno dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/04/2005, 12h26
  3. [IMPORTER] fichier .xls vers postgresql
    Par gloogloo dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 31/03/2005, 11h30
  4. Import fichier ASCII dans une base
    Par pithier dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/02/2005, 19h03
  5. Pb import fichier txt avec lignes de longueurs diverses
    Par zebulon90 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2004, 08h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo