【发布时间】:2013-07-22 15:39:51
【问题描述】:
我已将以下代码添加到我的 Excel 2003 模板 (Book.xlt) 中的 3 张工作表中。 每张表中的代码都是相同的;这让我想知道:我可以将代码放在一个地方,以便每张纸都可以使用它。 我尝试将其放入 ThisWorkBook 和用户模块中 - 均未奏效。
守则
'=====================================================================
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
'- Used with conditional format so selected row is shaded yellow:
' =AND(CELL("row")=ROW(),UPPER(cel_HighlightRow)="Y")
Application.ScreenUpdating = True
End Sub
'=====================================================================
Private Sub cmdGrabTable_Click()
'- Select table with 1 click.
Range("tbl_1Main").Select
End Sub 'cmdGrabTable SortData
'=====================================================================
你好,亲爱的
评论于 2013 年 7 月 25 日 02:50 添加(澳大利亚堪培拉) 你好
注意事项: 3 个工作表中的每一个都有一个 cmdGrabTable 按钮和一个 tbl_1Main(即在 Sheet2 中它是 tbl_1Main,而不是 tbl_2Main)。 条件格式适用于 3 个表中的每一个。
Application.ScreenUpdating = True: 每当我在 tbl_1Main 中选择一个单元格时,所选单元格的行都会突出显示。 如果没有“Application.ScreenUpdating = True”代码,它将无法工作。
在 2 个程序中,我有 2 行代码。 如果代码很长,我会使用 Retailcoder 的建议,即每个模块从另一个模块调用通用代码。 但除此之外,这些建议似乎有点复杂。正如 David Zemens 所指出的“……听起来 OP 想要避免的是为按钮使用三个不同的 Click 处理程序,为 Worksheet 对象使用 3 个不同的 _Change 处理程序。”
我希望 Click 处理程序可以访问通用代码。不幸的是,正如retailcoder 指出的那样:“……如果Sheet1 上有一个按钮,它的Click 处理程序就属于Sheet1 的代码……。”
非常感谢您努力尝试解决我的问题。 问候,休恩
【问题讨论】:
-
三张纸上都有
cmdGrabTable按钮吗? -
SelectionChange事件会在每次用户点击未选中的单元格时被调用,所以这经常;小心你放在那里的东西。Application.ScreenUpdating不需要经常设置(默认情况下它是 true )因为你只想在做事时将它设置为 false否则会使 Excel 闪烁;完成艰苦的工作后,您会将其设置回 false ,..不是每次用户选择一个新单元格时。这就是为什么我的回答只针对Click处理程序。 -
我将 Worksheet_SelectionChange 过程移到一个模块中并公开。正如大卫泽门斯预测的那样,它没有用。这似乎是合乎逻辑的,因为它是一个工作表事件。休恩
-
要在代码模块中使用工作表事件,您需要使用
WithEvents声明一个Worksheet变量。如果需要,您可以将该工作表变量指定为指向任何工作表。我的建议是使用您已有的工作表并在一个地方编写代码,以允许您传递您可能需要的任何参数的方式。我没有看到更简单的方法。