Excel - 通过VBA代码

时间:2016-12-30 11:34:26

标签: excel excel-vba pdf-generation vba

对帖子中的任何格式错误表示歉意,但这是我第一次使用该网站,而且我不太了解fquestion格式说明。

我在电路板上看到了这个问题,但它并没有完全回答我的问题,但对于那些希望提供帮助的人来说这可能很有用 - excel vba not exporting pagesetup to pdf correctly

我在使用代码创建.pdf输出时,没有导出每个工作表中指定范围的完全相同的问题。导出的内容是每个工作表上的所有内容,因此每个工作表分布在2个或更多页面上。设置每张纸的打印范围以将指定区域打印到1张纸上。

我尝试在上面的链接中调整代码,但它似乎不适用于多张表。

我试图以其未适应形式使用的代码位于

之下
Sub ClientPDFOutput()

If Sheets("File Data").Range("FD_FileName") = "" Then
'   MsgBox ("Save the file before exporting to a .pdf fomrat"), vbInformation, "Save File"

'   Exit Sub
   Else
End If

ActiveSheet.Unprotect Password:=strPassword

Range("UI_Status") = "Creating client PDF output - Please wait"

SelectSheets

Application.ScreenUpdating = False

Sheets(arrSheets).Select

strFilename = "Test"

Selection.ExportAsFixedFormat _
   Type:=xlTypePDF, _
   filename:=ActiveWorkbook.Path & "\" & strFilename & ".pdf", _
   Quality:=xlQualityStandard, _
   IncludeDocProperties:=True, _
   IgnorePrintAreas:=True, _
   OpenAfterPublish:=False

Sheets("User Input").Select

Range("UI_Status") = "Client .pdf output created and saved"

ActiveSheet.Protect Password:=strPassword

Application.ScreenUpdating = True

MsgBox ("The client output in .pdf format has been created and saved"), vbInformation, ".pdf Created"

End Sub

Sub SelectSheets()

Dim rngSheets As Range

Set rngSheets = Sheets("File Data").Range("D_OutputSheets")

If rngSheets.Count = 1 Then
   arrSheets = rngSheets.Value2
   Else
   arrSheets = Application.Transpose(rngSheets.Value2)
End If

End Sub

TIA

经过一些实验后,我确定每个页面上的打印范围都已关闭,因此请更正。

我还添加了一些代码来选择每张纸的打印范围,然后将它们全部选为纸张阵列的一部分,但是阵列的第一张纸中的打印范围正在所有纸张上重复...所以如果纸张1中的范围是B4:P61,而纸张2的打印范围是B4:M48,则在选择纸张数组时,纸张2选择了B4:P61。

然后打印出选定的范围,这些范围对于纸张1是正确的,但对于其余纸张则是错误的。

当我通过选择所有工作表手动执行此操作时,文件,导出然后导出所有工作表打印范围,以便为什么在记录这些工作表并将其放入例程时会被忽略?

由于

4 个答案:

答案 0 :(得分:0)

请尝试更改IgnorePrintAreas属性。

Selection.ExportAsFixedFormat _
   Type:=xlTypePDF, _
   filename:=ActiveWorkbook.Path & "\" & strFilename & ".pdf", _
   Quality:=xlQualityStandard, _
   IncludeDocProperties:=True, _
   IgnorePrintAreas:=False, _
   OpenAfterPublish:=False

答案 1 :(得分:0)

我建议您使用以下内容确保您的页面设置将其修复为单页:

With ActiveSheet.PageSetup
 .FitToPagesWide = 1
 .FitToPagesTall = 1
End With

删除with语句中的第一行或第二行以符合您的偏好,或同时保留两者。

此外,我发现你有selection.ExportAsFixedFormat。确保所选区域正确或使用固定范围。您可能还想动态确定最远的行/列,并将其添加到变量PrintRangeGetting the actual usedrange。 设置IgnorePrintAreas:=False

Dim PrintRange As Range

Set PrintRange = Range("A1:XX100")

PrintRange.ExportAsFixedFormat Type:=xlTypePDF, _
                                Filename:=Filename, _
                                Quality:=xlQualityStandard, _
                                IncludeDocProperties:=True, _
                                IgnorePrintAreas:=False, _
                                OpenAfterPublish:=False

答案 2 :(得分:0)

尝试添加"对于活动工作簿中的每个工作表" (它对我有用):

Sub Extract_pdfs()

Dim wb As Workbook
Dim sh As Worksheet

Set wb = ThisWorkbook

For Each sh In wb.Worksheets

    sh.Select

    pdf_name = sh.Name & ".pdf"

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ActiveWorkbook.Path & pdf_name, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=True

Next

End Sub

答案 3 :(得分:0)

如果您试图将多张纸上的多个范围打印到一个pdf中,则可以尝试使用并集函数将它们组合在一起,但是我对使用并集没有任何运气,因此我做了更长的方法那。本质上,我创建了一个新页面并将其范围复制到该页面(采用我想要的格式),因此请确保稍后删除该页面,因为这使再次运行宏变得更加容易。

t= 1
ThisWorkbook.Sheets.Add.Name = "Print"

set rowcount = range(tocopy).row.count

Range(tocopy).SpecialCells(xlCellTypeVisible).Copy
With Sheets("Print").Cells(t, 1)
.PasteSpecial xlPasteColumnWidths
.PasteSpecial xlPasteFormats
.PasteSpecial xlPasteValuesAndNumberFormats
End With
t = t + rowcount

'keep doing for all ranges

Sheets("Print").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"Name.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True

,然后继续执行此操作,直到页面上具有所有范围,然后将页面导出为pdf。然后删除工作表“打印”。

但是,如果您只是想将它们打印在单独的页面上,则可以尝试

dim printing() as string

printing(1) = "Range1"
printing(2) = "Range2"

for each section in printing
Range(section).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"Name.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
next section

正如我上面提到的,您可以尝试为其设置一个联合函数(如果您的运气比我好)

dim printing as range 

printing = union(range1,range2,range3)

printing.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"Name.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True

祝你好运!希望这对您有所帮助,也请注意,由于未经测试,代码可能并不完全正确!