【问题标题】:Refresh User-defined function without application.volatile刷新用户自定义函数,不带 application.volatile
【发布时间】:2017-09-14 17:22:51
【问题描述】:

我正在使用我在互联网上找到的一个函数来提取切片器的值(连接到表,而不是数据透视表)并将其存储在单元格中。该功能包括添加application.volatile,效果很好,正如问题Refresh Excel VBA Function Results 中所讨论的那样。

问题是,由于 volatile 函数,我的 OpenSolver 模型无法运行。因为每次迭代 Excel 都在进行计算,这使得 OpenSolver 认为 Excel 还没有为建模做好准备。

有没有一种方法可以在每次切片器改变值时更新单元格的值,而不使用application.volatile

我已经尝试过使用:

Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveWorkbook.Sheets("Dashboard").Range("B7").Formula = _
        ActiveWorkbook.Sheets("Dashboard").Range("B7").Formula
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
        ActiveWorkbook.Sheets("Dashboard").Range("B7").Calculate
End Sub

我用来提取切片器值的函数取自http://www.jkp-ads.com/articles/slicers05.asp

Public Function GetSelectedSlicerItems(SlicerName As String) As String
    Dim oSc As SlicerCache
    Dim oSi As SlicerItem
    Dim lCt As Long
    On Error Resume Next
    Set oSc = ThisWorkbook.SlicerCaches(SlicerName)
    If Not oSc Is Nothing Then
        For Each oSi In oSc.SlicerItems
            If oSi.Selected Then
                GetSelectedSlicerItems = GetSelectedSlicerItems & oSi.Name & ", "
                lCt = lCt + 1
            End If
        Next
        If Len(GetSelectedSlicerItems) > 0 Then
            If lCt = oSc.SlicerItems.Count Then
                GetSelectedSlicerItems = "maandag"
            Else
                GetSelectedSlicerItems = Left(GetSelectedSlicerItems, Len(GetSelectedSlicerItems) - 2)
            End If
        Else
            GetSelectedSlicerItems = "No items selected"
        End If
    Else
        GetSelectedSlicerItems = "No slicer with name '" & SlicerName & "' was found"
    End If
End Function

【问题讨论】:

    标签: vba excel function slicers


    【解决方案1】:

    我尝试了一种完全不同的方法,我不需要函数从切片器中提取值,从而使 volatile 变得多余。相反,我从表中扣除了选择的值。我是这样做的:

    根据字符串选择的切片器:星期一、星期二等。我添加了一个整数表示的列(星期一 = 1,星期日 = 7)。然后,我在单元格中使用了以下公式:

    =SUBTOTAL(9;AF10:AF200)/SUBTOTAL(2;AF10:AF200)
    

    这段代码首先将所有可见单元格的整数值相加,然后除以可见单元格的数量(即我计算平均值)。这应始终生成所选日期的整数值。有了这个数字,我再次找到了当天的字符串表示。

    除了上面的公式,你当然也可以使用:

    =SUBTOTAL(1;AF10:AF200)
    

    【讨论】:

      【解决方案2】:

      如果您希望切片器的值出现在单元格中,您可以使用另一种不涉及 VBA 的方法,这可能会间接解决您的问题。

      1. 创建原始数据透视表的副本,其中只包含切片器控制的字段。
      2. 将该字段拖到“数据透视表字段”对话框中的“报表过滤器”窗格中。
      3. 将切片器连接到这个新数据透视表中的该字段

      太好了:现在您有一个伪装成数据验证下拉列表的数据透视表。现在,只要有人点击切片器,数据透视表过滤器就会包含他们点击的事物的名称。

      我在以下链接中写了一篇解释这种方法的帖子:

      http://dailydoseofexcel.com/archives/2014/08/16/sync-pivots-from-dropdown/

      【讨论】:

      • 感谢您的快速回复。我应该补充一点,我使用的切片器指向表,而不是数据透视表。因此,不幸的是,我无法报告连接。我需要表格来保持表格,因为用户必须能够对数据进行更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      相关资源
      最近更新 更多