Code VBA copier sur la même ligne

Fermé
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 - 12 mai 2023 à 12:48
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 - 15 mai 2023 à 12:41

Bonjour,
j'ai ce code qui permet de copier des valeurs d'un fichier source vers un fichier de destination. Jusqu'à là ça fonctionne. Je souhaite que lorsqu'il copie dans les différentes colonnes de destination, les premières valeurs copiées dans chaque colonne soient alignées.
La dernière cellule vide dans une colonne n'est pas toujours la même et ce qui fait que sur certaines colonne , la valeur copiée est en décalage avec les autres qui sont censées faire partie de la même série.

Une idée pour mettre ce point départ à chaque fois, sans qu'il soit réinitialisé dans la boucle ce qui donnerait des valeurs en cascades.

Merci pour votre aide

Sub copier_colonne_L()

Dim wb_source As Workbook
Dim wb_dest As Workbook
Dim ws_source As Worksheet
Dim ws_dest As Worksheet
Dim derniereligne As Long
Dim i As Long
Dim ligne_dest As Long

'ouvrir le fichier source
Set wb_source = Workbooks.Open("\\Dossier source.xlsx", ReadOnly:=True)

'ouvrir le fichier de destination
Set wb_dest = ThisWorkbook 'assumes the destination file is the workbook running this code

'désactiver les fonctionnalités qui peuvent ralentir le code
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

'boucle sur toutes les feuilles du fichier source
For Each ws_source In wb_source.Worksheets
'trouver la dernière ligne de la colonne J
derniereligne = ws_source.Cells(ws_source.Rows.Count, "J").End(xlUp).Row

'trouver la feuille de destination correspondante
On Error Resume Next ' Ignorer l'erreur si la feuille n'existe pas dans le classeur de destination
Set ws_dest = wb_dest.Worksheets(ws_source.Index)
On Error GoTo 0 ' Réactiver les erreurs

' Si la feuille n'existe pas, ajouter une feuille avec le même nom à la même position
If ws_dest Is Nothing Then
Set ws_dest = wb_dest.Worksheets.Add(Before:=wb_dest.Worksheets(ws_source.Index))
ws_dest.Name = ws_source.Name
End If

'boucle sur toutes les lignes de la colonne J
For i = 1 To derniereligne
'vérifier si la valeur de la cellule de la colonne J est "QC 5", "QC 300" ou "QC 750"
If ws_source.Range("J" & i).Value = "QC 5" Then
'trouver la dernière ligne non vide de la colonne B dans la feuille correspondante
ligne_dest = ws_dest.Cells(ws_dest.Rows.Count, "B").End(xlUp).Row
'copier la valeur de la cellule de la colonne L de la même ligne et la coller dans la colonne B à la première ligne vide après la dernière ligne non vide
ws_dest.Range("B" & ligne_dest + 1).Value = ws_source.Range("L" & i).Value
ElseIf ws_source.Range("J" & i).Value = "QC 300" Then
'trouver la dernière ligne non vide de la colonne C dans la feuille correspondante
ligne_dest = ws_dest.Cells(ws_dest.Rows.Count, "C").End(xlUp).Row
'copier la valeur de la cellule de la colonne L de la même ligne et la coller dans la colonne C à la première ligne vide après la dernière ligne non vide
ws_dest.Range("C" & ligne_dest + 1).Value = ws_source.Range("L" & i).Value
ElseIf ws_source.Range("J" & i).Value = "QC 750" Then
'trouver la dernière ligne non vide de la colonne D dans la feuille correspondante
ligne_dest = ws_dest.Cells(ws_dest.Rows.Count, "D").End(xlUp).Row
'copier la valeur de la cellule de la colonne L de la même ligne et la coller dans la colonne C à la première ligne vide après la dernière ligne non vide
ws_dest.Range("D" & ligne_dest + 1).Value = ws_source.Range("L" & i).Value
           

End If
           
       Next i
       
   Next ws_source

   'réactiver les fonctionnalités désactivées
   Application.ScreenUpdating = True
   Application.EnableEvents = True
   Application.Calculation = xlCalculationAutomatic

   'fermer le fichier source sans enregistrer
   wb_source.Close False

End Sub


Windows / Firefox 102.0

A voir également:

1 réponse

yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469
12 mai 2023 à 14:13

bonjour,

quand on met la première valeur, il faut donc tenir compte du remplissage des trois colonnes?

0
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023
12 mai 2023 à 14:16

oui, dans un premier temps, mais après , remplir au fur est à mesure.
Je ne sais pas s'il est possible de faire exécuter le code en deux temps.
trouver la ligne vide dans les trois colonnes, puis exécuter le code normalement avec remplissage au fur est à mesure

0
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469 > akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023
12 mai 2023 à 14:57

cela me semble assez simple:

  1. avant le début de la boucle, déterminer la ligne vide dans les trois colonnes, et la mémoriser dans une variable, disons ligne_dest_min,
  2. dans la boucle, si la variable ligne_dest est inférieure à ligne_dest_min, lui assigner la valeur de ligne_dest_min
0
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 > yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024
12 mai 2023 à 15:56

la ligne_dest_min est à déterminer pour chaque feuille de destination , je bloque sur ça  elle est spécifique à chaque feuille

0
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469 > akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023
12 mai 2023 à 17:30

On traite completement chaque feuille, chacune à son tour, non?  Et chaque feuille de destination est utilisée pour une seule feuille source, ou j'ai mal deviné?

ligne_dest_min peut alors être déterminée, je pense, juste avant "'boucle sur toutes les lignes de la colonne J".

Je me demande pourquoi, ci-dessous, tu utilises ws_source.Index et pas ws_source.Name.

Set ws_dest = wb_dest.Worksheets(ws_source.Index)
0
akb213 Messages postés 18 Date d'inscription mercredi 28 novembre 2018 Statut Membre Dernière intervention 15 mai 2023 > yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024
15 mai 2023 à 12:41

Oui chaque feuille est traitée dans l'itération, et chaque feuille a une correspondance dans le dossier de destination.

Pour le code, je l'ai construit en copiant et adaptant plusieurs  codes,  mes connaissances sont limites.

0