【问题标题】:Excel VBA Userform read current values when openingExcel VBA Userform在打开时读取当前值
【发布时间】:2019-06-19 22:55:55
【问题描述】:

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

所以我制作了一个按钮,它使用以下代码打开用户表单(称为“hider”):

Private Sub CommandButton1_Click()
Hider.Show
End Sub

用户表单比当前包含两个复选框,它们使用以下方法隐藏选定的列:

Private Sub Week3_Click()
Range("N:Q").Columns.Hidden = Not Week3
End Sub

因此,如果复选框被“选中”,则显示列,如果“未选中”,则隐藏列,这部分有效,除非每次用户窗体打开时,它都会将复选框重置为“未选中”的本机状态,而列保持隐藏(没关系)。

所以我的问题是:

如何将用户表单中的复选框同步到列的当前活动值?我正在考虑在用户表单上制作一个同步按钮,或者在打开用户表单时读取所有当前值的操作,但我无法让它工作。

【问题讨论】:

  • 您能否在edit 的问题中包含您迄今为止尝试过的示例?
  • Relevant - 如果您将 data 与表单代码分开,并将此数据封装在其自己的“模型”类中,则可以有一个Public Function Create(ByVal model As ColumnState) As Hider 工厂方法在表单中 - 那么你将拥有With Hider.Create(myModel) ....Show...End With,而不是Hider.Show,其中myModel为每一列保存“隐藏状态”,并且Activate 处理程序可以从模型属性初始化控制值。
  • 或者只是将所有内容都视为全局,并让表单在 InitializeActivate 处理程序中提取数据,如下所示。
  • 仅供参考除了 Mathieu 的有效评论外,如何将 (Userform) 编码应用到 VBA 中应用 MVP (Model-Viewer-Presenter) 模式逻辑,您可以在一篇文章中找到更多阅读材料如何Destroy a modeless Userform instance properly

标签: excel vba userform


【解决方案1】:

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

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

【讨论】:

  • 更简单:Me.Week3.Value = ActiveSheet.Range("N:Q").Columns.Hidden - 无需将布尔表达式与布尔值进行比较
  • @MathieuGuindon - 根据您的评论编辑答案,仅添加否定粒子 Not :-)
  • 这个答案有效!但是由于某种原因打开用户表单时它不会自动同步,但是在创建“同步”按钮后它可以完美运行。
  • 很高兴我的回答有帮助。顺便说一句,建议将您的范围引用完全限定为规则,例如通过ThisWorkbook.Worksheets("MySheetName").Range("N:Q").Columns.Hidden 或通过工作表的代号(例如Sheet1.Range(…)…
猜你喜欢
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多