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 -
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:
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
-
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 !
-
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.- Bonjour,
Pour connaitre la première ligne vide, lisez ceci :
https://forums.commentcamarche.net/forum/affich-37622001-vba-detection-de-cellule-vide-ligne-colonnne
-
-
Bonjour,
J'espère que la proposition de pijaku (salutations) vous permette de résoudre le problème !
Au cas où vous revenez.
-
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 -
Bonjour,
Merci, je vous ferai une proposition en fin de journée.
Patience.
Note : vous avez ceci au débutRange("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
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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
-
Bonjour,
Merci, content pour vous.