Excel VBA :单击两个按钮(形状),在电子表格打开时运行两个单独的VBA脚本



我有一个完全锁定的电子表格,并通过VBA控制所有排序和过滤。我还有另一个脚本,可以在关闭时隐藏工作表并自动保存文件以隐藏该工作表。

我一直在试图弄清楚如何使用 VBA "单击"一个按钮(形状),这将清除任何已过滤的内容,然后"单击"另一个按钮(形状),该按钮(形状)将按字母顺序对电子表格进行排序。按钮(形状)已经与用户交互完美配合,但我也希望这些按钮(形状)在打开工作表时自动触发。

第一个按钮分配给宏 SearchBox,与以下 VBA 相关联 -

Sub SearchBox()
Dim myButton As OptionButton
Dim SearchString As String
Dim ButtonName As String
Dim sht As Worksheet
Dim myField As Long
Dim DataRange As Range
Dim mySearch As Variant
Set sht = ActiveSheet
On Error Resume Next
sht.ShowAllData
On Error GoTo 0
Set DataRange = sht.ListObjects("DataTable").Range
mySearch = sht.Shapes("UserSearch").TextFrame.Characters.Text
If IsNumeric(mySearch) = True Then
SearchString = "=" & mySearch
Else
SearchString = "=*" & mySearch & "*"
End If
For Each myButton In sht.OptionButtons
If myButton.Value = 1 Then
ButtonName = myButton.Text
Exit For
End If
Next myButton
myField = Application.WorksheetFunction.Match(ButtonName, DataRange.Rows(1), 0)
DataRange.AutoFilter _
Field:=myField, _
Criteria1:=SearchString, _
Operator:=xlAnd
sht.Shapes("UserSearch").TextFrame.Characters.Text = ""
End Sub

第二个要简单得多,它只是按该特定列对数据表进行排序 -

Sub Sort_Name()
Dim oneRange As Range
Dim aCell As Range
Set oneRange = Range("A4:H1162")
Set aCell = Range("A4")
oneRange.Sort Key1:=aCell, Order1:=xlAscending, Header:=xlYes
End Sub

基本上,我还在学习,我觉得可以用脚本触发这些按钮,但我还没有弄清楚。任何帮助将不胜感激。

ThisWorkbook的代码隐藏中,您将能够处理工作簿事件,包括工作簿在打开时触发的Open事件。

导航到该模块(双击 VBE的项目资源管理器[Ctrl+R] 中的ThisWorkbook),然后在编辑器代码窗格的顶部找到下拉列表。从左侧下拉列表中,选择Workbook;然后,从右侧下拉列表中,选择Open事件;VBE 会自动为您创建具有正确签名的方法存根:

Private Sub Workbook_Open()
End Sub

请注意,下划线在 VBA 中具有非常特殊的含义;在命名过程(尤其是隐式或显式Public过程)时,请始终坚持PascalCase并避免Snake_Case;现在这可能无关紧要,但随着您作为开发人员的进步,您将开始欣赏命名的一致性,当您开始使用接口时, 在公共成员中强调的事情将开始区分有效的代码和甚至不编译的代码:尽早养成好习惯会让你以后省去麻烦。

现在,您需要在该处理程序中调用两个过程。

执行此操作时:

oneRange.Sort Key1:=aCell, Order1:=xlAscending, Header:=xlYes

您正在调用oneRange对象的Sort方法,该方法是Range类的实例

执行此操作时:

MsgBox "Hi!"

您正在调用VBA库中Interaction模块下的MsgBox函数(在对象浏览器[F2] 中找到它)。这将是等效的:

VBA.Interaction.MsgBox "Hi!"

因此,要调用您的SearchBox,然后调用您的SortName方法,您需要做的就是:

Private Sub Workbook_Open()
SearchBox
SortName  'formerly known as Sort_Name
End Sub

程序一些事情 - 它们的名称应该总是以动词开头,它们是动作。"搜索框"看起来像一个名称,而不是一个操作。在编程中,名称更像-RangeWorkbook等;考虑重命名SearchBox以更好地传达其功能。如果这很难做到,则可能是因为您的过程执行了太多操作- 例如获取用于筛选的名称,然后将筛选器应用于特定表,然后清除某些形状的文本

您还需要注意隐式ActiveSheet引用;目前SortName假设ActiveSheet是什么,这很可能会导致问题。

因此,解释我如何做我想做的事情的最好方法是通过右键单击按钮并再次单击分配宏来查看按钮本身正在调用的内容。你会看到它看起来像这样——

'

你的电子表格名称.xlsm'!表2.搜索框

对我来说,让我失望的是我没有包含 Sheet2,这是我尝试调用的代码。

通过将此代码与Workbook_Open脚本一起放在 ThisWorkbook 部分中,我能够让它按照我想要的方式工作 -

呼叫表2.搜索框

再次感谢所有评论者的帮助。

最新更新