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 :

Copie données avec incrémentation de lignes [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut Copie données avec incrémentation de lignes
    Bonjour,

    je suis tout nouveau sur le forum, je l'ai pas mal parcouru mais je n'arrive pas à avoir réponse à mon problème :/

    En fait, je réalise un registre dans lequel je viens intégrer des données dans un registre (nommé registre_traitement.xls) en provenance de fichiers sources ayant toujours la même structure (nommé fichier_traitement.xls). A partir du registre, j'ai créé un bouton affecté à une macro permettant d'aller sélectionner le fichier désiré.

    Or, chacun des fichiers sources doivent s'incrémenter sur une ligne différente de mon fichier registre et là je bloque. Cela fait maintenant quelques jours que je passe à écumer les forums et les aides mais en vain

    Donc si vous pouviez me mettre sur la voie, ce serait bien aimable à vous !

    Je vous joint mon code afin que vous visualisiez mieux ce que je souhaite faire (j'ai coupé une bonne partie du code car redondant mais le principe est là !) :

    Mon 1er essai :


    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
    Sub import_fiche()
     
    Dim Fichier_Travail As String, Fichier As String
    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
     
    ChDrive CHEMIN
     
    'Set une variable qui va contenir le nom et le chemin du fichier à ouvrir.
    Fichier = Application.GetOpenFilename(", *xlWindows", 0, "Sélectionner le ficher de traitement souhaité") 
     
    'Test si un fichier a été sélectionné
    If Fichier = "Faux" Then
        Msg = "Aucun fichier de traitement sélectionné"    ' Définit le message.
        Style = vbOKOnly    ' Définit les boutons.
        Title = "Abandon de la procédure !"    ' Définit le titre.
        ' Affiche le message.
        Response = MsgBox(Msg, Style, Title)
        Exit Sub 'Sort de la macro puisqu'aucun fichier n'a été sélectionné
    Else 'Sinon, on ouvre le fichier sélectionné
          Workbooks.OpenText Filename:=Fichier
        Fichier_Travail = ActiveWorkbook.Name 'On donne à une variable le nom de ce fichier qu'on vient d'ouvrir.
    End If
     
    End Sub
    Sub import_donnees_2()
    '
    '
    'Reprise de la macro d'import de la fiche
        Application.Run "Registre_traitements.xls!import_fiche"
    '
    '
    '--------------------------------------------------------------------------
     
    '
    'Sélection de la case N° de traitement
        Range("C30").Select
        Selection.Copy
    'Sélection du registre et de la case N° de traitement
        Windows("Registre_traitements.xls").Activate
        n = Range("A8").End(xlDown).Row + 1
        MsgBox "Il serait judicieux de considérer la ligne " & n
        Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
    '________________________________________________________________
     
    'Sélection de la fiche et de la case Nom
        Windows("Fiche_traitement.xls").Activate
        Range("C31").Select
        Application.CutCopyMode = False
        Selection.Copy
    'Sélection du registre et de la case pour la copie du Nom
        Windows("Registre_traitements.xls").Activate
        Range("B8:C8").Select
        ActiveSheet.Paste
     
     
    '--------------------------------------------------------------------------
    'Fermeture de la fiche de traitement et mise en avant du registre
        Windows("Fiche_traitement.xls").Close
        Windows("Registre_traitements.xls").Activate
    End Sub
    Après quelques heures de recherches j'ai aboutit à ceci mais qui ne m'avance pas plus car rien ne fonctionne ...


    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
    Sub import_fiche()
    Dim Fichier_Travail As String, Fichier As String
    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
     
    ChDrive CHEMIN
     
    Fichier = Application.GetOpenFilename(", *xlWindows", 0, "Sélectionner le ficher de traitement souhaité")
     
    'Test si un fichier a été sélectionné
    If Fichier = "Faux" Then
        Msg = "Aucun fichier de traitement sélectionné"    ' Définit le message.
        Style = vbOKOnly    ' Définit les boutons.
        Title = "Abandon de la procédure !"    ' Définit le titre.
        ' Affiche le message.
        Response = MsgBox(Msg, Style, Title)
        Exit Sub 'Sort de la macro puisqu'aucun fichier n'a été sélectionné
    Else 'Sinon, on ouvre le fichier sélectionné
          Workbooks.OpenText Filename:=Fichier
        Fichier_Travail = ActiveWorkbook.Name 'On donne à une variable le nom de ce fichier qu'on vient d'ouvrir.
    End If
     
    End Sub
    Sub import_donnees_2()
    '
    '
    'Reprise de la macro d'import de la fiche
        Application.Run "Registre_traitements.xls!import_fiche"
    '
    '
    '--------------------------------------------------------------------------
    Dim wb_source As Workbook
          Dim wb_target As Workbook
          Dim ws_source As Worksheet
          Dim ws_target As Worksheet
          Dim ln_target As Range
     
          Set wb_source = Workbooks.Open("C:\Documents and Settings\...\Fiche_traitement.xls")
          Set wb_target = ActiveWorkbook
     
          ' On ne considère que la première feuille de chaque classeur
          Set ws_source = wb_source.Worksheets(1)
          Set ws_target = wb_target.Worksheets(1)
     
     
        Set ln_target = wb_target.Worksheets(1).Cells(8, 1).End(xlDown).Offset(1).EntireRow
        ln_target.Cells("A8").Value = wb_source.Range("C30").Value
        Set ln_target = wb_target.Worksheets(1).Cells(8, 2).CurrentRegion.SpecialCells(xlCellTypeLastCell).Offset(1).EntireRow
        ln_target.Cells("B8:C8").Value = ws_source.Range("C31").Value
        Set ln_target = wb_target.Worksheets(1).Cells(8, 4).CurrentRegion.SpecialCells(xlCellTypeLastCell).Offset(1).EntireRow
        ln_target.Cells("D8:E8").Value = ws_source.Range("C32").Value
        Set ln_target = wb_target.Worksheets(1).Cells(8, 6).CurrentRegion.SpecialCells(xlCellTypeLastCell).Offset(1).EntireRow
        ln_target.Cells("F8:G8").Value = ws_source.Range("C33").Value
        Set ln_target = wb_target.Worksheets(1).Cells(8, 8).CurrentRegion.SpecialCells(xlCellTypeLastCell).Offset(1).EntireRow
        ln_target.Cells("H8").Value = ws_source.Range("C34").Value
        Set ln_target = wb_target.Worksheets(1).Cells(8, 9).CurrentRegion.SpecialCells(xlCellTypeLastCell).Offset(1).EntireRow
        ln_target.Cells("I8:J8").Value = ws_source.Range("C35").Value
        Set ln_target = wb_target.Worksheets(1).Cells(8, 11).CurrentRegion.SpecialCells(xlCellTypeLastCell).Offset(1).EntireRow
        ln_target.Cells("K8:L8").Value = ws_source.Range("C36").Value
     
     
    'Fermeture de la fiche de traitement et mise en avant du registre
        Windows("Fiche_traitement.xls").Close
        Windows("Registre_traitements.xls").Activate
    End Sub
    Et je n'arrive pas non plus à définir un nom de fichier source variable : ils seront tous de la forme Fiche_traitement_*.xls. Comment faire ceci ?

    Merci par avance du temps que vous m'accroderez

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Par défaut
    Bonjour MpmVb

    chacun des fichiers sources doivent s'incrémenter sur une ligne différente de mon fichier registre
    Je n'ai pas saisie ce que tu voulais faire. Peux-tu faire un exemple "en parlant comme un livre" si nécessaire?
    Ce que j'ai compris:
    En gros t'as un fichier qui contient des infos et tu veux le compléter avec les infos contenues dans la première feuille de chacun des fichiers nommés "Fiche_traitement_*.xls?
    Si oui, faut-il prendre le contenu de chacun de ces fameuses feuilles et les mettre "à la suite" des lignes déjà utilisées dans le fichier principal?

    Et je n'arrive pas non plus à définir un nom de fichier source variable : ils seront tous de la forme Fiche_traitement_*.xls. Comment faire ceci ?
    Il faut juste faire ceci si on suppose que les fichiers sont numérotés et dans un même répertoire:
    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
    Dim NomFichier as string
    Dim i as integer
    Dim CheminRepertoire as string
    Dim Wkb_Source as workbook
     
    'Initialisation du chemin du répertoire
    CheminRepertoire="C:\......\RepertoireDesFichiers\"
    'On suppose que les 4 fichiers existes:
    For i=1 to 4
      'Création du nom du fichier comme désiré
      NomFichier="Fiche_traitement_" & i & ".xls"
      'Traitement voulu en utilisant NomFichier, par exemple:
        'Ouverture du fichier
        Workbooks(CheminRepertoire & NomFichier).Open
        'Place le fichier dans une variable de type classeur (plus simple à utiliser)
        Set Wkb_Source=workbooks(NomFichier) 'Tu peux bien sûr faire ces 2 lignes en 1 seule fois: Set Wkb_Source=workbooks(....).open
        'Sélection de la première feuille du classeur
        Wkb_Source.sheets(1).select
        ...
      'Fermeture du classeur source avant d'ouvrir le suivant
      Wkb_Source.close
      'Fichier suivant donc on boucle!
    next i 'Fichier suivant
    C'est une piste, j'espère que ça t'aidera un peu.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Merci buzz73 de ta réponse

    En ce qui concerne l'incrémentation de mes lignes, j'ai réussi à l'instant ce que je voulais faire, grâce à la syntaxe suivante : (après plusieurs jours de recherche, ca paye )
    (Du coup, je suis repartit sur la 1ère version de ma macro)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'Sélection de la fiche et de la case Nom
        Windows("Fiche_traitement.xls").Activate
        Range("C31").Select
        Application.CutCopyMode = False
        Selection.Copy
    'Sélection du registre et de la case pour la copie du Nom
        Windows("Registre_traitements.xls").Activate
        Range("B65536:C65536").Select                           'Je démarre par les dernieres cellules des colonnes B&C
        Selection.End(xlUp).Offset(1, 0).Select                 'Je me retrouve à la premiere cellule non vide de ma colonne
        Selection = Range("B8:C8")                              'La valeur de la première cellule trouvée est égale à B8:C8
        ActiveSheet.Paste
    En ce qui concerne la variabilité du nom de mon fichier à ouvrir, je ne souhaite pas les lire tous d'un coup mais au coup par coup.
    Je m'explique pour essayer d'être plus clair :

    Je vais recevoir, ponctuellement, des fichiers nommés "Fichier_traitement_n°traitement.xls", où n°traitement est la variable.
    Au travers d'un bouton sur la page registre, j'exécute ma macro qui va chercher dans le fichier traitement les infos que je souhaite extraire pour les centraliser dans mon registre.
    Mais actuellement je bloque car dès que le nom de mon fichier varie, la macro ne s'execute plus ...

    Si vous pouviez me mettre sur la piste, je suis sur que c'est une chose courante en terme de macro ce genre de chose

    Merci

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Windows("Fiche_traitement.xls").Activate
    En fait plutôt que d'utiliser le nom de la fenêtre, sert toi plutôt du classeur directement:


    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
    Dim CheminCompletFichier as string
    Dim NomFichier As String
    Dim Fichier As Workbook 'Le vrai classeur que tu vas ouvrir
    Dim FeuilleEnCours as worksheet 'La feuille sur laquelle on veut travailler par exemple
    Dim Filtre As String'Quand tu changera de version Excel ou de type de fichiers, tu pourras modifier facilement le code
    Dim Titre As String 'Titre de ton MsgBox
     
    LS_Filtre = "Excel (*.xls),*.xls,All Files (*.*),*.*"
    Titre = "Sélectionner le ficher de traitement souhaité"
     
    'Variable qui va contenir le nom complet du fichier => chemin inclus
    CheminCompletFichier = Application.GetOpenFilename(FileFilter:=Filtre, FilterIndex:=5, Title:=Titre)
     
    'Maintenant tu peux ouvrir ton classeur et le stocker dans une variable de type workbook
    Set Fichier= workbooks.open(CheminCompletFichier) 'Comme tu peux le voir, ici le nom du classeur (ce qui te coinçait) n'est même plus utile car on utilise directement la variable classeur
     
    'Ecrire le nom du fichier dans un MsgBox
    Msgbox Fichier.Name
     
    'Sélectionner la feuille 2
    Fichier.Sheets(2).select
     
    'Mettre la feuille 2 dans une variable pour l'utiliser facilement
    Set FeuilleEnCours =Fichier.Sheets(2)
     
    'Ecrire dans une cellule de la feuille 2
    FeuilleEnCours.Cells(2,3)="Salut!"
     
    'A la fin de la macro penser à supprimer les variables objet
    Set FeuilleEnCours =nothing
    Set Fichier=nothing
    Voilà, c'est un peu plus que ce que tu as demandé mais je pense que ça te seras très utiles par la suite.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Merci beaucoup de prendre du temps pour m'aider !

    Cependant, je sais pas si c'est du à mes nombreuses lacunes en VBA, mais je n'arrive pas à cerner comment est nommée la variable qui désigne mon Workbook ? CheminCompletFichier, NomFichier, Fichier ?

    Je parle de celle que je désigne ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Sélection de la fiche et de la case Nom
        Windows("Fichier").Activate
        Range("C31").Select
        Application.CutCopyMode = False
        Selection.Copy
    Sinon c'est parfait ! Je sens que je commence à toucher du doigt mon but ! merci

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 268
    Par défaut
    Une fois que tu as fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Fichier= workbooks.open(CheminCompletFichier)
    Tu auras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Sélection de la fiche et de la case Nom
        Fichier.Activate
        Range("C31").Select
        Application.CutCopyMode = False
        Selection.Copy

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

Discussions similaires

  1. [XL-2007] Copié-coller de ligne avec incrémentation
    Par blackstrange dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/07/2012, 22h16
  2. [XL-2007] Remplir base de donnée avec incrémentation
    Par fredoud dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 27/06/2011, 19h40
  3. extraire les données avec saut de lignes
    Par karim_khouja dans le forum Langage
    Réponses: 8
    Dernier message: 08/04/2009, 08h56
  4. Réponses: 3
    Dernier message: 27/08/2007, 10h28
  5. SQL Server, mise en ligne de plusieur données avec délimiteur
    Par manhattan.project dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/06/2007, 17h52

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