Code VBA copier sur la même ligne
akb213 Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
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
- Code VBA copier sur la même ligne
- Code ascii - Guide
- Partager photos en ligne - Guide
- Aller à la ligne excel - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
1 réponse
bonjour,
quand on met la première valeur, il faut donc tenir compte du remplissage des trois colonnes?
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
cela me semble assez simple:
la ligne_dest_min est à déterminer pour chaque feuille de destination , je bloque sur ça elle est spécifique à chaque feuille
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.
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.