【问题标题】:How to move up one visible row?如何向上移动一个可见行?
【发布时间】:2021-05-08 12:29:10
【问题描述】:

我正在尝试在上方插入一行,然后在过滤后的电子表格中上移一行到下一个可见行。因为我想将操作应用于可见行(可以随机间隔),所以这行代码是不够的:

ActiveCell.Offset(-8, 0)

据我了解,这告诉 Excel 向上移动八行(因为我用来记录宏的单元格集恰好相隔八个单元格),而不是在当前过滤条件下移动到下一个可见行。

显示可见数据行随机分布的电子表格摘录

在这种情况下,相隔 6 行,但可以是任意数字。

宏代码:

ActiveCell.Rows("1:1").EntireRow.Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
ActiveCell.Offset(-8, 0).Rows("1:1").EntireRow.Select

我希望将最后一行代码“向上八行”替换为“在给定当前数据过滤器的情况下向上移动到下一个可见行”。

过滤器显示列 R = 0 的行,但我更喜欢不将该指令合并到 VBA 代码中而只查看可见数据而不是整个电子表格的方法。

【问题讨论】:

  • "doesn't work" 是一个非常无用的错误描述。 “有什么想法吗?” 是一个非常随机的问题。请参阅How to Askminimal reproducible example 提供一个很好的例子并提出一个很好的问题。我强烈建议您阅读How to avoid using Select in Excel VBA,因为这是您为解决此问题而苦苦挣扎的主要原因。 • 请注意,截图和/或示例数据可以更轻松地了解正在发生的事情。
  • 谢谢,我已经添加了截图并澄清了问题。

标签: excel vba row


【解决方案1】:

据我了解,您想在当前行上方插入一行,然后按 Ctrl-up 以便它跳到最后一行不是空白的?试试这个:

r = Selection.Row: c = Selection.Column
Rows(LTrim(Str(r)) + ":" + LTrim(Str(r))).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
destrow = Range("A" & r).End(xlUp).Row
Cells(destrow, c).Select

请原谅我的编码风格孩子,我是在 GW-BASIC 上长大的,我对 21 世纪唯一的风格让步是我不会全部输入大写字母。

【讨论】:

  • 这正是我所需要的,并且比下面基于If的函数快得多:)
【解决方案2】:

您应该检查或行被隐藏

If Rows(15).Hidden then 'we are checking is Row 15 Hidden
    'row is Hidden
Else
    'row is Visible
End If

【讨论】:

  • 那么将上面的内容与 -1 的 activecell.offset 结合起来,让它循环遍历整个电子表格?我可以看到它是如何工作的,但我不会流利地使用必要的代码语言,但我会试一试,看看我想出了什么。
  • 这段代码似乎可以工作,尽管它明显比跳到下一个可见行而不是单独测试每一行的代码慢:Sub Insertrowabove()If ActiveCell.Rows("1:1").Hidden Then ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select Else ActiveCell.Rows("1:1").EntireRow.Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select End If End Sub(如何让代码整齐地显示行在 cmets 中?)
  • @David Stosser 的这个想法肯定更容易,继续使用 ActiveCell.Offset(-1, 0) 直到找到一个可见的!我建议使用它,我建议您 David 将其添加为答案。
  • @TimothyAlexisVass,我复制了上面的代码并在下面发布了一些评论作为替代答案。
【解决方案3】:

根据 Timothy 的建议,这是我根据 bankeris 的工作提出的代码:

    'row is Hidden
    ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select
    'move up one cell
Else
    'row is Visible
    ActiveCell.Rows("1:1").EntireRow.Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    ActiveCell.Offset(-1, 0).Rows("1:1").EntireRow.Select
    'insert row above then move up one.
End If

虽然我发现上面 Michael Angelico 的帖子可以更快地满足我的特定要求,但这是一个更通用的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2019-05-17
    • 2021-11-03
    • 2016-10-22
    相关资源
    最近更新 更多