Excel VBA中的代码放置

时间:2013-07-22 15:39:51

标签: excel-vba vba excel

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

问候,huon

评论已添加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处理程序。”

  4. 我希望Click处理程序可以访问通用代码。不幸的是,零售编码器指出:“......如果Sheet1上有一个按钮,其Click处理程序属于Sheet1的代码....”

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

2 个答案:

答案 0 :(得分: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集合中,并且您已完成所有设置。

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

答案 1 :(得分:0)

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

Private

不幸的是,您无法告诉按钮由无法看到按钮的代码处理 - 换句话说,如果Sheet1上有一个按钮,其Public Sub SomeSharedCode(ByVal TheRange As Range) 'do something with TheRange End Sub 处理程序属于Click的代码。您可以做的是让所有这些处理程序调用相同的代码,如下所示:

在Sheet1中:

Sheet1

在Sheet2中:

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

在Sheet3中:

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