Worksheet_Activate 中的 excel 宏无法运行,除非我保存 sheet

Worksheet_Activate in excel macro not functioning unless I save the sheet

我的 "Main" Sheet.

中有以下代码
MsgBox "Code fired"

Sheets("Main").Range("H" & 2) =Sheets("RSP").Cells.SpecialCells(xlLastCell).Row

我的目的是从 RSP sheet 中获取最大使用单元格并将其放入 Main sheet.And 这段代码很好,它给了我正确的计数。 但是,代码仅在我保存工作簿时有效。

例如: 我的主页目前在 RSP 上显示计数为 50,我转到 RSP sheet 并在末尾添加一个新行。当我回到主页面时,计数增加到 51。现在,如果我转到 RSP 并删除一个原始文件,然后返回主页面,计数不会减少。它仍然显示 51。如果我保存工作簿,切换到其他 sheet 并返回 Main sheet。

,计数会发生变化

我尝试在两个地方放置相同的代码,即主页的 Worksheet_activate 和 RSP 页面的 WorkSheet_Deactivate。但没有区别。而且,在所有情况下,消息框都在工作。

您要查找任何最后一行或指定列的最后一行吗? 这里有两种选择。

  Sub FindAnyLstRow()
    Dim ws As Worksheet, MyRng As Range
    Dim sh As Worksheet
    Dim Rws As Long, r As Range, fRng As Range

    Set ws = Worksheets("Main")
    Set MyRng = ws.Range("H2")
    Set sh = Worksheets("RSP")

    With sh
        Set r = .Range("A1")
        Rws = .Cells.Find(what:="*", after:=r, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    End With

    MyRng = Rws

End Sub


And 

    Sub GetLastCellInColumnA()

    Dim ws As Worksheet, MyRng As Range
    Dim sh As Worksheet
    Dim Rws As Long, fRng As Range

    Set ws = Worksheets("Main")
    Set MyRng = ws.Range("H2")
    Set sh = Worksheets("RSP")

    With sh
        Rws = .Cells(Rows.Count, "A").End(xlUp).Row
        Set fRng = .Cells(Rws, 1)
    End With

    MyRng = fRng

End Sub

这可能对你有用。

Sheets("Main").Range("H2") = Sheets("RSP").Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row

现在,解释一下。如果您想了解它,请完整阅读此内容。

当试图找到工作表中的最后一个单元格(或行、列)时,您必须首先确定这是什么意思。

  1. Used = 非空白,即有 data.

  2. Used = “...正在使用,意思是包含 数据或格式 的部分。” This is the criterion used by Excel at the time of saving. See also this。 这个标准通常会产生意想不到的结果,但它也可能被有意利用(当然不太常见),例如,突出显示或打印最终可能没有数据的特定区域。当然,最好将其作为保存工作簿时使用范围的标准。

通常,这两个标准对最后一个单元格给出相同的结果,这似乎是您的情况。 这已涵盖 here and here

对于条件 1,查找最后使用的单元格的多种方法中的三种是:

  1. UsedRange.
  2. Ctrl+End.
  3. SpecialCells(xlLastCell).

方法 2 和 3 在添加(数据或格式)超过上一个最后一个单元格时总是更新它们的目标 "last cell"。 但是他们不会更新他们的目标 "last cell" 直到你从上一个最后一个单元格中删除(数据和格式)时保存工作簿。 方法 1 无需保存工作簿即可工作。

对于crtierion 2,也有很多方法:

  1. .Find("*", ...(如上所用)。请检查 this or this.
  2. 等等

(大部分?)即使不保存工作簿,这些方法也可以使用。