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 :

Macro fichier ajouté [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 25
    Points
    25
    Par défaut Macro fichier ajouté
    Bonjour,

    j'ai un petit soucis avec la création d'une macro "import de fichier CSV".

    En effet, j'ai 2 fichiers :

    - un data.xls qui est mon tableau principal à remplir
    - un fichiers à importer en format CSV contenant mes données à importer dans data.xls.

    J'ai donc fait un début de macro sur la feuille data.xls qui m'ouvre une fenetre pour sélectionner mon csv.

    Mais une fois cette sélection faite, je voudrais que mon tableau data se remplisse en respectant certaines conditions.

    mon fichier CSV à importer se compose comme ceci :

    A;3;144;Mickey;Blanc
    A;4;152;Popeye;Vert
    B;4;141;Donald;Vert
    C;5;135;Dingo;Blanc

    ligne;colonne;Numero;Designation;Couleur

    mon fichier data se compose comme ceci :

    Un tableau avec des cellules A, B C
    et des colonnes numérotées.

    Je voudrais qu'en fonction de la ligne et de la colonne, mes trois données Numéro/Designation/Couleur se copie dans mon tableau.
    Tout ceci de façon automatique car mon tableau data peut éventuellement etre plus grand.

    je vous joins mes 2 fichiers, ce sera surement plus parlant.

    Merci d'avance à qui voudra bien m'aider
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Juste une question. Tu parles d'automatisation de ton fichier csv. Cependant que je prends l'exemple que tu donnes tu as déjà fait la conversion en fonction des points virgule.

    Ma question est donc : ton fichier cvs sera déjà converti (c'est-à-dire avec chaque élément dans une colonne séparée) ou alors contiendra-t-il tout sur une même colonne comme un fichier csv clasique ?

    Re !

    Voici le code que je te propose qui fonctionne pour un vrai fichier csv (en tout cas, il fonctionne chez moi ! ^^)

    Tu le lance depuis le bouton que tu as placé dans ton fichier data et puis tout se fait tout seul ! =D

    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
    Sub ImprotCSV()
    Dim table() As String
    Dim lig As Integer
    Dim cl As Range
    Dim off1 As Integer
    Dim off2 As Integer
     
    With Application.FileDialog(msoFileDialogFilePicker)
        .InitialFileName = "C:\"
        .Show
        If .SelectedItems.Count > 0 Then Workbooks.Open (.SelectedItems(1))
    End With
     
    With ActiveWorkbook.Worksheets("Fichiers à importer")
        lig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).row
        ReDim table(1 To 5, 1 To lig)
        For i = 0 To lig - 1
            Set cl = .Range("A1").Offset(i, 0)
            off1 = InStr(cl.Value, ";")
            table(1, i + 1) = Left(cl.Value, off1 - 1)
     
            For j = 2 To 4
                off2 = InStr(off1 + 1, cl.Value, ";")
                table(j, i + 1) = Mid(cl.Value, off1 + 1, off2 - off1 - 1)
                off1 = off2
            Next j
     
            table(5, i + 1) = Right(cl.Value, Len(cl.Value) - off1)
        Next i
    End With
     
    ActiveWorkbook.Close
     
    With Worksheets("Data")
        For i = 1 To lig
            Set cl = .Cells(.Columns(1).Find(table(1, i), LookIn:=xlFormulas, lookat:=xlWhole).row - 1, .Rows(1).Find(table(2, i), LookIn:=xlFormulas, lookat:=xlWhole).Column)
            For j = 0 To 2
                cl.Offset(j, 0) = table(3 + j, i)
            Next j
        Next i
    End With
     
    End Sub
    Tiens moi au courant !
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Bonjour Kimy_Ire

    j'ai testé ce que tu me proposes et cela marche à la perfection.

    C'est exactement ce que je cherchais. Merci

    Je vais peut etre abuser, mais j'aurais voulu savoir si je pouvais ajouter un détail ? cad pour toutes les cases vides, je voudrais renseigner désignation et nom par des valeurs par défaut. Si cellule vide, désignation = "WAIT" et nom "WAIT". Est-ce possible ?

    Merci beaucoup

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    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
    Sub ImprotCSV()
    Dim table() As String
    Dim lig As Integer
    Dim cl As Range
    Dim off1 As Integer
    Dim off2 As Integer
     
    With Application.FileDialog(msoFileDialogFilePicker)
        .InitialFileName = "C:\"
        .Show
        If .SelectedItems.Count > 0 Then Workbooks.Open (.SelectedItems(1))
    End With
     
    With ActiveWorkbook.Worksheets("Fichiers à importer")
        lig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).row
        ReDim table(1 To 5, 1 To lig)
        For i = 0 To lig - 1
            Set cl = .Range("A1").Offset(i, 0)
            off1 = InStr(cl.Value, ";")
            table(1, i + 1) = Left(cl.Value, off1 - 1)
     
            For j = 2 To 4
                off2 = InStr(off1 + 1, cl.Value, ";")
                table(j, i + 1) = Mid(cl.Value, off1 + 1, off2 - off1 - 1)
                off1 = off2
            Next j
     
            table(5, i + 1) = Right(cl.Value, Len(cl.Value) - off1)
        Next i
    End With
     
    ActiveWorkbook.Close
     
    With Worksheets("Data")
        For i = 1 To lig
            Set cl = .Cells(.Columns(1).Find(table(1, i), LookIn:=xlFormulas, lookat:=xlWhole).row - 1, .Rows(1).Find(table(2, i), LookIn:=xlFormulas, lookat:=xlWhole).Column)
            For j = 0 To 2
                cl.Offset(j, 0) = table(3 + j, i)
            Next j
        Next i
     
        Set cl = .Cells(.Columns(1).Find("A", LookIn:=xlFormulas, lookat:=xlWhole).row - 1, .Rows(1).Find(1, LookIn:=xlFormulas, lookat:=xlWhole).Column)
        For i = 0 To .Rows(1).Find("*", , , , xlByColumns, xlPrevious).Columns - 1
            For j = 0 To .Columns(1).Find("*", , , , xlByColumns, xlPrevious).row - 1
                If j + 1 <> 3 * Int((j + 1) / 3) Then
                    If cl.Offset(j, i) = "" Then
                        cl.Offset(j, i) = "WAIT"
                    End If
                End If
            Next j
        Next i
     
    End With
     
    End Sub
    Bonne continuation à toi !
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Rebonjour Kimy_Ire

    merci beaucoup de ton aide précieuse.

    C'est exactement ce que je voulais à la perfection

    Je te remercie vraiment chaleureusement.

    Bonne journée.

  6. #6
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    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
    'Nom de la macro
    Sub ImprotCSV()
    'Déclaration des variables
    Dim table() As String
    Dim lig As Integer
    Dim cl As Range
    Dim off1 As Integer
    Dim off2 As Integer
     
    'Le bout de macro que tu avais implémenté qui ouvre le dossier (ici C:\) et qui te permet de sélectionner le dossier que tu veux
    With Application.FileDialog(msoFileDialogFilePicker)
        .InitialFileName = "C:\"
        .Show
        If .SelectedItems.Count > 0 Then Workbooks.Open (.SelectedItems(1))
    End With
     
    'Active le classeur ainsi que la feuille "Fichiers à importer"
    With ActiveWorkbook.Worksheets("Fichiers à importer")
        'Recherche sur la colonne 1 la dernière cellule non-vide et récupère le numéro de la ligne qu'on place dans "lig"
        lig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).row
        'Remidentionne le tableau "table" à deux dimensions 1 à 5 colonnes et 1 à "lig" lignes
        ReDim table(1 To 5, 1 To lig)
        'boucle de 0 à lig - 1 (soit lig fois)
        For i = 0 To lig - 1
            'positionne "cl" sur la case "A1" avec un offset de i ligne(s) et 0 colonne => soit parcours les cellules "A1" puis "A2"... etc... jusqu'à la dernière ligne de la colonne A
            Set cl = .Range("A1").Offset(i, 0)
            'off1 enregistre la position du premier caractère ";" de la chaine de caractère dans "cl"
            off1 = InStr(cl.Value, ";")
            'Enregistre dans table(1, i+1) ce qui se trouve à gauche de ce premier ;
            table(1, i + 1) = Left(cl.Value, off1 - 1)
     
            'boucle 3 fois pour avoir les chaines de caractères qui se trouve entre les ; et place ces valeurs dans table
            For j = 2 To 4
                off2 = InStr(off1 + 1, cl.Value, ";")
                table(j, i + 1) = Mid(cl.Value, off1 + 1, off2 - off1 - 1)
                off1 = off2
            Next j
     
            'Dernière étape : place ce qui se trouve à droite du dernier ; dans table
            table(5, i + 1) = Right(cl.Value, Len(cl.Value) - off1)
        Next i
    End With
     
    'ferme le classeur csv préalablement ouvert
    ActiveWorkbook.Close
     
    'Avec la feuille "Data"
    With Worksheets("Data")
        'Boucle de 1 à lig
        For i = 1 To lig
            'Fait une recherche sur la colonne 1 en fonction de ce qui se trouve dans la première case du tableau, récupère la ligne "-1" => .Columns(1).Find(table(1, i), LookIn:=xlFormulas, lookat:=xlWhole).row - 1
            'Fait un recherche sur la ligne 1 en fonction de ce qui se trouve dans la deuxième case du tableau, récupère la colonne => .Rows(1).Find(table(2, i), LookIn:=xlFormulas, lookat:=xlWhole).Column
            'Finalement re-set "cl" sur ces deux recherches ce qui signifie que l'on se situe bien à l'endroit que l'on préalablement enregistrer dans la tableau "table" pour placer les valeurs par la suite
            Set cl = .Cells(.Columns(1).Find(table(1, i), LookIn:=xlFormulas, lookat:=xlWhole).row - 1, .Rows(1).Find(table(2, i), LookIn:=xlFormulas, lookat:=xlWhole).Column)
            'Boucle de 0 à 2
            For j = 0 To 2
                'place se qui se trouve dans la tableau table au bons endroits (puisque la recherche à été faite au préalable)
                cl.Offset(j, 0) = table(3 + j, i)
            Next j
        Next i
     
        're-set "cl" sur la première case du tableau qu'on a dans "Data" => c-a-d sur la ligne où l'on à A "-1" et sur la colonne où l'on a 1.
        Set cl = .Cells(.Columns(1).Find("A", LookIn:=xlFormulas, lookat:=xlWhole).row - 1, .Rows(1).Find(1, LookIn:=xlFormulas, lookat:=xlWhole).Column)
        'Boucle de 0 à la dernière cellule non vide sur la ligne 1 (sur laquelle on récupère la colonne) "-1"
        For i = 0 To .Rows(1).Find("*", , , , xlByColumns, xlPrevious).Columns - 1
            'Boucle de 0 à la dernière cellule non vide sur la colonne 1 (sur laquelle on récupère la ligne) "-1"
            For j = 0 To .Columns(1).Find("*", , , , xlByColumns, xlPrevious).row - 1
                'Si j+1 n'est pas un multiple de 3 (pour faire simple)
                If j + 1 <> 3 * Int((j + 1) / 3) Then
                    'Si "cl" avec un offset de j ligne(s) et i colonne(s) est égal à "rien"
                    If cl.Offset(j, i) = "" Then
                        'Alors on place un "WAIT" dans cette cellule
                        cl.Offset(j, i) = "WAIT"
                    End If
                End If
            Next j
        Next i
     
    End With
     
    End Sub
    'Fin
    Dis moi si avec ça tu es capable de modifier le programme à ta guise !
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  7. #7
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2018
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Problème lors d'exportation fichier csv
    Bonjour,

    Etant un débutant en programmation, j'ai voulu essayer de récupérer un script me permettant d'importer un fichier type .csv afin d'exporter ces données toujours sous fichier .csv
    Par la suite le but est de remplacer des données de manière automatique.

    le souci est que lorsque j'exporte un fichier .csv rempli aussi bien avec du texte, nombre et caractères spéciaux, le csv exporté est vierge.

    Est-ce que quelqu'un aurait une solution?

    En vous remerciant par avance

    ci joint les fichiers test
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Macro pour ajouter les bordures au fur et a mesure
    Par Raiga dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/06/2007, 08h21
  2. Macro pour ajouter un nouvel élément dans un tableau
    Par dudu134 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/02/2007, 16h31
  3. [VBA-E]macro fichier protégé xsl copie de fichiers partagés
    Par matou_aouh dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/04/2006, 15h08
  4. [Fichier] Ajouter des lignes...
    Par Life Hunter dans le forum Langage
    Réponses: 4
    Dernier message: 26/11/2005, 18h28
  5. [Fichier] Ajout des lignes de doc dans arraylist
    Par 3adoula dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 29/04/2004, 22h41

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