2
votes

Comment faire une boucle pour copier des données après des cellules vides dans une colonne et les coller dans la dernière colonne vide?

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
entrez la description de l'image ici

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.


0 commentaires

3 Réponses :


3
votes

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


3 commentaires

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 :)



1
votes

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


1 commentaires

Merci beaucoup. Cela fonctionnait parfaitement aussi. Merci une fois de plus!



2
votes

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


3 commentaires

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!