2013-12-10 5 views
4

인터넷 검색 및 검색을 시도했지만 실제로는 얻을 수 없습니다. 내가하려고하는 모든 것은 활성 워크 시트의 슬라이서를 반복하고 슬라이서가 있으면 삭제합니다.VBA를 사용하여 통합 문서 슬라이서 이름을 반복합니다.

내가 지금 거기에 앉아있는 6 slicers있다. 이전에 내가 가지고 있었다

ActiveSheet.Shapes.Range(Array("Market Segment Name 2", "Line of Business 2" _ 
    , "Customer Name", "Product Group Name", "Product Type Name", "Product Code") _ 
    ).Select 
    Selection.Delete 

그러나 나는 이미 슬라이서를 삭제했다면 좋지 않았다.

지금 나는 그것이 작동합니다 것 같다 나에게

Option Explicit 
Dim sl As Slicer 
Dim slName As String 

Set wb = ActiveWorkbook 

For Each sl In wb.SlicerCaches 
    If sl.Name = "Market Segment Name 2" Or _ 
     sl.Name = "Line of Business 2" Or _ 
     sl.Name = "Customer Name" Or _ 
     sl.Name = "Product Group Name" Or _ 
     sl.Name = "Product Type Name" Or _ 
     sl.Name = "Product Name" Then 
     slName = sl.Name 
     ActiveSheet.Shapes.Range(slName).Delete 
    End If 
Next sl 

(는 "공공"라는 이름의 모듈에서 전역 변수로 설정되어 WB 주) 노력하고 있어요. SlicerItem 수준으로 내려 가면 작동하도록했습니다.하지만 Slicer 수준에서 액세스하는 방법을 알아낼 수는 없습니다 ...

모든 아이디어를 높이 평가할 수 있습니다. 고맙습니다.

이것이 실패하면 배열을 만들고 그런 식으로 삭제할 것이지만 여전히 슬라이서가 있는지 여부를 테스트하는 방법이 필요합니다.

+0

'슬라이서 수준에서 액세스하는 방법을 알 수 없습니다 ... '나는 당신의 질문을받지 못했습니다. –

+0

안녕하세요 Siddharth Rout. 이 구조와 논리가 올바를 바란다. 나는 이미지 (아래에 링크되어 있음)로갑니다. 워크 시트에서 슬라이서를 볼 때 '슬라이서 (slicer)'레벨이라고 가정하고 그 이름을 액세스 할 수 있으므로 삭제할 수 있는지 여부를 감지 할 수 있습니다. http://blogs.office.com/cfs-filesystemfile.ashx/__ key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-00-44-metablogapi/0636.image_5F00_2ADE6206.png –

+0

그래서 모든 슬라이서의 이름을 원하거나 슬라이서를 확인 하시겠습니까? 존재 하는가? –

답변

5

내가 생각할 수있는 두 가지 방법이 있습니다.

하나는 Force입니다. 여기서 슬라이서가 있는지 확인하지 않습니다. 존재하는 경우 삭제 만하면됩니다. 예 :

On Error Resume Next 
ActiveSheet.Shapes.Range("Market Segment Name 2").Delete 
ActiveSheet.Shapes.Range("Line of Business 2").Delete 
' 
'~~> And so on 
' 
On Error GoTo 0 

그리고 다른 방법은 실제로 슬라이서가 있는지 확인한 다음 삭제하는 것입니다. 댓글에서

추가 답변 : 예

Dim sl As SlicerCache 

On Error Resume Next 
Set sl = ActiveWorkbook.SlicerCaches("Market Segment Name 2") 
On Error GoTo 0 

If Not sl Is Nothing Then sl.Delete 

'For Each sl In ActiveWorkbook.SlicerCaches 
    'Debug.Print sl.Name 
'Next 

편집하십시오.

첫 번째 코드를 루프로 변환.

Sub Sample() 
    Dim sSlicers As String 
    Dim Myar 
    Dim i As Long 

    '~~> Slicers you want to delete 
    sSlicers = "Market Segment Name 2,Line of Business 2" 
    sSlicers = sSlicers & "," & "Customer Name,Product Group Name" 
    sSlicers = sSlicers & "," & "Product Type Name,Product Code" 

    '~~> Split the names using "," as a delimiter 
    '~~> If your slicer names have "," then use a different delimiter 
    Myar = Split(sSlicers, ",") 

    For i = LBound(Myar) To UBound(Myar) 
     On Error Resume Next 
     ActiveSheet.Shapes.Range(Myar(i)).Delete 
     On Error GoTo 0 
    Next i 
End Sub 
+0

감사합니다 Siddarth Rout. 지금은이 일을 끝내면이 첫 번째 옵션을 사용할 것이라고 생각합니다 ("On error Resume Next"에서 랩핑했다면 원래 가지고 있던 것과 유사합니다.) 내 워크 시트가 더 많은 슬라이서를 가져올 수 있으므로 코드에 수동으로 추가하고 싶지는 않은데 누군가가 반복적 인 대답을 내놓을 수 있는지 확인하십시오. 다시 한번 감사 드리며,이 문제에 대해 사람들에게 이야기하는 데 도움이됩니다. –

+0

반복 코드를 제공 할 수는 있지만 그 이름을 어딘가에 저장해야합니까? –

+0

@JayKilleen : 위의 대답에서 편집하십시오 페이지를 새로 고침해야 할 수도 있습니다 –

2

여기는 내가 원래 달성하려고 시도한 코드를 마침내 알아 냈습니다.

Sub LoopSlicerNames() 

Dim slCaches As SlicerCaches 
Dim slCache As SlicerCache 

Set slCaches = ThisWorkbook.SlicerCaches 

For Each slCache In slCaches 

    'MsgBox (slCache.Name & " is used for " & slCache.PivotTables.Item(1).Name) 
    If slCache.PivotTables.Item(1).Name = "PTDashboard" Then 
     slCache.Delete 
     'MsgBox ("Slicer has been deleted") 
    End If 

    'If slCache.Name = "Slicer_Market_Segment_Name2" Then slCache.Delete 

Next slCache 

End Sub 

이 하나의 차이는 내가 부모 피벗 테이블 그래서 난 코드에 슬라이서의 정확한 이름을 추가 할 필요가 없습니다 것 워크 시트에있는에 따라 슬라이서를 대상으로한다는 것입니다. 슬라이서의 이름을 코드에 추가하고 싶은 경우 주석 달기를 전환 할 수 있습니다.

다시 한 번 Siddarth. 초기 장애물을 극복하고 좋은 해결책을 제공했습니다. 제 초기 문제는 슬라이서가 슬라이서 캠의 아이라고 생각한 것 같습니다. 그것으로 보면 지금은 slicerCaches, SlicerCache, SlicerItem 그리고 SlicerItem 그리고 원래의 질문에서 언급했던 'slicer'는 'SlicerCache'수준이었습니다 ... 그래서 그 그림이 바로 저를 혼란스럽게 만들었습니다.

관련 문제