【发布时间】:2018-05-16 05:13:42
【问题描述】:
我有一个在工作簿关闭时调用的宏。它检查不同工作表上两个表中的列,并根据找到的内容分配行号。
Worksheet_Change 处理程序位于具有Projects 范围的工作表上。 Database 范围位于同一工作簿的另一个工作表上。
每当我在其他任何地方调用宏时,它要么生成错误,要么导致 excel 部分冻结的常见错误(任何人都知道这是什么鬼?!?!?!)。
无论如何,我放弃之前的最后手段是将宏更改为工作表更改事件,我想知道是否可以在创建此事件时获得一些帮助。
原宏:
Sub FindRow()
'This module verifies row numbers in the database by matching them to the opportunities in the Projects
'worksheet. It then assigns row numbers in the Projects worksheet.
Application.ScreenUpdating = False
Dim LastRow As Long
LastRow = Application.ThisWorkbook.Sheets("Projects").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Dim rng As Range
Dim foundRng As Range
For Each rng In Sheets("Projects").Range("B2:B" & LastRow)
Set foundRng = Sheets("Database").Range("C:C").Find(rng, LookIn:=xlValues, lookat:=xlWhole)
If Not foundRng Is Nothing Then
rng.Offset(0, -1) = foundRng.Row
End If
Next rng
Application.ScreenUpdating = True
End Sub
我提议的更改:
Public Sub Worksheet_Change(ByVal Target As Range)
Dim Records As Range
Set Records = Range("Records")
If Not Application.Intersect(Records, Range(Target.Address)) Is Nothing Then
Application.ScreenUpdating = False
Dim LastRow As Long
LastRow = Application.ThisWorkbook.Sheets("Projects").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Dim rng As Range
Dim foundRng As Range
For Each rng In Sheets("Projects").Range("B2:B" & LastRow)
Set foundRng = Sheets("Database").Range("C:C").Find(rng, LookIn:=xlValues, lookat:=xlWhole)
If Not foundRng Is Nothing Then
rng.Offset(0, -1) = foundRng.Row
End If
Next rng
Application.ScreenUpdating = True
End If
End Sub
但是,我在定义变量 LastRow 的行上不断收到错误消息。
即使之前所有内容都已正确定义,我也会收到应用程序定义的错误。
提前致谢。
【问题讨论】:
-
你做过调试吗? lastrow 的价值是什么?
-
@SJR 调试没有任何结果,因为它不喜欢这行代码,所以甚至都懒得运行它。当它在独立模块中作为宏运行时,它确实给了我正确的行,即表格的最后一行。
-
你没有说错误是什么......this 是否有机会解决你的问题?
-
@Remi 已要求您澄清涉及哪些工作表并提供一个最小示例。你知道为什么有人问这个吗?找出您的代码不起作用的原因。因此,如果您不想提供这些信息,请不要在问题关闭时感到惊讶。
-
RE "奇怪的是,在它导致错误之后,我无法选择工作簿中任何工作表上的任何单元格,即使在我结束宏之后也是如此。我必须关闭工作簿并重新打开它以再次处理它。这就像它试图崩溃然后忘记它或其他东西。“ - 那是因为您将
Application.ScreenUpdating设置为False。在即时窗格 (Ctrl+G) 中键入Application.ScreenUpdating = True,一切都会恢复正常。 Excel 不会重新绘制自己,因为您明确告诉它不要这样做。