【发布时间】: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