Macro copier-coller deplacer sur la droite si cellule pleine
RésoluLe Pingou Messages postés 12274 Date d'inscription Statut Contributeur Dernière intervention -
Fagots
27 réponses
- 1
- 2
Une macro permet de copier A1 de feuille 1 d'un classeur source et de le coller sur A1 de la feuille 'résultat' du classeur 'graph', en décalant vers la droite si zone est occupée.
Des éléments clés de la solution incluent le comptage des cellules non vides de ligne 1 dans les fichiers source et cible, puis une boucle qui copie les valeurs manquantes vers la destination.
Par exemple, le code détermine nbvaso et nbvaci par CountA sur la ligne 1, puis, si nbvaci < nbvaso, copie les colonnes manquantes avec PasteSpecial xlPasteValues.
D'autres solutions évoquées suggèrent d'ajuster les noms de fichiers et d'adapter les feuilles, afin d'éviter les erreurs de référence et de faciliter l'extension.
-
Bonjour,
Voici un exemple de procédure à adapter selon vos classeurs :Sub Importer_plage_A1() Dim objcible As Workbook, objsource As Workbook Dim cel As Variant, c As Long Set objsource = Workbooks(nomclassuersource.xlsm) Set objcible = Workbooks(nomclassuercible.xlsx) Application.ScreenUpdating = False nucol = objcible.Sheets(1).Cells(1,Rows(1).Cells.Count).End(xlUp).Column objsource.Sheets(1).Range("A1 ").copy Destination := objcible.Sheets(1).Cells(1,nucol) Set objcible = Nothing Set objsource = Nothing Application.ScreenUpdating = True End Sub
-
bonjour,
l'argument
" nucol = objcible.Sheets(1).Cells(1,Rows(1).Cells.Count).End(xlUp).Column objsource.Sheets(1).Range("A1 ").copy Destination := objcible.Sheets(1).Cells(1,nucol)"
Ne fonctionne pas. Une fois coller la ligne est en rouge avec message erreur de compilation.
J'ai bien mis les noms des deux fichiers.
En tous cas merci de vous pencher sur ma question.
Salutation
-
-
Bonjour ,
Ce doit-être 2 lignes de code :nucol = objcible.Sheets(1).Cells(1,Rows(1).Cells.Count).End(xlUp).Column objsource.Sheets(1).Range("A1 ").copy Destination := objcible.Sheets(1).Cells(1,nucol)
-
Bonjour,
Une petite erreur de code m'a échappée, la ligne correcte pour la variable [nucol]:nucol = objcible.Sheets(1).Cells(1, Rows(1).Cells.Count).End(xlToLeft).Column + 1
-
Bonjour,
C'est normal le nom du classeur doit être écrit entre guillemet (je pensais que vous le saviez, désolé):Set objsource = Workbooks("fichier2.xlsm")
Note : il va de soi que les 2 classeurs sont ouverts.
Salutations.
Le Pingou -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-
Merci, de rien.
-
Bonjour,
Derniere petite question dans la macro donnée, comment faire pour coller uniquement la valeur de la cellule A1?
merci de votre aide -
Bonjour,
Remplacer cette ligneobjsource.Sheets(1).Range("A1 ").copy Destination := objcible.Sheets(1).Cells(1,nucol)Par ces 2 lignes :objsource.Sheets(1).Range("A1 ").Copy objcible.Sheets(1).Cells(1,nucol).PasteSpecial xlPasteValues
-
-
Dans le cas ou j'ai un fichier source "fichier1" et que dans ce fichier la ou les cellules à copier s'acrément elles aussi en collone +1.
Exmple. Mois janvier résultat à prendre cellule A1, mois de février résultat à prendre en cellule A2 etc. peut-on faire, si oui comment l'ajouter dans la macro excitante du dessus?
Merci de votre aide
-
-
Bonjour,
Dans ce cas il faut modifier la manière de travaillé de la procédure.
Comme j'ai l'impression qu'après chaque réponse il y a une nouvelle question, alors je vais attendre un petit peu pour la réponse... !
-
Bonjour,
Une question, comment je fais pour savoir quelle cellule de la ligne 1 je dois copier/coller sur l'autre classeur ?
Si vous dite la dernière, alors comment savoir si cela n'a pas déjà été réalisé ?
-
Bonjour,
C'est bien la dernière cellule de la ligne 1 du classeur source à copier/coller sur le classeur cible.
Effectivement nous pouvons nous poser la question de savoir si cela n'a pas déjà été réalisé.
Cela viendra dans ma gestion de mise à jour de mon classeur cible. J'identifie dan mon fichier cible les dates de mise à jour.
Les résultats sont au mois. Donc, si je fais ma manip deux cela va me copier /coller deux fois les même chiffres sur deux mois différents.
D'ou l'importance pour moi d'avoir une gestion rigoureuse de l'alimentation de mon fichier cible par le fichier source.
Salutations
fagots
-
-
bonjour
Tien pour jouer avec une boucle
Sub testColonne()
Feuil1.Select
For L = 2 To 29
Range("A" & L).Copy
Nucol = Feuil2.Cells(L, Columns.Count).End(xlToLeft).Column + 1
Feuil2.Cells(L, Nucol).PasteSpecial xlPasteValues
Next
End Sub
A+
Maurice -
Bonjour
une petite modife
Sub testColonne()
Feuil1.Select
For L = 2 To 29
Col = Cells(L, Columns.Count).End(xlToLeft).Column
Cells(L, Col).Copy
Nucol = Feuil2.Cells(L, Columns.Count).End(xlToLeft).Column + 1
Feuil2.Cells(L, Nucol).PasteSpecial xlPasteValues
Next
End Sub
A+
Maurice -
-
Bonjour fagots,
Merci pour l'explication (message 17 de 09 :.53)
Je regarde le problème en fin de journée et la réponse suivra.
-
Bonjour fagots,
Question intermédiaire : est-ce que les valeurs de la ligne 1 du fichier source sont identiques à la ligne 1 du fichier source ... ?
Note : pourquoi pas de titre de colonne en ligne 1 et le début des données en ligne 2 ?
-
Bonjour Le Pingou
Les valeurs du fichiers source sont à copier toujours en collage spécial valeur. Oui les valeurs sont les mêmes.
Dans mon fichier sources ,il existe bien des titres de colonne ainsi que dans le fichier cible.
Mais elles ne sont pas identique.
Fichier construit par entité national qui regroupe plusieurs site et plusieurs données qui ne me sont pas toutes nécessaire pour mon fichier cible.
En espérant avoir été clair.
Salutations
fagots
-
-
Bonjour,
Merci c'est parfait.
Un dernier petit détail, il y-a-t-il des formules dans la ligne 1 du fichier source et si oui sur combien de colonnes?
Salutations.
Le Pingou -
Bonjour,
Ma proposition, copie et colle le(s) valeur(s) vers le fichier cible.
Merci d'adapter les noms selon vos besoins.
La procédure :Sub Importer_valeur_cellule() Dim objcible As Workbook, objsource As Workbook Dim c As interger, nbvaci As Integer, nbvaso As Integer Set objsource = Workbooks("Classeur11.xlsm") Set objcible = Workbooks("classeur12.xlsx") Application.ScreenUpdating = False ' contrôler si nouvelle valeur sur classeur source nbvaso = WorksheetFunction.CountA(objsource.Sheets("Feuil1").Rows(1)) nbvaci = WorksheetFunction.CountA(objcible.Sheets("Feuil1").Rows(1)) If nbvaci < nbvaso Then For c = 1 To (nbvaso - nbvaci) objsource.Sheets("Feuil1").Cells(1, nbvaci + c).Copy objcible.Sheets("Feuil1").Cells(1, nbvaci + c).PasteSpecial xlPasteValues Next c End If Set objcible = Nothing Set objsource = Nothing Application.ScreenUpdating = True End Sub
-
-
Bonjour,
J'ai bien fais la correction, mais la macro tourne et elle ne fonctionne pas car elle ne copie rien. Question pourquoi la source est-elle en xlsm?
Je sais que cela veut dire classeur prenant en charge les macro.Pour moi c'est mon fichier cible qui a en charge la macro.
J'ai des essai comme indiqué dans la procédure proposée et fait inversement des fichiers sources et cible.
Et toujours rien.
Cordialement
fagots
-
-
Bonjour,
C'est étonnant, j'ai testé et cela fonctionne parfaitement.
Pouvez-vous me mettre une copie de la macro telle que vous l'utilisez... !
-
bonjour,
Voici la macro:
Sub Importer_valeur_cellule()
Dim objcible As Workbook, objsource As Workbook
Dim c As Integer, nbvaci As Integer, nbvaso As Integer
Set objsource = Workbooks("fichier2.xlsm")
Set objcible = Workbooks("fichier1.xlsx")
Application.ScreenUpdating = False
' contrôler si nouvelle valeur sur classeur source
nbvaso = WorksheetFunction.CountA(objsource.Sheets("Feuil2").Rows(1))
nbvaci = WorksheetFunction.CountA(objcible.Sheets("Feuil1").Rows(1))
If nbvaci < nbvaso Then
For c = 1 To (nbvaso - nbvaci)
objsource.Sheets("Feuil2").Cells(1, nbvaci + c).Copy
objcible.Sheets("feuil1 ").Cells(1, nbvaci + c).PasteSpecial xlPasteValues
Next c
End If
Set objcible = Nothing
Set objsource = Nothing
Application.ScreenUpdating = True
End Sub
Salutations
fagots
-
-
Bonjour,
De cette manière je pense que ce sera bon:Sub Importer_valeur_cellule() Dim objcible As Workbook, objsource As Workbook Dim shci As Object, shso As Object Dim c As Integer, nbvaci As Integer, nbvaso As Integer Set objsource = Workbooks("fichier1.xlsx") Set objcible = Workbooks("fichier2.xlsm") Set shso = objsource.Sheets("Feuil1") Set shci = objcible.Sheets("Feuil2") Application.ScreenUpdating = False ' contrôler si nouvelle valeur sur classeur source nbvaso = WorksheetFunction.CountA(shso.Rows(1)) nbvaci = WorksheetFunction.CountA(shci.Rows(1)) If nbvaci < nbvaso Then For c = 1 To (nbvaso - nbvaci) shso.Cells(1, nbvaci + c).Copy shsi.Cells(1, nbvaci + c).PasteSpecial xlPasteValues Next c End If Set objcible = Nothing: Set shci = Nothing Set objsource = Nothing: Set shso = Nothing Application.ScreenUpdating = True End Sub -
Bonjour,
Pouvez-vous me mettre :
Fichier source c'est celui ou vous avez les nouvelles valeurs pour votre classeur cible
- Nom du classeur
- Nom de la feuille
- Numéro de la ligne pour les données
Idem pour le classeur cible qui est celui ou vous aurez la procédure.
- 1
- 2