Excel VBA + Userform复选框::使用表单复选框隐藏/取消隐藏列

时间:2018-06-08 10:30:30

标签: excel vba excel-vba excel-2010

我希望有人能够在我遇到的问题上帮助我。首先让我说我不是最好的VBA,我是新手。

问题

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

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

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

我希望有人可以帮助我解决这个问题,因为我的工作至关重要。非常感谢你提前。

IMAGE HERE (BEST OPEN IN NEW TAB) These columns go all the way up to PERIOD 13 or 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 :( :( :( :( 

ADDITION

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

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

2 个答案:

答案 0 :(得分:1)

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

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

例如,我已将此代码分配给CheckBox1上的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

基本上这就是说,每次点击CheckBox1 UserForm1时,确定该复选框的值现在是True还是False。如果是True,请隐藏D,E,F和G列,否则如果False,则取消隐藏列。

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

要记住您在UserForm中的选择

当工作簿关闭或从内存中卸载UserForm时,您的选择将被“遗忘”。 只有在点击CheckBox时,您的列才会隐藏/取消隐藏。这意味着随后打开工作簿和/或加载UserForm时,所有CheckBox都将在初始化时显示其值(默认为False)。

  

注意:当从内存中卸载userform时,所有变量都被遗忘,因此我们无法使用VBA记住我们的下一步选择   时间。

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

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

    第1步

    在WorkBook中,选择相关工作表后,转到“开发人员选项卡”,单击“插入”并选择CheckBox。

  4. Visual of where to find ActiveX controls to insert onto a sheet.

    然后将“CheckBox”绘制到您想要放置的工作表上(与您在VBE中使用的方式相同{。{1}}。

    第2步

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

    CheckBox_click

    第3步

    在我们的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 代码中,输入以下内容:

    Userform1

答案 1 :(得分:0)

除此之外,您可以将不同的复选框命名为:

  • Box_19_22
  • Box_23_26

然后在您的复选框上创建此代码,如下所示:

Dim LArray() As String
Dim CL1 As Long, CL2 As Long
Dim RNG As Range
Public NM As String 'This will capture the name of clicked checkbox
Public STATE As Boolean 'This will capture the true or false on checkbox

Option Explicit

Private Sub Box_2_7_Click() 'This piece of code from here.....

NM = Me.Box_2_7.Name
STATE = Me.Box_2_7.Value
Call HIDE_UNHIDE

End Sub 'Up till here needs to go on all checkboxes, obviously change names accordingly

Sub HIDE_UNHIDE() 'This is the piece of code that will be on its own, and will be called from all the checkboxes.

LArray() = Split(NM, "_")
CL1 = LArray(1)
CL2 = LArray(2)
Set RNG = ActiveSheet.Range(Columns(CL1), Columns(CL2))
If STATE = False Then
    RNG.EntireColumn.Hidden = False
Else
    RNG.EntireColumn.Hidden = True
End If

End Sub

希望这可以帮助你:)