我正在使用我在互联网上找到的函数来提取切片器的值(它连接到一个表,而不是一个PivotTable),并将它存储在一个单元格中。该函数包括添加application.volatile
,它工作得很好,在问题Refresh Excel VBA Function Results中也有讨论。
问题是,由于易失性函数,我的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
发布于 2017-04-19 11:45:27
我尝试了一种完全不同的方法,不需要函数从切片器中提取值,从而使易失性变得多余。相反,我从表中扣除了所选的值。我是这样做的:
根据一天选择为字符串的切片器:星期一、星期二等。我添加了一个以天为整数表示的列(星期一= 1,星期日= 7)。然后,我在单元格中使用了以下公式:
=SUBTOTAL(9;AF10:AF200)/SUBTOTAL(2;AF10:AF200)
这段代码首先求和所有可见单元格的整数值,然后除以可见单元格的数量(即,我计算平均值)。这应该总是导致所选日的整数值。使用该数字,我再次找到当天的字符串表示形式。
当然,您也可以使用以下方法来代替上面的公式:
=SUBTOTAL(1;AF10:AF200)
https://stackoverflow.com/questions/43479483
复制相似问题