我已将下面的代码添加到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(澳大利亚堪培拉) 你好
注意: 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处理程序可以访问通用代码。不幸的是,零售编码器指出:“......如果Sheet1上有一个按钮,其Click处理程序属于Sheet1的代码....”
非常感谢您努力尝试解决我的问题。 问候,huon
答案 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