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

但是这是有问题的,因为

谁能给我指出正确的方向?

在用户窗体中自动显示小计

这表明它并不像看起来那么微不足道。

当然,您可能从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 事件在每次文本框更改时重写公式(有疑问),在文本框等上放置一个阻止控件。