【问题标题】:How to loop to copy data following blank cells in a column and paste it to last empty column?如何循环复制列中空白单元格后的数据并将其粘贴到最后一个空列?
【发布时间】:2019-01-02 09:37:10
【问题描述】:

我需要复制 A 列中的数据块(位于空格之间)并将其粘贴到最后一个空列。 示例:我有 A1:A18 范围内的数据和一个空白单元格,还有 A20:A37 和 2 个空白单元格中的数据以及 A40:A57 中的数据等等。我需要复制这些数据并粘贴到 B、C、D 列中......

空格的样式不统一。

Excel文件截图

我在互联网上进行了一些研究,并创建了一个代码来将 A 列中手动选择的数据粘贴到最后一个空列。但是列表太长了,我想自动化这个过程。

我尝试使用此代码查找空格并复制数据。它找到最后一个空白行并复制所有数据,弹出错误。

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

我相信这个问题可以通过循环来解决,但我对此一无所知,因为我是 VBA 新手。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    试试这个,它使用 SpecialCells 来提取单元块(或区域)。它假定单元格不包含公式,因此如果不是这种情况,则需要更改。

    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
    

    【讨论】:

    • 非常感谢!代码运行良好。我非常感谢您提供此代码。它正好解决了我的问题。再次感谢您!
    • 我的荣幸。顺便说一句,我建议您将过程和变量名称更改为更有意义的术语。
    • 感谢您的建议 :)
    【解决方案2】:

    请尝试此代码。它非常灵活。您可以根据环境要求调整其顶部的四个参数。

    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
    

    【讨论】:

    • 非常感谢您的代码,非常感谢您的帮助,此代码运行良好且速度也很快。但是我怎样才能复制格式呢?我想复制值和数字格式。如果你也能在这件事上提供帮助,我会很高兴。再次感谢!
    • 您选择了一个答案,我个人对此给予了奖励积分,因为我认为它非常出色。您关于我的代码的问题似乎属于后续行动的范畴。如果这对您很重要,请给它一个新问题。请注意,速度来自不复制格式。根据您的确切问题,代码可能会扩展为在粘贴值后将格式应用于新列。
    • 再次感谢@Variatus的代码,我刚刚解决了运行代码后运行新宏以复制格式的问题。效果很好!
    【解决方案3】:

    我觉得你可以试试:

    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
    

    【讨论】:

    • 非常感谢。这也很有效。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多