Macro VBA pour exporter des lignes dans un autre fichier

Résolu
neurosis12 Messages postés 5 Statut Membre -  
Le Pingou Messages postés 12286 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je dois réaliser un macro Excel (2002) qui permettra de copier des lignes de plusieurs fichiers sources (dans l'exemple fichier 1 et 2) vers un fichier cible (fichier3). Ce macro s'exécute en pressant sur un bouton dans le fichier source.

Le code de ce macro est dans un fichier nommé fichier1.xls. Il exporte les données sélectionnées dans le premier Range vers le fichier3.xls. Ici le Range de B10:K500 a été mis arbitrairement (nous ne savons pas combien de lignes une personne écrira avant d'exporter).

Toutefois, cela ne fonctionne que lorsque le fichier cible est vide. S'il y a déjà des lignes dans le range cible cela me renvoie l'erreur suivante:

"Erreur d'execution 1004 - Cette opération requiert que les cellules fusionnées soient de taille identique."

De ce que je comprends, je crois que cela est dû au fait que le macro effacerait les données déjà présente (pour coller les nouvelles). Mon objectif serait donc de les mettre à la suite des données déjà présentes.

Voici un exemple d'utilisation:

- Le Fichier cible (fichier3.xls) est présentement vide

- J'écris 3 lignes dans le fichier1.xls et je les exporte en cliquant sur le bouton du macro

- Le Fichier cible (fichier3.xls) contient les 3 lignes exportées

- J'écris 5 lignes dans le fichier2.xls et je les exporte en cliquant sur le bouton du macro

- Le fichier cible contient maintenant 8 lignes (3 lignes du fichier1 + 5 lignes du fichier2)

Voici le code du macro:

Sub Exporter()
ActiveSheet.Shapes("Button 4").Select
Range("B10:K500").Select
Selection.Copy
Workbooks.Open Filename:= _
"C:\Users\neurosis12\fichier2.xls"
Sheets("Compilation").Select
Range("B10:K500").End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveWorkbook.Save
ActiveWorkbook.Close
End Sub

6 réponses

  1. Le Pingou Messages postés 12286 Date d'inscription   Statut Contributeur Dernière intervention   1 481
     
    Bonjour,
    Il semble qu'il y a un problème : selon votre macro qui est dans le [fichier1.xls], les lignes copiées sont celles du fichier 1 qui sont exporter/copier dans le fichier 2 .... Pas de trace du fichier 3...
    C'est différent de vos explications !

    0
    1. neurosis12 Messages postés 5 Statut Membre
       
      Mes excuses, j'avais modifié a la main l'adresse pour ne pas révéler des informations sur un disque dur ne m'appartenant pas (travail) et au départ je n'avais prévu que 2 fichiers dans mon exemple.

      Pour être plus clair, le fichier 1 et 2 c'est le même fichier mais à deux emplacements différents. Ces fichiers ont un bouton exporter et celui-ci copie colle les 500 lignes (non vide) - donc admettons qu'il a écrit 5 lignes elles sont copier collées dans le "fichier3" qui est en quelque sorte le fichier cible de tout les fichier1 (il va probablement en avoir plus que deux, mais je ne crois pas que cela ne cause de problèmes).

      Si aucune donnée n'est encore présente dans le fichier3 le macro fonctionne. Le problème survient lorsque j'ai déjà des données d'exportées. Puisque mon deuxième Range est "statique" je crois que le problème est là (il essaie de "collage spécial" par dessus des données non vide. Il faudrait en quelque sorte que je sois capable de savoir à quelle ligne (la première vide) je peux importer les données subséquentes.
      0
  2. Le Pingou Messages postés 12286 Date d'inscription   Statut Contributeur Dernière intervention   1 481
     
    Bonjour,
    J'espère que la proposition de pijaku (salutations) vous permette de résoudre le problème !
    Au cas où vous revenez.

    0
  3. neurosis12 Messages postés 5 Statut Membre
     
    Bonjour! Je suis allé voir le lien que pijaku m'a recommandé. Je crois avoir trouvé ce qui me permettrait de faire fonctionner le macro mais je n'y arrive pas. Je ne suis pas très familier avec VBA, mais de ce que j'y comprend, l'idée serait la suivante:
    - Pour savoir ou coller les données exportées, le macro indiquerait la feuille et la ligne ou commencer le collage spécial

    L'erreur se trouve fort probablement dans ces lignes (selon le débogueur). De ce que j'ai pu comprendre, la variable derniereLigne ne prend pas la valeur assignée (la ligne suivant la dernière contenant du texte).


    Dim derniereLigne As Range
    derniereLigne = Range("B10").End(xlDown).Row + 1
    derniereLigne.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False


    Mon intuition me dit que puisque le numéro de la ligne contenu dans ma variable derniereLigne pourrait être collé a l'emplacement en haut à gauche par exemple Range("B" & derniereLigne)

    Voici la version complète :


    Sub Exporter()
    '
    ' Exporter Macro
    ' Macro enregistrée le 2015-01-12 par marl03
    '
    '
    ActiveSheet.Shapes("Button 4").Select
    Range("B10:K500").Select
    Selection.Copy
    Workbooks.Open Filename:= _
    "C:\Users\neurosis12\fichier3.xls"
    Sheets("Compilation").Select
    Dim derniereLigne As Range
    derniereLigne = Range("B10").End(xlDown).Row + 1
    derniereLigne.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    ActiveWorkbook.Save
    ActiveWorkbook.Close
    End Sub
    0
  4. Le Pingou Messages postés 12286 Date d'inscription   Statut Contributeur Dernière intervention   1 481
     
    Bonjour,
    Merci, je vous ferai une proposition en fin de journée.
    Patience.
    Note : vous avez ceci au début
    Range("B10:K500").Select

    Est-ce bien correct ou il s'agit des lignes à copier dès la 10 jusqu'à la dernière ligne qui peut être 25
    soit :
    Range("B10:K25").Select

    Merci de votre réponse

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Le Pingou Messages postés 12286 Date d'inscription   Statut Contributeur Dernière intervention   1 481
     
    Bonjour,
    Essayer avec cette procédure (j'ai laissé les lignes non utilisées en commentaires (en vert):
    Sub Exporter()
    '
    ' Exporter Macro
    ' Macro enregistrée le 2015-01-12 par marl03
    '
    Dim derniereLigne As Integer, deliso As Integer
    Dim shso As Object, shci As Object '
    Set shso = ActiveSheet
    With shso
    '    ActiveSheet.Shapes("Button 4").Select ' instruction inutile ...!
    ' *** chercher numéro dernière ligne à copier
        deliso = .Cells(Rows.Count, 2).End(xlUp).Row
    '    Range("B10:K500").Select
    '    Selection.Copy
        Workbooks.Open Filename:="C:\Users\neurosis12\fichier3.xls"
        Set shci = Sheets("Compilation")
    ' *** position première ligne vide
        derniereLigne = shci.Cells(Rows.Count, 2).End(xlUp).Row + 1
    '   derniereLigne.Select
    ' *** copier plage source vers cible
        .Range("B10:K" & deliso).Copy Destination:=shci.Range("B" & derniereLigne)
    '    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    '   :=False, Transpose:=False
    '    ActiveWorkbook.Save 'fermeture et sauvegarde dans ligne suivante
        ActiveWorkbook.Close SaveChanges:=True
    End With
    Set shso = Nothing
    Set shci = Nothing
    End Sub


    0
    1. neurosis12 Messages postés 5 Statut Membre
       
      Merci infiniment pour vos réponses! Je viens de sortir de réunion alors laissez moi un moment pour tester et vous donner une réponse claire.
      0
    2. neurosis12 Messages postés 5 Statut Membre
       
      Je viens de tester ton Macro, il fonctionne très bien! Milles merci Le Pingou!
      0
  7. Le Pingou Messages postés 12286 Date d'inscription   Statut Contributeur Dernière intervention   1 481
     
    Bonjour,
    Merci, content pour vous.
    0