首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不使用application.volatile刷新用户定义函数

不使用application.volatile刷新用户定义函数
EN

Stack Overflow用户
提问于 2017-04-18 18:18:18
回答 2查看 360关注 0票数 1

我正在使用我在互联网上找到的函数来提取切片器的值(它连接到一个表,而不是一个PivotTable),并将它存储在一个单元格中。该函数包括添加application.volatile,它工作得很好,在问题Refresh Excel VBA Function Results中也有讨论。

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

是否有一种方法可以在切片机每次更改值时更新单元格的值,而不使用application.volatile**?**

我已经试过用:

代码语言:javascript
运行
复制
Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveWorkbook.Sheets("Dashboard").Range("B7").Formula = _
        ActiveWorkbook.Sheets("Dashboard").Range("B7").Formula
End Sub

代码语言:javascript
运行
复制
Private Sub Worksheet_Change(ByVal Target As Range)
        ActiveWorkbook.Sheets("Dashboard").Range("B7").Calculate
End Sub

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2017-04-19 11:45:27

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

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

代码语言:javascript
运行
复制
=SUBTOTAL(9;AF10:AF200)/SUBTOTAL(2;AF10:AF200)

这段代码首先求和所有可见单元格的整数值,然后除以可见单元格的数量(即,我计算平均值)。这应该总是导致所选日的整数值。使用该数字,我再次找到当天的字符串表示形式。

当然,您也可以使用以下方法来代替上面的公式:

代码语言:javascript
运行
复制
=SUBTOTAL(1;AF10:AF200)
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43479483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档