【问题标题】:Worksheet_Activate in excel macro not functioning unless I save the sheet除非我保存工作表,否则 Excel 宏中的 Worksheet_Activate 不起作用
【发布时间】:2015-06-13 02:50:37
【问题描述】:

我的“主要”工作表中有以下代码。

MsgBox "Code fired"

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

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

例如: 我的主页目前显示 RSP 上的计数为 50,我转到 RSP 表并在末尾添加一个新行。当我回到主页时,计数增加到 51。现在,如果我去 RSP 并删除一个 raw,然后返回主页,计数并没有减少。它仍然显示 51。如果我保存工作簿、切换到其他工作表并返回主工作表,计数会发生变化。

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

【问题讨论】:

  • SpecialCells(xlLastCell) 遇到与UsedRange 相同的问题,众所周知是有问题的。不要使用它。在 SO 上的答案中还有多种其他方法。哪一种适合您取决于您​​的具体要求。
  • @chrisneilsen - 关于要求保存工作簿以提供正确结果的问题适用于SpecialCells(xlLastCell),但不适用于UsedRange。请参阅下面的答案,以及*.com/a/27637752/2707864 以获取更多信息。
  • 您发现发布的内容有用吗?请发表反馈意见。
  • 是的,代码更改如下,它适用于每个 activesheet.deactivate() Sheets("Main").Range("I" & 2) = (Range( "I" & Rows.Count).End(xlUp).Row - 1)

标签: vba excel


【解决方案1】:

这可能对你有用。

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

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

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

  1. Used = 非空白,即有数据

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

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

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

  1. UsedRange
  2. Ctrl+结束.
  3. SpecialCells(xlLastCell)

方法 2 和 3 在添加(数据或格式)超过前一个最后一个单元格时始终更新其目标“最后一个单元格”。 但是,在您从上一个最后一个单元格中删除(数据和格式)时保存工作簿之前,它们不会更新其目标“最后一个单元格”。 方法 1 无需保存工作簿即可工作。

对于条件2,也有很多方法:

  1. .Find("*", ...(如上所用)。请查看thisthis

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

【讨论】:

    【解决方案2】:

    您要查找指定列的最后一行还是最后一行? 这是两个选项。

      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
    

    【讨论】: