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 :

Export de type CSV de 2 colonnes d'un classeur XLS


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut Export de type CSV de 2 colonnes d'un classeur XLS
    Bonjour,

    Afin d'alimenter un vieux gestionnaire de contacts (pas le choix sigh), je cherche à générer un fichier CSV à l'aide d'une macro.
    Cette dernière doit reprendre juste 2 colonnes ("nom", "numero") en provenance d'un gros annuaire au format excel.

    J'ai essayé de me dépatouiller en pondant quelques bribes de codes et quelques recherches, mais mon niveau en vba nécessite quelques lumières ><

    Plusieurs contraintes viennent en effet pimenter l'opération :

    • Les colonnes "nom" et "numero" ne se trouve pas toujours au même endroit, ne sont pas forcément adjacents et la macro doit "parcourir" la feuille afin de repérer les 2 colonnes à traiter.

    • Le classeur excel peut contenir plusieurs onglets (à traiter également donc, et à placer dans le même fichier CSV).

    Voila un début de code, je ne sais pas si on peut en faire quelques chose. Ca a l'air tout bête, pourtant mes différents essais n'étaient pas concluant, et je commence à désespérer.



    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
     
    Sub RunForrestRun()
     
        Dim ligne As Integer
        Dim colonne As Integer
        Dim i As Integer
        Dim first As Boolean
        Dim result As String
        Dim d As String
        Dim o As Worksheet
     
        Dim fso As New FileSystemObject
        Dim t As TextStream
     
        Set t = fso.OpenTextFile(ActiveWorkbook.Path & "\listing_numero.csv", ForWriting, True)
     
        Dim col_titre As New Collection
        Dim col_valeur As New Collection
     
        ' écriture entete 
        t.Write "Nom;Fax"
        t.Write vbCrLf
     
     
     
        ' boucle sur les onglets
        For Each o In ActiveWorkbook.Worksheets
            o.Select
            ligne = LIGNE_INIT
            colonne = COLONNE_LIGNE_SENS + 1
     
     ...
    Si vous avez quelques tuyaux, je suis preneur

    Merci,

    Zelnist.

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut,un 1er jet ,sans doute à adapter et améliorer : à toi d'oeuvrer
    Limitations : Pas de cellules vides dans les 2 colonnes Nom et Numero
    les "LastRow" sont identiques sinon décalage
    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
    Option Explicit
     
    Sub Tst()
    Dim Ws As Worksheet
    Dim i As Long, j As Long
    Dim Cel As Range
    Dim LastRow As Long
     
        Application.ScreenUpdating = False
        Workbooks.Add
     
        Range("A1") = "Nom"
        Range("B1") = "Numero"
        i = 2: j = 2
     
        For Each Ws In ThisWorkbook.Worksheets
            'LastRow = Split(Ws.UsedRange.Address, "$")(4)
            LastRow = Ws.Cells.SpecialCells(xlCellTypeLastCell).Row
            For Each Cel In Ws.Range("A1:IV1")
                Select Case UCase(Cel.Text)
                    Case "NOM"
                        Ws.Range(Cel.Offset(1, 0), Cel.Offset(LastRow - 1, 0)).Copy Range("A" & i)
                        i = i + LastRow - 1
                    Case "NUMERO"
                        Ws.Range(Cel.Offset(1, 0), Cel.Offset(LastRow - 1, 0)).Copy Range("B" & j)
                        j = j + LastRow - 1
                End Select
            Next Cel
        Next Ws
     
        LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
        For j = LastRow To 2 Step -1
            If Application.WorksheetFunction.CountBlank(Range(Cells(j, 1), Cells(j, 2))) = 2 Then
                Rows(j).Delete Shift:=xlUp
            End If
        Next j
     
        Application.DisplayAlerts = False
        ChDir ThisWorkbook.Path
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & "Recap.csv", FileFormat:=xlCSV, local:=True
        ActiveWindow.Close
        Application.DisplayAlerts = True
     
        Application.ScreenUpdating = True
    End Sub

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    Merci


    En rapport avec la ligne annotée, je l'avais vue, je pensais qu'il s'agissait d'un test plus qu'autre chose, un équivalent non optimisé.

    Sur mon gestionnaire, j'obtiens systématiquement les mêmes résultats , que ce soit avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LastRow = Ws.Cells.SpecialCells(xlCellTypeLastCell).Row
    ou avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LastRow = Split(Ws.UsedRange.Address, "$")(4)
    Je garde tout de même sous le coude les 2 méthodes si jamais un problème se pose

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    C'est normal que tu aies le même nombre de lignes avec ces deux codes.
    J'avais expliqué simplement qu'en cas de suppression de ligne, le premier n'en tenait pas compte tant que le classeur n'était pas enregistré. Si tu n'as pas de suppression de ligne, c'est tout ok

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut
    Effectivement, il vaut mieux utiliser ces instructions si on obtient un résultat fiable quelque soient les conditions.

    Merci pour ces suggestions

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/01/2015, 15h38
  2. Export db2 en csv
    Par Fmoussa dans le forum DB2
    Réponses: 2
    Dernier message: 08/11/2006, 16h28
  3. Réponses: 3
    Dernier message: 22/10/2006, 23h15
  4. Importation de type CSV vers Oracle8i
    Par gamma dans le forum Oracle
    Réponses: 27
    Dernier message: 18/10/2006, 16h44
  5. export fichier texte et entête de colonne - DTS
    Par REMACC1 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/02/2006, 10h58

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