我希望有人能够在我遇到的问题上帮助我。首先让我说我不是最好的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 :( :( :( :(
每当我尝试运行它时。我得到“运行时错误'-2147024808(80070057)': 找不到指定的对象。
再次感谢您提供的任何帮助。我一直试图让它工作几天,但无法理解。如果所有代码都完全错误,我不会感到惊讶:/。
答案 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事件中,并更改控件的名称以适应例如: CheckBox2
,CheckBox3
等)。
当工作簿关闭或从内存中卸载UserForm
时,您的选择将被“遗忘”。 但只有在点击CheckBox
时,您的列才会隐藏/取消隐藏。这意味着随后打开工作簿和/或加载UserForm时,所有CheckBox都将在初始化时显示其值(默认为False)。
注意:当从内存中卸载userform时,所有变量都被遗忘,因此我们无法使用VBA记住我们的下一步选择 时间。
因此,我们可以“记住”我们的选择的一种方式有以下3个步骤:
CheckBox
(我们将使用sheet1作为示例)。CheckBox_click
代码中,在我们的代码中添加一个新行,将我们的userform复选框中的匹配值分配给工作表CheckBox
。在UserForm_Initialization
代码中,将工作表CheckBox
的值设置为UserForm
CheckBox
。
在WorkBook中,选择相关工作表后,转到“开发人员选项卡”,单击“插入”并选择CheckBox。
然后将“CheckBox
”绘制到您想要放置的工作表上(与您在VBE中使用的方式相同{。{1}}。
将以下代码行添加到UserForm
代码中:
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
代码中,输入以下内容:
Userform1
答案 1 :(得分:0)
除此之外,您可以将不同的复选框命名为:
然后在您的复选框上创建此代码,如下所示:
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
希望这可以帮助你:)