2017-04-18 123 views
1

我正在使用一個函數,我在互聯網上找到提取切片器(即連接到表,而不是數據透視表)並將其存儲在單元格中的值。該功能包括增加application.volatile,這很好地工作,也在Refresh Excel VBA Function Results這個問題中討論過。刷新用戶定義的功能,無application.volatile

問題是,由於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 

回答

1

如果希望切片器的值出現在單元格中,則可以使用另一種不涉及VBA的方法,這可能會間接地解決您的問題。

  1. 創建原始數據透視表的副本,但沒有任何內容,但切片器控制的字段。
  2. 將該字段拖到「數據透視表字段」對話框中的「報表過濾器」窗格中。
  3. 切片器連接到這個領域在這個新的數據透視表

大:現在你有一個數據透視表僞裝成一個數據驗證下拉。現在,只要有人點擊切片器,該數據透視表過濾器將包含他們點擊的東西的名稱。

我寫了一篇文章,在下面的鏈接解釋了這種做法有時回:

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

+0

感謝您的快速回復。我應該補充一點,我使用的是切片機,而不是數據透視表。因此,不幸的是,我無法報告連接。我需要表保留一個表,因爲用戶必須能夠更改數據。 –

0

我嘗試了完全不同的方式與我不需要的功能從切片機制作提取值多餘的易失性。相反,我從表中扣除了選定的值。我做到了這一點如下:

根據一天的字符串選擇切片機:星期一,星期二等。我添加了一個整數表示日期(星期一= 1,星期日= 7)的列。然後,我用下面的公式中的細胞:

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

這段代碼第一求和所有可見的細胞,這是由可見細胞的量除以(即我計算平均值)的整數值。這應該始終導致所選日期的整數值。用那個數字,我再次找到當天的字符串表示。

而是上面的公式,你當然也可以使用:

=SUBTOTAL(1;AF10:AF200)