首页 > 解决方案 > Excel VBA + 用户表单复选框 :: 使用表单复选框隐藏/取消隐藏列

问题描述

我希望有人能够帮助我解决我遇到的问题。让我首先说我不是 VBA 方面的佼佼者,我是新手。

问题

我正在尝试创建一个带有复选框(13 个复选框)的简单用户表单,这将允许用户隐藏/取消隐藏他们选择的列。我有70列从 S 到 BR。我知道,这听起来可能很多,但这是必要的。我有13 个时期每个 时期有 4 列IE期间 1 有列 **S:V。**

我无法做到的是,让用户窗体上的复选框隐藏/取消隐藏用户选择的时段。我试过的代码。我遵循了许多教程,但无法让它正常工作。我不确定这是否有意义,但我已经添加了所有我希望它能够工作的代码。

我还添加了列的图像,以便您更好地理解......我希望

我希望有人可以在这件事上为我提供帮助,因为我得到这个工作是至关重要的。非常感谢您提前。

IMAGE HERE (BEST OPEN IN NEW TAB)这些栏目一直到 PERIOD 13 或 WEEK 52

  Sub hideCol(C As Integer)
    If Controls("CheckBox" & C ) = True Then
        Columns(C).Hidden = True
    Else
        Columns(C).Hidden = False
    End If
    ActiveWindow.ScrollColumn = 1
End Sub 

 Private Sub CheckBox1_Clickl()
    Dim C As Integer
    C = (19, 20, 21, 22)
    Call hideCol(C)
End Sub

 Private Sub CheckBox2_Click()
    Dim C As Integer
    C = (23, 24, 25, 26)
    Call hideCol(C)
End Sub

 Private Sub CheckBox3_Click()
    Dim C As Integer
    C = (27, 28, 29, 30)
    Call hideCol(C)
End Sub

Private Sub CheckBox4_Click()
    Dim C As Integer
    C = (31, 32, 33, 34)
    Call hideCol(C)
End Sub

Private Sub CheckBox5_Click()
    Dim C As Integer
    C = (35, 36, 37, 38)
    Call hideCol(C)
End Sub

Private Sub CheckBox6_Click()
    Dim C As Integer
    C = (39, 40, 41, 42)
    Call hideCol(C)
End Sub

Private Sub CheckBox7_Click()
    Dim C As Integer
    C = (43, 44, 45, 46)
    Call hideCol(C)
End Sub

Private Sub CheckBox8_Click()
    Dim C As Integer
    C = (47, 48, 49, 50)
    Call hideCol(C)
End Sub

Private Sub CheckBox9_Click()
    Dim C As Integer
    C = (51, 52, 53, 54)
    Call hideCol(C)
End Sub

 Private Sub CheckBox10_Click()
    Dim C As Integer
    C = (55, 56, 57, 58)
    Call hideCol(C)
End Sub

 Private Sub CheckBox11_Click()
    Dim C As Integer
    C = (59, 60, 61, 62)
    Call hideCol(C)
End Sub

 Private Sub CheckBox12_Click()
    Dim C As Integer
    C = (63, 64, 65, 66)
    Call hideCol(C)
End Sub

 Private Sub CheckBox13_Click()
    Dim C As Integer
    C = (67, 68, 69, 70)
    Call hideCol(C)
End Sub

 Private Sub UserForm_Initialize ()
    Dim i As Integer
    For i = 19 to 70
        Controls("CheckBox" & i).caption = Cells(5, i)
        If Columns(i).Hidden = True Then
            Controls("CheckBox" & i).Value = True
        End If
        Next i
    End Sub 
 'This is supposed to get the name of the column I.e Period 1, period 2, period 3 and title it in the checkboxes accordingly. Not working though :( :( :( :( 

添加

每当我尝试运行它时。我得到“运行时错误'-2147024808(80070057)':找不到指定的对象。


再次,非常感谢您提供的任何帮助。我一直试图让这个工作几天,但无法弄清楚。如果所有代码都完全错误,我不会感到惊讶:/。

标签: vbaexcelexcel-2010

解决方案


我可以通过更改代码来实现您的目标。

我没有将列设置为变量 C,然后调用子例程来隐藏设置为 C 的列,而是编写了CheckBox_click事件来隐藏/取消隐藏列。

例如,我已将此代码分配给CheckBox1on UserForm1;

Private Sub CheckBox1_Click()
    If Me.CheckBox1.Value = True Then
        Sheets(1).Columns("D:G").Hidden = True
    ElseIf Me.CheckBox1.Value = False Then
        Sheets(1).Columns("D:G").Hidden = False
    End If
End Sub

基本上这就是说,每次单击CheckBox1on时UserForm1,确定复选框的值是 nowTrue还是False。如果True,隐藏 D、E、F 和 G 列,否则False,取消隐藏列。

如果这是您要查找的内容,只需将代码添加到每个 CheckBox_click 事件并更改您的控件名称以适应例如CheckBox2CheckBox3)。

记住您在用户窗体中的选择

当工作簿关闭或UserForm从内存中卸载时,您的选择将被“忘记”。但是您的列仅在单击时隐藏/取消隐藏CheckBox。这意味着当随后打开工作簿和/或加载用户窗体时,所有复选框将在初始化时显示它们的值(默认为 False)。

注意:当用户窗体从内存中卸载时,所有变量都被遗忘,因此我们不能使用 VBA 来记住我们的选择以备下次使用。

因此,我们可以“记住”我们的选择的一种方法有以下 3 个步骤:

  1. 在我们的电子表格上放置一个 ActiveX CheckBox(我们将使用 sheet1 作为示例)。
  2. CheckBox_click代码中,在我们的代码中添加一个新行,将用户表单复选框中的匹配值分配给我们的 Worksheet CheckBox
  3. UserForm_Initialization代码中,将 Worksheet 的值设置CheckBoxUserForm CheckBox.

    步骤1

    在您的工作簿中,选择相关工作表,转到“开发人员选项卡”,单击“插入”并选择复选框。

显示在哪里可以找到要插入工作表的 ActiveX 控件。

然后将它“绘制”CheckBox到您想要放置的任何位置(就像您在 VBE 中为您所做的那样UserForm

第2步

将以下代码行添加到CheckBox_click代码中:

Private Sub CheckBox1_Click()
    If Me.CheckBox1.Value = True Then
        Sheets(1).Columns("D:G").Hidden = True
        Sheet1.CheckBox1.Value = True '<~~ HERE
    ElseIf Me.CheckBox1.Value = False Then
        Sheets(1).Columns("D:G").Hidden = False
        Sheet1.CheckBox1.Value = False '<~~ AND HERE
    End If
End Sub

第 3 步

在我们的Userform1代码中,输入以下内容:

Private Sub UserForm_Initialize()
    Me.CheckBox1.Value = Sheet1.CheckBox1.Value
End Sub

推荐阅读