在用户窗体中自动显示小计
这表明它并不像看起来那么简单。
当然,您可能从工作表的Worksheet_Calculate 事件中获利
每当(启用)计算处理新结果时,通过 VBA 获取(可见单元格的)小计。
这在过滤和/或更改值时很有效,而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
...但是没有同步事件来刷新用户窗体代码中的标签。
所以我建议以下棘手的解决方法利用 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
提示
要在表格中启用编辑或过滤等并发操作,您需要显示用户窗体 modeless,例如通过
With New UserForm1
.Show vbModeless
End With
评论中建议的替代方案
感谢@norie 的提示,也可以从文本框的.ControlSource 属性(与标签更相似)中获利,而无需进一步修饰。然而,这种有前途的方法需要进一步(甚至更复杂?)步骤:文本框允许输入会覆盖引用单元格中不需要的初始公式。
可能的出路我不会在这里开发:防止关键事件条目(查看其他 SO 帖子)或使用 TextBox1_Change 事件在每次文本框更改时重写公式(可疑),放置一个阻止对文本框等的控制。