1

我已将以下代码添加到我的 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
'=====================================================================

问候,休恩

评论添加 25.Jul.13 在 02:50 (堪培拉, 澳大利亚) 你好

  1. 注意: 3 张表中的每张都有一个 cmdGrabTable 按钮和一个 tbl_1Main(即在 Sheet2 中它是 tbl_1Main,而不是 tbl_2Main)。条件格式适用于 3 个表中的每一个。

  2. Application.ScreenUpdating = True:每当我在 tbl_1Main 中选择一个单元格时,所选单元格的行都会突出显示。如果没有“Application.ScreenUpdating = True”代码,它就无法工作。

  3. 在 2 个程序中,我有 2 行代码。如果代码很长,我会使用retailcoder 的建议,即每个模块从另一个模块调用通用代码。但除此之外,这些建议似乎有点复杂。正如 David Zemens 所指出的“……听起来 OP 想要避免的是为按钮使用三个不同的 Click 处理程序,为 Worksheet 对象使用 3 个不同的 _Change 处理程序。”</p>

我希望 Click 处理程序可以访问通用代码。不幸的是,retailcoder 指出:“……如果 Sheet1 上有一个按钮,它的 Click 处理程序属于 Sheet1 的代码……。”</p>

非常感谢您努力尝试解决我的问题。问候,休恩

4

2 回答 2

2

这适用于我使用 Workbook 事件。这是一个非常简单的例子,但希望你明白:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

With Sh
    If .Name = "Sheet1" Or .Name = "Sheet2" Then
        MsgBox ("You made a change on " & .Name)
    Else
        MsgBox ("You didn't make a change on either Sheet1 or Sheet2, but on " & .Name)
    End If
End With

End Sub

此外,您可以连接您的按钮,以便它们都通过使用类来执行相同的代码。

1) 添加对 Microsoft Forms 2.0 对象库的引用(工具 -> 引用)

2) 为您的项目添加一个类。

3)将以下代码添加到类模块中:

Option Explicit
Private WithEvents mbutton As MSForms.CommandButton
Public Property Set Control(obtNew As MSForms.CommandButton)
    Set mbutton = obtNew
End Property

Private Sub mbutton_Click()
MsgBox ("Generic Message goes here!")
End Sub

4)在你的类中添加一个常规模块并添加以下代码:

Option Explicit

Dim mcolEvents As Collection

Sub InitializeEvents()
    Dim obtButton As OLEObject
    Dim clsEvents As Class1

    If mcolEvents Is Nothing Then
        Set mcolEvents = New Collection
    End If

    For Each obtButton In Sheet1.OLEObjects
        If TypeName(obtButton.Object) = "CommandButton" Then
            Set clsEvents = New Class1
            Set clsEvents.Control = obtButton.Object
            mcolEvents.Add clsEvents
        End If
    Next
End Sub

5) 在工作表 1 中添加一些 Active X 按钮并运行 InitializeEvents() 代码。

6)按您添加到工作表中的任何按钮

7)修改代码以适合您的特定场景

8) ...

9)利润!

请记住,这是一个简单的示例,但应该让您走上正确的道路。基本上,您需要将要执行特定代码的按钮添加到 mcolEvents 集合中,一切就绪。

祝你好运,如果您需要任何帮助,请随时回复。

于 2013-07-22T15:58:19.720 回答
0

要在多个工作表中使用一段代码,您可以将其放在代码模块(.bas) 中,并将共享代码设为Public. 如果一个过程是Private,则只有该模块中的代码才能“看到”它。

Public Sub SomeSharedCode(ByVal TheRange As Range)
    'do something with TheRange
End Sub

不幸的是,你不能告诉一个按钮由看不到按钮的代码处理 - 换句话说,如果 Sheet1 上有一个按钮,它的Click处理程序属于Sheet1. 您可以做的是让所有这些处理程序调用相同的代码,如下所示:

在 Sheet1 中:

Private Sub Sheet1CmdGrabTable_Click()
    SomeSharedCode Range("tbl_1Main")
End Sub

在表 2 中:

Private Sub Sheet2CmdGrabTable_Click()
    SomeSharedCode Range("tbl_2Main")
End Sub

在表 3 中:

Private Sub Sheet3CmdGrabTable_Click()
    SomeSharedCode Range("tbl_3Main")
End Sub
于 2013-07-22T15:47:26.580 回答