Excel VBA用户窗体打开时读取当前值

Excel VBA用户窗体打开时读取当前值,excel,vba,userform,Excel,Vba,Userform,我正在尝试制作一个用户表单,用于隐藏/显示工作表的不同列 因此,我制作了一个按钮,用以下代码打开userform(称为“hider”): Private Sub CommandButton1_Click() Hider.Show End Sub userform than当前包含两个复选框,使用以下选项隐藏选定列: Private Sub Week3_Click() Range("N:Q").Columns.Hidden = Not Week3 End Sub 因此,如果复选框“选中”,则显

我正在尝试制作一个用户表单,用于隐藏/显示工作表的不同列

因此,我制作了一个按钮,用以下代码打开userform(称为“hider”):

Private Sub CommandButton1_Click()
Hider.Show
End Sub
userform than当前包含两个复选框,使用以下选项隐藏选定列:

Private Sub Week3_Click()
Range("N:Q").Columns.Hidden = Not Week3
End Sub
因此,如果复选框“选中”,则显示列,如果“未选中”,则隐藏列,此部分工作,除非每次用户窗体打开时,它都会将复选框重置为“未选中”的原始状态,而列保持隐藏(这是可以的)

所以我的问题是:


如何将userform中的复选框与列的当前活动值同步?我正在考虑在用户窗体上创建一个同步按钮,或者在打开用户窗体时执行一个读取所有当前值的操作,但是我无法使其工作。

如果我正确理解您的问题(“…或者在打开用户窗体时执行读取所有当前值的操作”)打开复选框时,只需在Userform代码模块中使用以下代码同步复选框:

Private Sub UserForm_Initialize()

'Me.Week3.Value = IIf(ActiveSheet.Range("N:Q").Columns.Hidden = True, False, True)
Me.Week3.Value = Not ActiveSheet.Range("N:Q").Columns.Hidden  ' simplified due to comment thx Mathieu Guindon

' ...
End Sub

你能把你的问题包括到目前为止你已经尝试过的一个例子吗如果将数据与表单代码分离,并将此数据封装在其自己的“模型”类中,则可以在表单中使用
公共函数Create(ByVal model As ColumnState)作为Hider
工厂方法,而不是
Hider.Show
使用Hider.Create(myModel)..
.Show
<代码>以结束,其中,
myModel
保存每列的“隐藏状态”,并且
Activate
处理程序可以从模型属性初始化控制值。或者只是将所有内容都视为全局的,并让表单在
initialize
Activate
处理程序中提取数据,如下图所示,除了Mathieu关于如何将MVP(Model Viewer Presenter)模式逻辑应用于VBA的专业化(用户表单)编码的有效评论外,您还可以在文章how to.Simpler:
Me.Week3.Value=ActiveSheet.Range(“N:Q”)中找到更多的阅读资料.Columns.Hidden
-无需将布尔表达式与Boolean@MathieuGuindon-由于您的评论,编辑了答案,只添加了否定粒子
而不是
:-)此答案有效!然而,由于某些原因,当打开用户表单时,它不会自动同步,但是在创建“同步”按钮后,它工作得非常好。很高兴我的回答有帮助。顺便说一句,建议您按照规则完全限定范围引用,例如通过
此工作簿。工作表(“MySheetName”)。范围(“N:Q”)。列。隐藏
或通过工作表的代码名(例如
Sheet1.range(…)…