Excel 用于插入空行的VBA代码不';我不总是工作
我试图在两行之间插入一个空行,如果A1和A2中的值相同。我得到了下面的代码,如果数据看起来像这样,它就可以工作了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
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担心……这是一次学习经历