【问题标题】:Insert 2 blank rows after every currentregion在每个 currentregion 之后插入 2 个空白行
【发布时间】:2016-07-09 07:40:30
【问题描述】:

我需要在 Excel 中每个当前数据区域之后插入 2 个空白行。

理论上我的代码应该可以工作并在数据之后插入它但是在尝试了这么多次之后,它在数据之前而不是之后插入它。

我哪里做错了?有人可以指导我吗?谢谢!

Sub AutoInsert2BlankRows()

Selection.CurrentRegion.Select
SendKeys "^{.}"
SendKeys "^{.}"
SendKeys "~"

ActiveCell.EntireRow.Select
'this chooses the whole row

Selection.Insert Shift:=xlDown
Selection.Insert Shift:=xlDown
End Sub

这是我的图片以供进一步澄清。 如您所见,有 3 个不同的 currentregions 由空白行分隔。 我需要的是在已经存在的空白行之外插入 2 个额外的空白行,以便在每个当前区域之间创建 3 个空白行。 (抱歉,如果我之前不够清楚。)

这里是image!的链接

【问题讨论】:

  • SendKeys "^{.}" 打算做什么?不应该是SendKeys "^{DOWN}" 吗?见Contextures SendKeys
  • @Jeeped 实际上,Sendkeys "^{DOWN}" 不起作用。相反,它一直向下滚动到 A1048576,这绝对是太远了
  • 检查您要发布的图片上的网址;好像是空格。
  • @AndyG - 老实说,我不知道我是否应该为不知道这一点而感到遗憾或为这一事实感到自豪。
  • 作为一个新手程序员,你为什么会使用SendKeys而不是更明显的.End(xlDown)等?

标签: vba excel sendkeys


【解决方案1】:

这是你想要做的吗?

第一个例子

Sub AutoInsert2BlankRows()

'   // Set Variables.
    Dim Rng As Range
    Dim i As Long

'   // Target Range.
    Set Rng = Range("A2:A10")

'   // Reverse looping
    For i = Rng.Rows.Count To 2 Step -1

'       // Insert two blank rows.
        Rng.Rows(i).EntireRow.Insert
        Rng.Rows(i).EntireRow.Insert

'   // Increment loop
    Next i


End Sub

编辑

要在每个空白行之后再添加两个空白行,请尝试以下操作。

第二个例子

Sub AutoInsert2BlankRows()

'   // Set Variables.
    Dim Rng As Range
    Dim i As Long

'   // Target Range.
    Set Rng = Range("A2:A10")

'   // Reverse looping
    For i = Rng.Rows.Count To 2 Step -1

        If Cells(i, 1).Value = 0 Then

'          // Insert two blank rows.
            Rng.Rows(i).EntireRow.Insert
            Rng.Rows(i).EntireRow.Insert

        End If

'   // Increment loop
    Next i


End Sub

第三个​​例子

Option Explicit
Sub AutoInsert2BlankRows()
'   // Set Variables.
    Dim Rng As Range
    Dim i As Long

'   // Target Range.
    Set Rng = ActiveSheet.UsedRange

'   // Reverse looping
    For i = Rng.Rows.Count To 1 Step -1

'       // If entire row is empty then
        If Application.CountA(Rows(i).EntireRow) = 0 Then

'           // Insert blank row
            Rows(i).Insert
            Rows(i).Insert

        End If

    Next i

End Sub

【讨论】:

  • 感谢@Om3r 的回答。但是我不需要在每行数据之后添加 2 行。相反,在需要添加 2 个空行之前,它们是可变行数。有没有办法解决这个问题?
  • 嗨@Om3r 您的答案将在您的代码稍作调整后工作......只需将 if Cells (i,1) 更改为 (i,2) ,因为第一列是空白的。但是,在我的其他作品中,行数不是固定的而是可变的,我将如何设置范围?由于有些工作表只有 20 行,但有些则高达 500 多行。你能教我如何去解决方差问题吗?谢谢! :)
  • 感谢您的帮助@Om3r!非常感谢!
【解决方案2】:

如果您在Worksheet.UsedRange property 中使用Range.SpecialCells 方法获取所有xlCellTypeConstants,您将拥有多个不连续的Areas。这些等同于Range.CurrentRegion property。循环浏览它们并根据需要插入行。

Sub autoInsertTwoBlankRows()
    Dim a As Long
    With Worksheets("Sheet1")
        With .UsedRange.SpecialCells(xlCellTypeConstants)
            For a = .Areas.Count To 1 Step -1
                With .Areas(a).Cells(1, 1).CurrentRegion
                    .Cells(.Rows.Count, 1).Offset(1, 0).Resize(2, .Columns.Count).Insert _
                      Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                End With
            Next a
        End With
    End With
End Sub

如果您的数据同时包含公式和类型常量,那么这更合适。

Sub autoInsertTwoBlankRows()
    Dim a As Long, ur As Range

    With Worksheets("Sheet1").Cells
        With Union(.SpecialCells(xlCellTypeConstants), _
                   .SpecialCells(xlCellTypeFormulas))
            For a = .Areas.Count To 1 Step -1
                With .Areas(a).Cells(1, 1).CurrentRegion
                    .Cells(.Rows.Count, 1).Offset(1, 0).Resize(2, .Columns.Count).Insert _
                      Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                End With
            Next a
        End With
    End With
End Sub

在插入行时,尝试从底部到顶部进行操作,以便置换行不会影响进一步的操作。这就是我从最后一个区域开始并朝着第一个方向努力的原因。

      
autoInsertTwoBlankRows 之前的数据孤岛autoInsertTwoBlankRows 之后的数据孤岛

【讨论】:

  • 您的代码成功了一半! :) 就像它在第 11 行添加了 2 行但不幸的是它在第 2 行和第 3 行之间而不是第 7 行之间添加了第 2 次。您还可以解释更多关于代码的信息吗?比如你为什么使用 Resize 和 UsedRange 属性?你能告诉我更多吗?谢谢
  • 抱歉 - 这是 MSDN Range.Resize property 的链接。在阅读了我提供的 UsedRange 链接后,您遇到了哪些问题?我看不出这怎么可能错过了一个空白行并在错误的位置插入了两次行。
  • 亲爱的 Jeeped,我已经努力测试它,但它在我的电脑和 Excel 上确实不起作用。也许我可以将包含您拥有的代码的文件发送给您?它仍然显示与以前相同的错误......也很抱歉打扰,但为什么要调整大小(2,1)。如果我理解我阅读的内容, (,1) 是否会导致每行增加一列?还有 .entirerow.insert 考虑到调整大小已经添加了 2 个空白行,它的目的是什么?很抱歉给您带来不便,并感谢您的帮助。对此,我真的非常感激! :)
  • 如果您有两个不同的区域共享同一行,则将在每个区域的末尾插入行。这将区域分开。
  • @ThomasInzina - 我将按照 OP 在图像中提供的内容。但你是对的,如果新行插入的宽度与正在处理的当前区域一样宽,它可能会更通用。
【解决方案3】:

更新:感谢您的关注。

子 AutoInsert2BlankRows() 有应用程序 .ScreenUpdating = 假 .EnableEvents = 假 .Calculation = xlCalculationManual 结束于 Dim lastRow As Long, x As Long lastRow = Cells.Find(What:="*", _ After:=Range("A1"), _ LookAt:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row For x = lastRow To 2 Step -1 If WorksheetFunction.CountA(Rows(x)) > 0 And WorksheetFunction.CountA(Rows(x + 1)) = 0 Then Rows(x + 1 & ":" & x + 2).Insert Shift:=xlDown End If Next With Application .ScreenUpdating = True .EnableEvents = True .Calculation = xlCalculationAutomatic End With End Sub

/pre>

在 A、B、C 和 E 之后插入了两行,但没有在 D 和 E 之间插入,因为它们重叠。

【讨论】:

  • 您好 Thomas,您的代码仅在第一列包含数据的假设下有效。但是,在我的示例中,有一个空白列。即 A 为空。我们如何编辑它,以便在数据从 B 列及以后开始之前包含空列 A 的情况下它可以工作?谢谢你。 (为什么你使用 CountA 而不仅仅是 Count?你能告诉我吗?)谢谢!
  • 非常感谢您的帮助@Thomas!非常感谢! :)
【解决方案4】:

(“~”在做什么?)

确保所选内容位于该区域的某处。使用您的代码Ctrl-. 可能不会导航到最后一个单元格,具体取决于您运行它时活动单元格的位置。我会使用:

Dim rng As Range
Application.ScreenUpdating = False
Set rng = Selection.CurrentRegion
Set rng = rng(rng.Count + 1)    'the last cell + 1 row
rng.EntireRow.Rows("1:2").Insert shift:=xlDown

【讨论】:

  • Hi @AndyG ~ 是在 Sendkeys 中输入的命令。就像当您按下回车按钮移动到下一行时一样?感谢您的帮助
  • 我认为是"{Enter}",简单搜索一下即可确认。我不确定你为什么需要它。在我的代码中使用rng.Count 定位区域的最后一个单元格,+ 1 定位下一行。
  • 您的代码在理论上有效,但不知道为什么它在现实生活中无效......而且它也可以设置为 rng = rng(rng.Count + 2) 因为下一个数据区域的开始2 条线不是 1 条吗?我对此不太确定,你能告诉我吗?谢谢
  • 糟糕,我已将其编辑为使用EntireRow,它只是在单个列中向下推。我不需要使用+2,因为我要插入两行“1:2”。 (当然,我们依赖于选择在正确的区域。)
  • 嗨,Andy G 我试过你的代码,但我仍然无法得到想要的结果。这可能是因为您将 rng 设置为 selection.currentregion 这意味着它将在第一个区域之后连续仅添加 2 行,因此无法在其他区域之间添加 2 行?我们将如何着手解决 currentregion 的这个问题并能够连接到其他区域呢?感谢您分享您的知识!
【解决方案5】:

这对我有用,使用 Excel 2007。

Sub AutoInsert2BlankRows()
Dim rng As Range

Set rng = Selection.End(xlDown).EntireRow
rng.Offset(1).Insert Shift:=xlDown
rng.Offset(1).Insert Shift:=xlDown

End Sub

我已经修改并简化了问题中的代码,主要是为了避免选择单元格。用户已在区域中选择了一个单元格,他们希望在该单元格之后插入两行。变量rng 首先移动到区域的底部,然后选择整行。这两行插入到rng 之前,其中rng 偏移了一行,以确保它们位于感兴趣区域之后。我确信这两行可以作为一个命令插入,但我还不知道如何。

【讨论】:

  • 嗨,克里斯,不幸的是,您的代码给了我错误...在最后的第 3 行和第 2 行,错误“1004”应用程序定义或对象定义错误显示...。
  • 奇怪,它对我来说很好用。我使用的是 Excel 2007,它可能与您的版本不同。
  • 我正在使用 Excel 2013,是的,这可能是它引起如此多混乱的原因。无论如何,感谢您的帮助,我很感激!祝你有美好的一天!
  • “虽然这个代码块可能会回答这个问题,但最好能稍微解释一下为什么会这样。”
【解决方案6】:

这不会在最后一个“当前区域”之后添加额外的行

Sub AutoInsert2BlankRows()
    With Worksheets("mySheet").UsedRange '<-- change "mySheet" as per your actual sheet name
        With .Offset(, .Columns.Count).Resize(, 1)
            .FormulaR1C1 = "=IF(counta(RC1:RC[-1])>0,1,"""")"
            .Value = .Value
            With .SpecialCells(xlCellTypeBlanks).EntireRow
                .Insert Shift:=xlDown
                .Insert Shift:=xlDown
            End With
            .Clear
        End With
    End With
End Sub

【讨论】:

  • @NewLearner,你试过了吗?
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多