excel - VBA选择每个切片器项目然后将每个选定的切片器项目保存为pdf?

标签 excel vba slicers

我设计了一个由许多不同的数据透视表和数据透视图组成的仪表板。

所有这些数据透视表/图表都由一个名为“Slicer_Store”的切片器控制。

此切片器中有大约 800 家不同的商店可供选择。

我需要保存每个商店仪表板的 pdf。手动选择每个切片器项目,然后将工作表另存为 pdf 文件的过程对于 800 多家商店来说非常耗时,因此我希望通过 VBA 自动化该过程。

到目前为止,这是我的代码:

Public Sub myMacro()
Dim sI As SlicerItem, sI2 As SlicerItem, sC As SlicerCache
Set sC = ActiveWorkbook.SlicerCaches("Slicer_Store")
With sC

    For Each sI In sC.SlicerItems
        sC.ClearManualFilter
        For Each sI2 In sC.SlicerItems
            If sI.Name = sI2.Name Then sI2.Selected = True Else: sI2.Selected = False
        Next

        Debug.Print sI.Name
        'add export to PDF code here
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "C:\Users\TestUser\Desktop\testfolder" & Range("b1").Text  & ".pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    Next

End With
End Sub

该代码确实处理了所有切片器项目,但该文件没有保存为 pdf。我需要将每个文件保存为 B2 中的值,因此它将是 Store1.pdf、Store2.pdf、Store3.pdf 等。

任何帮助将不胜感激。这是一个工作中的大项目,很多人都依赖这些 pdf 文件。

编辑代码:

这应该可以,但是要花很长时间才能遍历所有切片器项目(800+)。另外,我需要确保它只打印第一页(打印区域),这样切片机本身就不会被打印。
Public Sub myMacro()
Dim sI As SlicerItem, sI2 As SlicerItem, sC As SlicerCache
Dim ws As Worksheet
Set sC = ActiveWorkbook.SlicerCaches("Slicer_Store_Number")
Set ws = Sheet18
With sC

    For Each sI In sC.SlicerItems
        sC.ClearManualFilter
        For Each sI2 In sC.SlicerItems
            If sI.Name = sI2.Name Then sI2.Selected = True Else: sI2.Selected = False
        Next

       Debug.Print sI.Name
        'add export to PDF code here
      ws.PageSetup.PrintArea = ws.Range("A1:N34").Address

       ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        "C:\Users\testuser\Desktop\testfolder" & Range("M1").Text & ".pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    Next

End With
End Sub

最佳答案

这实际上解决了这个问题,但是您获得 800 多个项目的方法将永远需要完成。请参阅下面的另一种解决方案,该解决方案需要用户一点点协作,但速度要快得多。

在打印到 PDF 之前添加此行:

 Range("b1") = sI.Name

这会将商店的名称写入范围,以便稍后您可以将其用作 pdf 文件的名称。

另外,在路径末尾添加一个斜杠:
 ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
          "C:\Users\TestUser\Desktop\testfolder\" & Range("b1").Text  & ".pdf", Quality:= _

如果你只想打印第一页,你可以在上面的行之前设置打印区域或者使用这个:
ActiveSheet.PrintOut from:=1, To:=1

更新

在此解决方案中,您需要确保第一个切片器项目,并且只选择了一个(因此您不应该清除手动过滤器)。这是基于此编码的。原始代码每次都会遍历所有切片器项,选择一个并取消选择其他项,这会导致极高的计算成本。
Public Sub myMacro()
Dim sC As SlicerCache
Set sC = ActiveWorkbook.SlicerCaches("Slicer_Store_Number")




  'This reminds the user to only select the first slicer item
   If sC.VisibleSlicerItems.Count <> 1 Or sC.SlicerItems(1).Selected = False Then
      MsgBox "Please Only Select Store-Number 1"
      Exit Sub
   End If


For i = 1 To sC.SlicerItems.Count

    'Do not clear ilter as it causes to select all of the items (sC.ClearManualFilter)

    sC.SlicerItems(i).Selected = True
    If i <> 1 Then sC.SlicerItems(i - 1).Selected = False


    'Debug.Print sI.Name
    'add export to PDF code here
    With Sheet18.PageSetup

    .PrintArea = Sheet18.Range("A1:N34" & lastRow).Address

    .FitToPagesWide = 1
    .FitToPagesTall = 1

    End With

    Sheet18.Range("M1") = sC.SlicerItems(i).Name

   'This prints to C directory, change the path as you wish

   Sheet18.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\" & Range("M1").Text & ".pdf", Quality:= _
    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
    OpenAfterPublish:=False
Next

End Sub

关于excel - VBA选择每个切片器项目然后将每个选定的切片器项目保存为pdf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43481343/

相关文章:

python - 在 Python 中使用 Microsoft.Office.Interop.Excel 和 CLR 打印 Excel 文件?

c# - 有没有办法将 .xlsx 和 .xls 文件转换为 CODE 中的制表符分隔文本文件

VBA EXCEL 提示用户响应选择文件夹并将路径作为字符串变量返回

vba - 即使我使用的是长数据类型,vba 中的整数溢出

java - WALA :“Could not create a entrypoint callsites:” 问题

excel - Excel中的链接表和切片器

java - Apache POI : Writing into excel with Java: opening Workbook, java.io.IOException : Cannot write data, 文档似乎已关闭

vba - 有没有一种方法可以使用与 VBA 的默认分隔符 (vbCr/vbCrLf) 不同的分隔符一次一行地读取文件?

vba - 防止用户停止宏(Excel VBA)

powerbi - 基于另一个切片器选择的 Power BI 切片器的初始值