Excel 用于插入空行的VBA代码不';我不总是工作

Excel 用于插入空行的VBA代码不';我不总是工作,excel,vba,Excel,Vba,我试图在两行之间插入一个空行,如果A1和A2中的值相同。我得到了下面的代码,如果数据看起来像这样,它就可以工作了a,a,b,b,c,c,d,d,e,e,f,f,g,g,h,h,I,I。结果正是我想要的:a,空行,a,空行,b空行,b,空行,c,空行,c,等等 但是,如果数据看起来像这样a、b、c、d、e、f、g、h、i,那么我在a和b之间得到了8个空行,但在其他任何地方都没有 你知道为什么会这样吗 Sub-Social_-Distance() 将ws设置为工作表:设置ws=ThisWorkbo

我试图在两行之间插入一个空行,如果A1和A2中的值相同。我得到了下面的代码,如果数据看起来像这样,它就可以工作了
a,a,b,b,c,c,d,d,e,e,f,f,g,g,h,h,I,I
。结果正是我想要的:a,空行,a,空行,b空行,b,空行,c,空行,c,等等

但是,如果数据看起来像这样
a、b、c、d、e、f、g、h、i
,那么我在a和b之间得到了8个空行,但在其他任何地方都没有

你知道为什么会这样吗


Sub-Social_-Distance()
将ws设置为工作表:设置ws=ThisWorkbook.Sheets(“Sheet2”)
变暗lr为长,MyUnion为范围,xCell为范围
lr=ws.Range(“A”&ws.Rows.Count).End(xlUp).Row
对于ws.Range中的每个xCell(“A2:A”和lr)
如果xCell.Value为xCell.Offset(1.Value),则
如果不是我的联盟,那就什么都不是了
设置MyUnion=Union(MyUnion,xCell.Offset(1))
其他的
设置MyUnion=xCell.Offset(1)
如果结束
如果结束
下一个xCell
如果不是MyUnion,则MyUnion.EntireRow.Insert Shift:=xlDown
端接头

这使用一个helper列和排序将其放入空行:

Sub Social_Distance()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet14")'change to your sheet

    Dim lr As Long
    lr = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

    Dim rngArr As Variant
    rngArr = ws.Range(ws.Cells(1, 1), ws.Cells(lr, 1)).Value

    Dim rowArr() As Variant
    ReDim rowArr(1 To lr - 1, 1 To 1)

    Dim x As Double
    x = 0#

    Dim i As Long
    For i = 2 To lr
        If rngArr(i, 1) <> rngArr(i - 1, 1) Then x = x + 1
        rowArr(i - 1, 1) = x
    Next i

    Dim newLineArray() As Variant
    ReDim newLineArray(1 To Int(x - 1), 1 To 1)

    For i = 1 To Int(x - 1)
        newLineArray(i, 1) = CDbl(i) + 0.1
    Next i

    ws.Columns(1).Insert
    ws.Range("A1").Value = "Temp"
    ws.Range("A2").Resize(lr - 1).Value = rowArr
    ws.Range("A" & lr + 1).Resize(Int(x - 1)).Value = newLineArray

    ws.UsedRange.Sort key1:=ws.Range("A1"), Header:=xlYes

    ws.Columns(1).Delete

End Sub
Sub-Social_-Distance()
将ws设置为工作表
将ws=ThisWorkbook.Sheets(“Sheet14”)更改为工作表
变暗lr为长
lr=ws.Range(“A”&ws.Rows.Count).End(xlUp).Row
Dim-rngArr作为变体
rngArr=ws.Range(ws.Cells(1,1),ws.Cells(lr,1)).Value
Dim rowArr()作为变量
ReDim rowArr(1对lr-1,1对1)
将x调为双精度
x=0#
我想我会坚持多久
对于i=2至lr
如果rngar(i,1)rngArr(i-1,1),那么x=x+1
rowArr(i-1,1)=x
接下来我
Dim newLineArray()作为变量
ReDim newLineArray(1到Int(x-1),1到1)
对于i=1到Int(x-1)
newLineArray(i,1)=CDbl(i)+0.1
接下来我
ws.Columns(1).插入
ws.Range(“A1”).Value=“临时”
ws.Range(“A2”).Resize(lr-1).Value=rowArr
ws.Range(“A”&lr+1).Resize(Int(x-1)).Value=newLineArray
ws.UsedRange.Sort key1:=ws.Range(“A1”),头:=xlYes
ws.Columns(1).删除
端接头

这使用一个helper列和排序将其放入空行:

Sub Social_Distance()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet14")'change to your sheet

    Dim lr As Long
    lr = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

    Dim rngArr As Variant
    rngArr = ws.Range(ws.Cells(1, 1), ws.Cells(lr, 1)).Value

    Dim rowArr() As Variant
    ReDim rowArr(1 To lr - 1, 1 To 1)

    Dim x As Double
    x = 0#

    Dim i As Long
    For i = 2 To lr
        If rngArr(i, 1) <> rngArr(i - 1, 1) Then x = x + 1
        rowArr(i - 1, 1) = x
    Next i

    Dim newLineArray() As Variant
    ReDim newLineArray(1 To Int(x - 1), 1 To 1)

    For i = 1 To Int(x - 1)
        newLineArray(i, 1) = CDbl(i) + 0.1
    Next i

    ws.Columns(1).Insert
    ws.Range("A1").Value = "Temp"
    ws.Range("A2").Resize(lr - 1).Value = rowArr
    ws.Range("A" & lr + 1).Resize(Int(x - 1)).Value = newLineArray

    ws.UsedRange.Sort key1:=ws.Range("A1"), Header:=xlYes

    ws.Columns(1).Delete

End Sub
Sub-Social_-Distance()
将ws设置为工作表
将ws=ThisWorkbook.Sheets(“Sheet14”)更改为工作表
变暗lr为长
lr=ws.Range(“A”&ws.Rows.Count).End(xlUp).Row
Dim-rngArr作为变体
rngArr=ws.Range(ws.Cells(1,1),ws.Cells(lr,1)).Value
Dim rowArr()作为变量
ReDim rowArr(1对lr-1,1对1)
将x调为双精度
x=0#
我想我会坚持多久
对于i=2至lr
如果rngar(i,1)rngArr(i-1,1),那么x=x+1
rowArr(i-1,1)=x
接下来我
Dim newLineArray()作为变量
ReDim newLineArray(1到Int(x-1),1到1)
对于i=1到Int(x-1)
newLineArray(i,1)=CDbl(i)+0.1
接下来我
ws.Columns(1).插入
ws.Range(“A1”).Value=“临时”
ws.Range(“A2”).Resize(lr-1).Value=rowArr
ws.Range(“A”&lr+1).Resize(Int(x-1)).Value=newLineArray
ws.UsedRange.Sort key1:=ws.Range(“A1”),头:=xlYes
ws.Columns(1).删除
端接头

也许这就是您所需要的,它适用于不同的连续值情况:

注意:当添加两个连续的单元格(在同一列中)时,它将被视为一个单元格(union就是这样工作的),因此您将
获得同一行中另一个单元格的位置,但列不同
,现在结果是:union=黄色范围[参见图片]

Sub Social_Distance()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet2")

Dim lr As Long, MyUnion As Range, xCell As Range
lr = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
k = 1
Dim cell As Range
For Each xCell In ws.Range("A2:A" & lr)
    If xCell.Value <> xCell.Offset(1).Value Then
        If Not MyUnion Is Nothing Then
            Set MyUnion = Union(MyUnion, xCell.Offset(1, k)): k = k + 1 'increase column index
        Else
            Set MyUnion = xCell.Offset(1, 0)
        End If
    End If
Next xCell
If Not MyUnion Is Nothing Then MyUnion.EntireRow.Insert Shift:=xlDown
End Sub
Sub-Social_-Distance()
将ws设置为工作表:设置ws=ThisWorkbook.Sheets(“Sheet2”)
变暗lr为长,MyUnion为范围,xCell为范围
lr=ws.Range(“A”&ws.Rows.Count).End(xlUp).Row
k=1
暗淡单元格作为范围
对于ws.Range中的每个xCell(“A2:A”和lr)
如果xCell.Value为xCell.Offset(1.Value),则
如果不是我的联盟,那就什么都不是了
设置MyUnion=Union(MyUnion,xCell.Offset(1,k)):k=k+1'增加列索引
其他的
设置MyUnion=xCell.Offset(1,0)
如果结束
如果结束
下一个xCell
如果不是MyUnion,则MyUnion.EntireRow.Insert Shift:=xlDown
端接头

例如:


也许这就是您需要的,它适用于不同的连续值情况:

注意:当添加两个连续的单元格(在同一列中)时,它将被视为一个单元格(union就是这样工作的),因此您将
获得同一行中另一个单元格的位置,但列不同
,现在结果是:union=黄色范围[参见图片]

Sub Social_Distance()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet2")

Dim lr As Long, MyUnion As Range, xCell As Range
lr = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
k = 1
Dim cell As Range
For Each xCell In ws.Range("A2:A" & lr)
    If xCell.Value <> xCell.Offset(1).Value Then
        If Not MyUnion Is Nothing Then
            Set MyUnion = Union(MyUnion, xCell.Offset(1, k)): k = k + 1 'increase column index
        Else
            Set MyUnion = xCell.Offset(1, 0)
        End If
    End If
Next xCell
If Not MyUnion Is Nothing Then MyUnion.EntireRow.Insert Shift:=xlDown
End Sub
Sub-Social_-Distance()
将ws设置为工作表:设置ws=ThisWorkbook.Sheets(“Sheet2”)
变暗lr为长,MyUnion为范围,xCell为范围
lr=ws.Range(“A”&ws.Rows.Count).End(xlUp).Row
k=1
暗淡单元格作为范围
对于ws.Range中的每个xCell(“A2:A”和lr)
如果xCell.Value为xCell.Offset(1.Value),则
如果不是我的联盟,那就什么都不是了
设置MyUnion=Union(MyUnion,xCell.Offset(1,k)):k=k+1'增加列索引
其他的
设置MyUnion=xCell.Offset(1,0)
如果结束
如果结束
下一个xCell
如果不是MyUnion,则MyUnion.EntireRow.Insert Shift:=xlDown
端接头

例如:


原帖已被删除。我无法消除bug:(当数据是单数时,这种方法将不起作用,因为VBA看到
行(“1:2”)
作为一个单一范围而不是两个区域。您需要使用辅助列来使用另一种方法。@ScottCraner这令人失望。很抱歉浪费您的时间Shaves@urdearboy......no担忧……这是一次学习经历;这从来都不是一件坏事。谢谢你的帮助……原来的帖子是。我无法消除bug:(当数据是单数时,这种方法不起作用,因为VBA将
行(“1:2”)
视为一个单一范围,而不是两个区域。您需要使用辅助列来使用另一种方法。@ScottCraner这令人失望。很抱歉浪费您的时间Shaves@urdearboy......no担心……这是一次学习经历