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
现在,解释一下。如果您想了解它,请完整阅读此内容。
当试图找到工作表中的最后一个单元格(或行、列)时,您必须首先确定这是什么意思。
Used = 非空白,即有 data.
Used = “...正在使用,意思是包含 数据或格式 的部分。”
This is the criterion used by Excel at the time of saving. See also this。
这个标准通常会产生意想不到的结果,但它也可能被有意利用(当然不太常见),例如,突出显示或打印最终可能没有数据的特定区域。当然,最好将其作为保存工作簿时使用范围的标准。
通常,这两个标准对最后一个单元格给出相同的结果,这似乎是您的情况。
这已涵盖 here and here。
对于条件 1,查找最后使用的单元格的多种方法中的三种是:
UsedRange
.
- Ctrl+End.
SpecialCells(xlLastCell)
.
方法 2 和 3 在添加(数据或格式)超过上一个最后一个单元格时总是更新它们的目标 "last cell"。
但是他们不会更新他们的目标 "last cell" 直到你从上一个最后一个单元格中删除(数据和格式)时保存工作簿。
方法 1 无需保存工作簿即可工作。
对于crtierion 2,也有很多方法:
.Find("*", ...
(如上所用)。请检查 this or this.
- 等等
(大部分?)即使不保存工作簿,这些方法也可以使用。
我的 "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
现在,解释一下。如果您想了解它,请完整阅读此内容。
当试图找到工作表中的最后一个单元格(或行、列)时,您必须首先确定这是什么意思。
Used = 非空白,即有 data.
Used = “...正在使用,意思是包含 数据或格式 的部分。” This is the criterion used by Excel at the time of saving. See also this。 这个标准通常会产生意想不到的结果,但它也可能被有意利用(当然不太常见),例如,突出显示或打印最终可能没有数据的特定区域。当然,最好将其作为保存工作簿时使用范围的标准。
通常,这两个标准对最后一个单元格给出相同的结果,这似乎是您的情况。 这已涵盖 here and here。
对于条件 1,查找最后使用的单元格的多种方法中的三种是:
UsedRange
.- Ctrl+End.
SpecialCells(xlLastCell)
.
方法 2 和 3 在添加(数据或格式)超过上一个最后一个单元格时总是更新它们的目标 "last cell"。 但是他们不会更新他们的目标 "last cell" 直到你从上一个最后一个单元格中删除(数据和格式)时保存工作簿。 方法 1 无需保存工作簿即可工作。
对于crtierion 2,也有很多方法:
.Find("*", ...
(如上所用)。请检查 this or this.- 等等
(大部分?)即使不保存工作簿,这些方法也可以使用。