【问题标题】:Assigning macro to multiple check boxes将宏分配给多个复选框
【发布时间】:2020-05-20 01:08:47
【问题描述】:

我有多个复选框(表单控件)位于同一张表中。当我单击任何复选框时,我需要它隐藏指定的行范围和 2 个指定的滚动条。

我最初使用了一个 Active Control Check Box,并编写了这个有效的代码(这专门为 CheckBox1 工作):

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
[105:112].EntireRow.Hidden = True
ActiveSheet.Shapes("Scroll Bar 79").Visible = False
ActiveSheet.Shapes("Scroll Bar 82").Visible = False

Else: 
[105:112].EntireRow.Hidden = False
ActiveSheet.Shapes("Scroll Bar 79").Visible = True
ActiveSheet.Shapes("Scroll Bar 82").Visible = True
End If
End Sub

但是,我想创建一个更通用的代码,因为我有 60 个这样的复选框(如下所述)。 此代码有四个变量:1)复选框名称 2)行范围 3)滚动条 1 4)滚动条 2

对于工作表中的每个复选框,我希望能够更改 4 个变量名称。在将宏分配给每个复选框时,我尝试使用这种格式 'NameOfMacro "variable1", "variable2"',但这没有用!

Sub Hide ()

Dim chkBox As CheckBox
Dim RowRange As Range
Dim SB1 As Shape
Dim SB2 As Shape

Set chkBox = ActiveSheet.CheckBoxes(Application.Caller)

If chkBox.Value = True Then
    [RowRange].EntireRow.Hidden = True
    ActiveSheet.Shapes("SB1").Visible = False
    ActiveSheet.Shapes("SB2").Visible = False
Else:
    [RowRange].EntireRow.Hidden = False
    ActiveSheet.Shapes("SB1").Visible = True
    ActiveSheet.Shapes("SB2").Visible = True
End If
End Sub

我在两个方面都遇到了麻烦

1) 创建通用宏时,出现“无法获取工作表类的复选框属性”等错误。如何使复选框名称可变? 2)将相同的宏分配给多个复选框,同时能够使用此方法更改参数:'NameOfMacro "variable1", "variable2"'

任何帮助将不胜感激!

【问题讨论】:

  • 您实际上尝试分配宏的代码是什么?将参数与OnAction 一起使用并不是一个好主意,因此最好在复选框名称中包含某些内容,或者使用查找表。
  • 我尝试将子“隐藏”分配给所有复选框。对于每个复选框,我希望在分配宏时能够修改行范围、SB1 和 SB2。我已经多次看到这种类型的建议出现:'NameOfMacro "variable1", "variable2"'。不幸的是,似乎对我不起作用。
  • 典型的方法包括给每个复选框一个特定的名称,该名称可用于确定要操作的项目 - 您可以在通用宏中硬编码这些或使用(例如)一个查找表一个隐藏的工作表,从复选框名称中获取他们的名字。

标签: excel vba


【解决方案1】:

您需要为您的Hide 例程创建一个参数。然后将复选框的值传递给该参数。这会给你你想要的行为。只需为每个复选框制作一个:

Private Sub CheckBox1_Click()
    HideRow CheckBox1.Value, ActiveSheet.Range("A105:A112"), "Scroll Bar 79", "Scroll Bar 82"
End Sub

Public Sub HideRow(ByVal hiding As Boolean, ByVal rowRange As Range, ByVal ScrollBarOne As String, ByVal ScrollBarTwo As String)
    If hiding Then
        rowRange.EntireRow.hidden = True
        ActiveSheet.Shapes(ScrollBarOne).Visible = False
        ActiveSheet.Shapes(ScrollBarTwo).Visible = False
    Else
        rowRange.EntireRow.hidden = False
        ActiveSheet.Shapes(ScrollBarOne).Visible = True
        ActiveSheet.Shapes(ScrollBarTwo).Visible = True
    End If
End Sub

【讨论】:

  • 我收到错误“438:对象不支持此属性或方法”
  • 在哪一行? ?
  • HideRow CheckBox1.Value, ActiveSheet.Row("105:112"), "滚动条 79", "滚动条 82"
  • 也许是 .Row 尝试使用 .Range (参见我上面的编辑)
  • 完美!作品!太感谢了。 VBA新手在这里。感谢帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
相关资源
最近更新 更多