VBA代码不会查看隐藏的行,以添加跟踪编号为

时间:2016-06-22 10:46:09

标签: excel vba excel-vba

我有另一个问题,我希望在你的帮助下解决。

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

我想做的是:   - 按一个按钮并添加一行。   - 使用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

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

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

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

解决方案。有没有办法解决这个问题?也许有一种更聪明的做事方式?我调查了一些事情,但主要是我使用“(”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

4 个答案:

答案 0 :(得分:2)

更新

我看到你的工作表有一个自动过滤器"隐藏"状态行 - 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

答案 1 :(得分:1)

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

<强>相反:

  1. 取消隐藏所有
  2. 执行所有必需的插入和编辑
  3. 通过循环,隐藏标记为&#34;已关闭&#34;
  4. 的所有行

答案 2 :(得分:0)

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

LastRow = wsActiviteiten.UsedRange.Rows.Count

答案 3 :(得分:0)

我刚刚找到了解决方法:

如果您的范围内至少有一列具有“一致”数据(该列中的所有单元格都不为空/空白),则可以使用公式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”。

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