Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excelvba中的代码放置_Excel_Vba - Fatal编程技术网

excelvba中的代码放置

excelvba中的代码放置,excel,vba,Excel,Vba,我已经将下面的代码添加到我的Excel2003模板(Book.xlt)中的3个工作表中。 每张表格中的代码相同;这让我想知道:我可以把代码放在一个地方,这样就可以在每张纸上使用。 我试着把它放在这个工作簿和一个用户模块中——两者都不起作用 代码 '===================================================================== Private Sub Worksheet_SelectionChange(ByVal Target As Ex

我已经将下面的代码添加到我的Excel2003模板(Book.xlt)中的3个工作表中。 每张表格中的代码相同;这让我想知道:我可以把代码放在一个地方,这样就可以在每张纸上使用。 我试着把它放在这个工作簿和一个用户模块中——两者都不起作用

代码

'=====================================================================
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添加(澳大利亚堪培拉) 你好

  • 注: 三张图纸中的每一张都有一个CMDGrable按钮和一个tbl_1主屏幕(即在图纸2中,它是tbl_1主屏幕,而不是tbl_2主屏幕)。 条件格式应用于3个表中的每个表

  • Application.ScreenUpdate=True: 每当我在tbl_1Main中选择一个单元格时,所选单元格的行将高亮显示。 如果没有“Application.screenUpdate=True”代码,它就无法工作

  • 在这两个过程中,我有两行代码。 如果有很长的代码,我会使用retailcoder的建议,即每个模块从另一个模块调用通用代码。 但除此之外,这些建议似乎有点复杂。正如David Zemens所指出的“……听起来OP想要避免的是为按钮使用三种不同的点击处理程序,为工作表对象使用三种不同的更改处理程序。”

  • 我希望单击处理程序可以访问通用代码。不幸的是,正如retailcoder指出的那样:“…如果Sheet1上有一个按钮,它的点击处理程序属于Sheet1的代码…”

    非常感谢你为解决我的问题所做的努力。
    关于,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