除非我保存工作表,否则excel宏中的Worksheet_Activate不起作用

时间:2015-01-24 06:03:43

标签: excel vba excel-vba

我在" Main"中有以下代码片。

MsgBox "Code fired"

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

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

例: 我的主页目前显示RSP上的Count为50,我转到RSP表并在最后添加一个新行。当我回到Main页面时,计数增加到51.现在,如果我转到RSP并删除raw,然后返回主页,则计数不会减少。它仍然显示51.如果我保存工作簿,切换到其他工作表并返回主工作表,计数会更改。

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

2 个答案:

答案 0 :(得分:0)

您要查找指定列的最后一行还是最后一行? 以下是两种选择。

  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

答案 1 :(得分:0)

这可能适合你。

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

现在,解释。如果您想了解它,请完整阅读。

在尝试查找工作表中的最后一个单元格(或行,列)时,您首先要确定这是什么意思。

  1. 已使用=非空白,即数据

  2. 已使用=" ...正在使用中,表示包含数据或格式的部分。" This is the criterion used by Excel at the time of saving。另见this。 该标准通常产生意外的结果,但也可以有意地利用(不太经常,肯定地),例如突出或打印特定区域,这些区域最终可能没有数据。当然,作为保存工作簿时使用范围的标准是可取的。

  3. 通常,这两个标准为最后一个单元格提供相同的结果,这似乎是您的情况。 这已涵盖herehere

    对于标准1,找到最后使用过的单元格的众多方法中有三种是:

    1. UsedRange
    2. 控制 + 结束
    3. SpecialCells(xlLastCell)
    4. 方法2和3总是更新他们的目标"最后一个单元"添加(数据或格式)超过前一个最后一个单元格时。 但他们没有更新他们的目标"最后一个单元"直到从上一个单元格中删除(数据和格式)时保存工作簿。 方法1无需保存工作簿即可运行。

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

      1. .Find("*", ...(如上所用)。请检查thisthis
      2. (大多数?)即使不保存工作簿,这些方法也能正常工作。