VBA - 如何将*可见*单元格的总和显示到用户窗体标签中?
VBA - How to display SUM of *visible* cells into a userform label?
我想将 D 列中 visible 个单元格的总和显示到用户表单标签中,并让它在电子表格被过滤时自动更新。
目前我的代码为
Private Sub SUM_click()
Me.SUM.caption = range ("AA2")
End Sub
但是这是有问题的,因为
-
- 为了完成这项工作,我不得不在单元格 AA2 中使用 SUM 公式,并且我希望尽可能避免在任何单元格中使用公式。
-
- return 值不排除隐藏的行。
-
- 它只显示我点击标签后的值,我想让它自动显示..
谁能给我指出正确的方向?
在用户窗体中自动显示小计
这表明它并不像看起来那么微不足道。
当然,您可能从sheet的Worksheet_Calculate
事件中获利
每当(启用的)计算处理新结果时,通过 VBA 获取(可见单元格的)小计。
这在过滤 and/or 更改值时有效,而 而 Worksheet_Change
事件不会涵盖过滤 .
Private Sub Worksheet_Calculate()
Dim subtotal As Double
subtotal = Sheet1.Evaluate("=Subtotal(109,D:D)") ' argument 109 sums up only visible cells!
Debug.Print "Subtotal: " & Format(subtotal, "0.00") ' display in VB Editor's immediate window
End Sub
... but there's no synchronized event to refresh a label in the Userform's code.
所以我建议以下 棘手的解决方法 从 ListBox 属性 RowSource
:
- 将小计公式
=SUBTOTAL(109,D:D)
添加到单元格 AA2
- 而不是标签...让列表框显示绑定到
.RowSource
;每当小计发生变化时,这将反映在绑定列表框的唯一列表值中。
通过 .SpecialEffect = fmSpecialEffectFlat
定义外观使列表框看起来几乎像一个标签。小美人失误:背景颜色无法修改
用户窗体代码示例
Private Sub UserForm_Initialize()
With Me.ListBox1 ' << rename control to any other name
.ColumnCount = 1 ' define columncount
.ColumnWidths = .Width - 8 ' play around with small sizes to avoid scroll bars
.Height = 12
.RowSource = "Sheet1!AA2" ' reference to cell containing subtotal formula
.SpecialEffect = fmSpecialEffectFlat
.ListIndex = 0 ' activate first (and only) record
End With
提示
要在 table 中启用编辑或过滤等并发操作,您需要显示用户窗体 无模式,例如通过
With New UserForm1
.Show vbModeless
End With
评论中建议的备选方案
感谢@norie 的提示,也可以从文本框的 .ControlSource
属性(与标签更相似)中获利,而无需进一步修饰。然而,这种有前途的方法需要进一步(甚至更复杂?)步骤:文本框允许输入,这将 覆盖 引用单元格中不需要的初始公式。
可能的出路我不会在这里开发:防止 key-event 条目(查看其他 SO 帖子)或使用 TextBox1_Change
事件在每次文本框更改时重写公式(有疑问),在文本框等上放置一个阻止控件。
我想将 D 列中 visible 个单元格的总和显示到用户表单标签中,并让它在电子表格被过滤时自动更新。
目前我的代码为
Private Sub SUM_click()
Me.SUM.caption = range ("AA2")
End Sub
但是这是有问题的,因为
-
- 为了完成这项工作,我不得不在单元格 AA2 中使用 SUM 公式,并且我希望尽可能避免在任何单元格中使用公式。
-
- return 值不排除隐藏的行。
-
- 它只显示我点击标签后的值,我想让它自动显示..
谁能给我指出正确的方向?
在用户窗体中自动显示小计
这表明它并不像看起来那么微不足道。
当然,您可能从sheet的Worksheet_Calculate
事件中获利
每当(启用的)计算处理新结果时,通过 VBA 获取(可见单元格的)小计。
这在过滤 and/or 更改值时有效,而 而 Worksheet_Change
事件不会涵盖过滤 .
Private Sub Worksheet_Calculate()
Dim subtotal As Double
subtotal = Sheet1.Evaluate("=Subtotal(109,D:D)") ' argument 109 sums up only visible cells!
Debug.Print "Subtotal: " & Format(subtotal, "0.00") ' display in VB Editor's immediate window
End Sub
... but there's no synchronized event to refresh a label in the Userform's code.
所以我建议以下 棘手的解决方法 从 ListBox 属性 RowSource
:
- 将小计公式
=SUBTOTAL(109,D:D)
添加到单元格AA2
- 而不是标签...让列表框显示绑定到
.RowSource
;每当小计发生变化时,这将反映在绑定列表框的唯一列表值中。
通过 .SpecialEffect = fmSpecialEffectFlat
定义外观使列表框看起来几乎像一个标签。小美人失误:背景颜色无法修改
用户窗体代码示例
Private Sub UserForm_Initialize()
With Me.ListBox1 ' << rename control to any other name
.ColumnCount = 1 ' define columncount
.ColumnWidths = .Width - 8 ' play around with small sizes to avoid scroll bars
.Height = 12
.RowSource = "Sheet1!AA2" ' reference to cell containing subtotal formula
.SpecialEffect = fmSpecialEffectFlat
.ListIndex = 0 ' activate first (and only) record
End With
提示
要在 table 中启用编辑或过滤等并发操作,您需要显示用户窗体 无模式,例如通过
With New UserForm1
.Show vbModeless
End With
评论中建议的备选方案
感谢@norie 的提示,也可以从文本框的 .ControlSource
属性(与标签更相似)中获利,而无需进一步修饰。然而,这种有前途的方法需要进一步(甚至更复杂?)步骤:文本框允许输入,这将 覆盖 引用单元格中不需要的初始公式。
可能的出路我不会在这里开发:防止 key-event 条目(查看其他 SO 帖子)或使用 TextBox1_Change
事件在每次文本框更改时重写公式(有疑问),在文本框等上放置一个阻止控件。