excelvba中的代码放置
我已经将下面的代码添加到我的Excel2003模板(Book.xlt)中的3个工作表中。 每张表格中的代码相同;这让我想知道:我可以把代码放在一个地方,这样就可以在每张纸上使用。 我试着把它放在这个工作簿和一个用户模块中——两者都不起作用 代码excelvba中的代码放置,excel,vba,Excel,Vba,我已经将下面的代码添加到我的Excel2003模板(Book.xlt)中的3个工作表中。 每张表格中的代码相同;这让我想知道:我可以把代码放在一个地方,这样就可以在每张纸上使用。 我试着把它放在这个工作簿和一个用户模块中——两者都不起作用 代码 '===================================================================== Private Sub Worksheet_SelectionChange(ByVal Target As Ex
'=====================================================================
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添加(澳大利亚堪培拉)
你好
关于,huon要在多个工作表中使用一段代码,您可以将其放入代码模块(.bas)中,并将共享代码设置为
公共
。如果某个过程是私有的,则只有该模块中的代码才能“看到”它
不幸的是,你不能告诉一个按钮由看不到按钮的代码来处理——换句话说,如果Sheet1上有一个按钮,那么它的点击处理程序属于Sheet1的代码中。您可以让所有这些处理程序调用相同的代码,如下所示:
第1页:
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
这对我使用工作簿事件有效。这是一个非常简单的例子,但希望您能理解:
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中添加几个活动的X按钮并运行InitializeEvents()代码
6) 按已添加到工作表中的任意按钮
7) 修改代码以适合您的特定场景
8)
9) 利润
请记住,这是一个简单的例子,但应该让您走上正确的道路。基本上,您需要将要执行特定代码的按钮添加到mcolEvents集合中,然后一切就绪
祝您好运,如果您需要帮助,请随时发回。您是否在所有3张工作表上都有cmdgrabbable
按钮?SelectionChange
事件将在用户每次单击未选中的单元格时调用,因此这将非常频繁;小心你放进去的东西<代码>应用程序。屏幕更新
不需要经常设置(默认情况下是正确的),因为您只希望在执行会使Excel闪烁的操作时将其设置为false;在您完成了艰苦的工作之后,您会将其设置回false,…而不是每次用户选择新单元格时。这就是为什么我的答案只针对点击
处理程序。我将工作表选择更改过程移动到一个模块中,并将其公开。正如David Zemens所预测的那样,它不起作用;这似乎合乎逻辑,因为它是一个工作表事件。要在代码模块中使用工作表事件,您需要使用with events
声明工作表
变量。如果需要,可以将该工作表变量指定为指向任何工作表。我的建议是使用已有的工作表,在一个地方编写代码,这样可以传递可能需要的任何参数。我看不出更简单的方法。很确定这对应用程序<代码>事件代码>过程不起作用(即,您不能将按钮<代码>单击代码>事件放入公共代码模块,也不能将工作表<代码>更改代码>事件放入公共模块)。听起来OP想要避免的是为按钮使用三个不同的单击处理程序,为工作表对象使用三个不同的\u更改处理程序。@DavidZemens编辑以澄清问题。当然,工作表事件必须在该工作表的“代码隐藏”中处理。@retailcoder为了它的价值,我在回答中使用了一个类模拟了一个示例。似乎做了OP要求的事。它在类级别上使用一个单击事件集,您可以订阅任何想要订阅该单击事件的按钮。+1用于使用with events
。聪明。但是如果需要添加行为不同的按钮,则每个
循环的中可能会出现混乱。如果两个按钮做相同的事情,但作用于不同的范围(一个选择范围a,另一个选择范围B-两者都只选择一个范围),那么“包装类”点击处理程序中的所有内容都必须硬编码在一个漂亮的If
块中,这里没有办法传递参数表来表示“为我选择范围X”。。。这不是.NET!但是,是的,如果工作表上的所有按钮都需要做完全相同的事情,那么这就是它。干得好@零售编码员谢谢!是的,我同意它可能会变得杂乱无章。以我写的代码为例,它可能会变得混乱。但是,除了添加任何“CommandButton”之外,您还可以使用另一个属性(如.Name)并将控件命名为类似的名称,以便只使用以“CustomClick”开头的.Name按钮
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