excel 将交替行复制到中间的空白中

hm2xizp9  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(140)

我有一个宏,它需要一个电子表格,其中有一行数据,然后是一个空白行。该宏复制一些数据从第一行到第二行。为了实现这一点,它看一个字段,其中包括数据时,一行将需要复制(切真的),如果检查单元格不是空的,它削减数据进一步进入行,并粘贴到下面的行。

当我运行宏时,它正确地剪切和粘贴了几行数据,然后它切换到剪切空白单元格和覆盖数据。

这是一个更大的宏的一部分,其中包括插入空行。当这个错误出现时,我把它分成两个步骤,这就是为什么定义了额外的变量。插入空行工作正常。然后我把数据保存为csv以清除第一个宏中的任何格式,并运行第二个宏。我使用的代码如下:

Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+Shift+Q
'

Dim iCounter As Long
Dim LastRowColumnB As Long, NewLastRow As Long
    LastRowColumnB = Cells(Rows.Count, 2).End(xlUp).Row
    NewLastRow = LastRowColumnB + LastRowColumnB
    Dim MyRange As Range, NewRange As Range
    Set MyRange = Range("B2:B" & LastRowColumnB)
    Set NewRange = Range("B2:B" & NewLastRow)
 With ActiveSheet
        For Each Row In NewRange
            If IsEmpty(Row.Cells(10)) Then
                Range(Cells(Row.Row, 16), Cells(Row.Row, 25)).Cut Destination:=Range(Cells(Row.Row + 1, 6), Cells(Row.Row + 1, 15))
            End If
            MsgBox ("Pause")
        Next Row
    End With
    
End Sub

我试过以If和If Not IsEmpty两种方式运行。当以If Not运行时,没有单元格被正确剪切和粘贴,但当以If运行时,好的数据会从更改的位置开始被覆盖。我也试过不同长度的数据集。正确处理的行数之间没有明显的联系(例如,它与插入宏运行之前的初始行数有关)。
显然,添加消息框只是为了使程序一次运行一行,以用于诊断目的。

unftdfkk

unftdfkk1#

下面是你的代码和我的更正:

Option Explicit

Sub Macro1()
    Dim LastRowColumnB As Long
    LastRowColumnB = Cells(Rows.Count, 2).End(xlUp).Row + 1

    Dim MyRange As Range
    Set MyRange = Range("B2:B" & LastRowColumnB)

    Dim tmpRow As Range
    
    For Each tmpRow In MyRange.EntireRow
        If IsEmpty(tmpRow.Cells(11)) Then
            Range(Cells(tmpRow.Row - 1, 16), Cells(tmpRow.Row - 1, 25)).Cut _
            Destination:=Range(Cells(tmpRow.Row, 6), Cells(tmpRow.Row, 15))
        End If
    Next tmpRow
End Sub

以下是我建议的方法:

Option Explicit

Sub Macro1()
    Dim LastRowColumnB As Long
    LastRowColumnB = Cells(Rows.Count, 2).End(xlUp).Row + 1

    Dim MyRange As Range
    Set MyRange = Range("B2:B" & LastRowColumnB)

    Dim tmpCell As Range
    
    For Each tmpCell In MyRange.Cells
        If IsEmpty(tmpCell.Offset(0, 10)) Then
            tmpCell.Offset(0, 4).Resize(1, 10).Value = _
            tmpCell.Offset(-1, 14).Resize(1, 10).Value
        End If
    Next tmpCell
    
    Set MyRange = Nothing
End Sub

相关问题