Je dois copier un bloc de données dans la colonne A (qui sont entre les espaces vides) et le coller dans la dernière colonne vide. Exemple: J'ai des données dans la plage A1: A18 et une cellule vide, et encore des données dans A20: A37 et 2 cellules vides et encore des données dans A40: A57 et ainsi de suite. Je dois copier ces données et les coller dans la colonne B, C, D ....
Le motif des espaces vides n'est pas uniforme.
Capture d'écran du fichier Excel
J'ai fait des recherches sur Internet et créé un code pour coller les données sélectionnées manuellement dans la colonne A à la dernière colonne vide. Mais la liste est trop longue et je souhaite automatiser le processus.
J'ai essayé ce code pour trouver des espaces vides et copier des données. Il trouve la dernière ligne vide et copie toutes les données, affichant une erreur.
Sub Pasting_Data_to_last_column()
Dim xWs As Worksheet
Dim rng As Range
Dim lastCol As Long
Sheets("Input").Activate
Application.ScreenUpdating = False
'finds the number of the last column
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Range("A1", Cells(Rows.Count, 1).End(xlUp)).Copy
'paste the copied value to last empty column
Cells(1, lastCol + 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Je pense que ce problème peut être résolu avec une boucle, mais je n'ai aucune idée à ce sujet car je suis nouveau sur VBA.
3 Réponses :
Essayez ceci, qui utilise SpecialCells pour extraire des blocs de cellules (ou de zones). Il suppose que les cellules ne contiennent pas de formules, donc si ce n'est pas le cas, elles devront être modifiées.
Sub x()
Dim r As Long
For r = 2 To Columns(1).SpecialCells(xlCellTypeConstants).Areas.Count
Columns(1).SpecialCells(xlCellTypeConstants).Areas(r).Copy
Cells(1, Columns.Count).End(xlToLeft).Offset(, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Next r
End Sub
Merci beaucoup! Le code fonctionnait parfaitement. Je ne peux pas vous remercier assez pour ce code. Cela a exactement résolu mon problème. Merci une fois de plus!
Mon plaisir. Btw, je vous suggère de changer la procédure et les noms de variables en termes plus significatifs.
Merci pour votre suggestion :)
Je pense que vous pourriez essayer:
Option Explicit
Sub Test()
Dim i As Long, LastRow As Long, LastColumn As Long, StartCell As Long, EndCell As Long
Dim rng As Range
With ThisWorkbook.Worksheets("Sheet1")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For i = LastRow To 1 Step -1
If IsEmpty(.Range("A" & i).Value) Then
EndCell = i + 1
LastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set rng = .Range("A" & StartCell & ":A" & EndCell)
rng.Cut .Cells(1, LastColumn + 1)
Else
If i = LastRow Or IsEmpty(.Range("A" & i).Offset(1, 0).Value) Then
StartCell = i
End If
End If
Next i
End With
End Sub
Merci beaucoup. Cela fonctionnait parfaitement aussi. Merci une fois de plus!
Veuillez essayer ce code. C'est très flexible. Vous pouvez ajuster les quatre paramètres en son sommet aux exigences de votre environnement.
Sub CopyToColumns()
' 02 Jan 2019
' Change these parameters to fit your requirements:-
Const WsName As String = "TestSheet"
Const SourceClm As String = "A"
Const FirstRow As Long = 2 ' applicable to all columns
Const FirstTargetClm As String = "D"
Dim Ws As Worksheet
Dim InArr As Variant
Dim OutArr As Variant, i As Long
Dim Rng As Range
Dim C As Long
Dim R As Long
On Error Resume Next
Set Ws = ActiveWorkbook.Worksheets(WsName)
If Err Then Exit Sub ' exit if the sheet doesn't exist
On Error GoTo 0
With Ws
InArr = Range(.Cells(FirstRow, SourceClm), .Cells(.Rows.Count, SourceClm).End(xlUp)).Value
End With
C = Columns(FirstTargetClm).Column
For R = 1 To UBound(InArr)
If InArr(R, 1) <> "" Then
i = 0
ReDim OutArr(1 To UBound(InArr))
Do
i = i + 1
OutArr(i) = InArr(R, 1)
R = R + 1
If R > UBound(InArr) Then Exit Do
Loop While InArr(R, 1) <> ""
If i Then
ReDim Preserve OutArr(i)
Set Rng = Cells(FirstRow, C).Resize(i)
Rng.Value = Application.Transpose(OutArr)
C = C + 1
End If
End If
Next R
End Sub
Merci beaucoup pour le code, j'apprécie vraiment votre aide, ce code fonctionne bien et c'est rapide aussi. Mais comment puis-je également copier le formatage? Je souhaite copier à la fois les valeurs et les formats de nombres. Je serais heureux si vous pouviez également nous aider à ce sujet. Encore merci!
Vous avez sélectionné une réponse à laquelle j'ai personnellement attribué un point bonus car je la trouve géniale. Votre question concernant mon code semble être dans la catégorie d'un suivi concernant un également exécuté. Si c'est important pour vous, posez-lui une nouvelle question. Notez que la vitesse vient du fait de ne pas copier les formats. En fonction de votre problème exact, le code peut être étendu pour appliquer des formats aux nouvelles colonnes une fois que les valeurs ont été collées.
Merci encore @Variatus pour le code, je viens de résoudre le problème en exécutant une nouvelle macro pour copier le formatage après l'exécution de votre code. Cela a fonctionné parfaitement!