【问题标题】:VBA-code does not look through hidden rows for adding a row with tracking numberVBA 代码不查看隐藏行以添加带有跟踪号的行
【发布时间】:2018-08-17 18:07:16
【问题描述】:

我还有一个问题希望能在您的帮助下解决。

我想做什么。 我使用 Excel 来跟踪我的工作、活动、联系人等。在这样做的同时,我发现我在一个名为“活动”的工作表的末尾添加行时做了很多重复的工作。

我想做的是: - 按一个按钮并添加一行。 - 将trackingnumber增加1 - 插入默认值

代码。 为了自动执行此操作,我发现(复制、粘贴、根据需要调整)以下代码:

 Sub AddRowActiviteiten_NewAtEnd()
'Add's a new row at the end of the sheet.

Dim wsActiviteiten As Worksheet
Set wsActiviteiten = Sheets("Activiteiten")

DefType = "Daily"
DefStatus = "Open"
DefIssue = "*****"
DefImpact = "*****"
DefPrio = "Laag"
MyDate = Date

wsActiviteiten.Range("A4").Value = "1"

'Copy the "One Row To Rule Them All"
wsActiviteiten.Range("A3:Q3").Copy

wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteAll)

'Stop the "copy-action"
Application.CutCopyMode = False

'Increase the tracking number with "one"
LastNumber = wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Value
wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = LastNumber + 1

'Insert default values
LastRow = wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(-1, 0).Row
Cells(LastRow + 1, 2) = DefType
Cells(LastRow + 1, 3) = DefStatus
Cells(LastRow + 1, 4) = DefIssue
Cells(LastRow + 1, 5) = DefImpact
Cells(LastRow + 1, 6) = DefPrio
Cells(LastRow + 1, 8) = MyDate

'Step down 1 row from present location.
ActiveCell.Offset(1, 0).Select

End Sub

问题。 在这张表中,我打开了新项目,但我也关闭了它们。我通过更改它们的状态并将它们从视图中隐藏来做到这一点。这就是它出错的地方。当我关闭列表中的 last item 并想要添加新行时,宏会在 last visible 条目下方添加 new row。它没有找到我刚刚隐藏的最后一个条目。而且,发生这种情况时,将默认值添加到新行不起作用。它将它们添加到添加的行上方。

不知何故,这完全有道理。我告诉宏查找最后一个条目,但我不明白为什么它会查看最后一个 visible 条目以及为什么它不查看隐藏行。

复制。将代码复制到工作表中(也许您需要更改工作表的名称)并添加几行。将一些信息放在最后一行并将其隐藏。添加另外几行,看看会发生什么。

解决方案。有没有办法解决这个问题?也许有更聪明的做事方式?我调查了一些事情,但大多数情况下我使用“(”A“&Rows.Count).End(xlUp)”得到了结果。循环可以工作,但我担心 1)它不会搜索隐藏的行和 2)它会使工作表(有点)迟缓。我必须说我已经尝试过循环,首先我想看看我的第一个解决方案是否可以挽救。

感谢您的意见,如果有任何问题,请告诉我。

西蒙 编辑:任何感兴趣的人的工作代码

  Sub AddRowActiviteiten_NewAtEnd()
'Add's a new row at the end of the sheet.

Dim wsActiviteiten As Worksheet
Set wsActiviteiten = Sheets("Activiteiten")

DefType = "Daily"
DefStatus = "Open"
DefIssue = "*****"
DefImpact = "*****"
DefPrio = "Laag"
MyDate = Date

'Copy the One Row To Rule Them All
wsActiviteiten.Range("A3:Q3").Copy

'Offset(y,x)
'De -16 is een getal dat iets doet, maar ik weet niet wat.
wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(1, -16).PasteSpecial (xlPasteAll)

'Stop the "copy-action"
Application.CutCopyMode = False

'Het volgnummer verhogen met 1
'Het laatste getal selecteren (LastNumber) en dan plus 1.
LastNumber = wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(0, -16).Value
wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(1, -16).Value = LastNumber + 1

'Insert default values
LastRow = wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(-1, 0).Row
Cells(LastRow + 1, 2) = DefType
Cells(LastRow + 1, 3) = DefStatus
Cells(LastRow + 1, 4) = DefIssue
Cells(LastRow + 1, 5) = DefImpact
Cells(LastRow + 1, 6) = DefPrio
Cells(LastRow + 1, 8) = MyDate

'Step down 1 row from present location.
ActiveCell.Offset(1, 0).Select

End Sub

【问题讨论】:

  • 我将以您的问题为例说明如何提出问题。
  • 也许MSDN - SpecialCells 可能会有所帮助。特别是xlCellTypeLastCell

标签: vba excel


【解决方案1】:

更新

我看到您的工作表有一个自动过滤器“隐藏”状态行 - Find 不会检测到,这与隐藏行不同。

建议你试试下面这个更新的代码:

Sub Test()

Dim rng1 As Range
If ActiveSheet.AutoFilterMode Then
    MsgBox ActiveSheet.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Row
Else
    Set rng1 = Columns("A:A").Find("*", [a1], xlFormulas, , xlByRows, xlPrevious)
    If Not rng1 Is Nothing Then MsgBox rng1.Row
End If
End Sub

首发

如果您要隐藏行,则可以使用 FindxlFormulas 选项来查找隐藏行中的条目(与 xlValues 不同)。

Dim rng1 As Range
Set rng1 = Columns("A:A").Find("*", [a1], xlFormulas, , xlByRows, xlPrevious)
MsgBox rng1.Address

【讨论】:

  • 我正在尝试在工作表上的单独模块中使用此特定代码。当我隐藏一行时,这个宏会出现下一个值的位置,但不是隐藏的。在 xlFormulas 上阅读时,它应该从隐藏位置找到一个值。我在这里有什么遗漏吗?
  • @simon 你能上传一个示例工作簿(到云等)吗?
  • 当然,给你:we.tl/smyHLFDM49。我已经将您的代码添加到工作表中。 (这是第二个链接,另一个不好)。
  • @simon 请试试这个更新的代码。文件很有用:)
  • @simon 此行返回自动过滤器ActiveSheet.AutoFilter.Range.Address 的范围。拆分分解范围,然后返回第二部分(即,如果范围是 C1:C10,则返回 C10)。 Split(ActiveSheet.AutoFilter.Range.Address, ":")(0)) 将返回第一部分 C1。然后 Range 对此做了一个地址。
【解决方案2】:

假设我们有一个状态列 AB,我们目前通过在该列中放置“已关闭”一词然后隐藏该行来关闭一个项目。

改为:

  1. 取消隐藏所有
  2. 执行任何所需的插入和编辑
  3. 通过循环,隐藏所有标记为“已关闭”的行

【讨论】:

  • 感谢您对 Gary 的学生的评论。我可以看到这在我的工作表上是如何工作的。但我不得不问,每次添加一行时都执行这些操作,这会大大减慢我的工作表吗?
【解决方案3】:

使用它来获取最后一行,它会看到最后一行,即使它是隐藏的。

LastRow = wsActiviteiten.UsedRange.Rows.Count

【讨论】:

  • UsedRange 不一定从第 1 行开始。这是不可靠的。
  • 当我尝试使用 OP 建议我们使用的示例时,它可以工作。所以基于此......它似乎工作得很好。 o.O
  • 我知道这可能不可靠,但在这个特定的宏中,在那个特定的点上,我认为它可能会起作用。谢谢你的回答罗杰。
  • 添加到我之前的评论。我已经对此进行了测试,它按照它所说的做了。
  • 它可能适用于经过测试的案例,但 UsedRange 不可靠,因为 Excel 经常“忘记”实际范围,并且 Rows.Count 以这种方式假设有数据从 row1 开始。
【解决方案4】:

我刚刚找到了解决方案:

如果您的范围内至少有一列包含“一致”数据(该列中的所有单元格都不为空/空白),您可以使用公式 COUNTA,并且可以将代码引用到该 COUNTA 公式的值。

例如:

在“B1”单元格中插入公式“=COUNTA(A1:A100000)”。

在 B1 中,您将获得隐藏或未隐藏的行数。

在您的代码更改中:

wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteAll)

wsActiviteiten.Range("A" & Range("B1").Value).Offset(1, 0).PasteSpecial (xlPasteAll)

当然,例如,如果单元格“A2”是空白的,并且这是您需要将公式调整为“=COUNTA(A1:A100000) +1”的唯一空白单元格。

如果您有更多空白/空单元格并且您不知道它们的确切数量(空白单元格已动态更改),此方法将不起作用。 正如我之前所说,您需要至少有一列包含“一致”数据(如果有的话,提前知道数量的空单元格)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2011-06-07
    相关资源
    最近更新 更多