【发布时间】:2014-11-12 19:45:50
【问题描述】:
我目前有一个Excel sheet,它有四列:名字 (A)、姓氏 (B)、组 (C) 和 PDF (D)。感谢another thread 的帮助,我们能够保护以下 VBA 代码,该代码可以根据 D 列将电子表格完美拆分为多个 PDF:
Option Base 1
Sub pdf()
Dim ws As Worksheet
Dim dArr() As String, outputPath As String, fileStem As String
Dim dCol As Long, stRow As Long, endRow As Long, pStRow As Long
Dim docCnt As Long, lnCnt As Long
Dim rwsPerPage As Integer, topM As Integer, botM As Integer
Dim empNme As String
Set ws = Sheets("Data")
dCol = 4 'col D
stRow = 2 'row 2
pStRow = stRow
rwsPerPage = 50
topM = 36 'default in points
botM = 36 'default in points
outputPath = "<yourpath>\"
fileStem = "Employee "
docCnt = 1
lnCnt = 0
With ws
'set essential page parameters
With .PageSetup
.Orientation = xlPortrait
.TopMargin = topM
.BottomMargin = botM
End With
.ResetAllPageBreaks
'last data row
endRow = .Cells(Rows.Count, dCol).End(xlUp).Row
'first employee name
empNme = .Cells(stRow, dCol)
'for each data row
For c = stRow To endRow
lnCnt = lnCnt + 1
'at change of employee name
If Not .Cells(c, dCol).Value = empNme Then
'put doc range into array
ReDim Preserve dArr(docCnt)
dArr(docCnt) = .Range(.Cells(pStRow, dCol - 3), .Cells(c - 1, dCol - 1)).Address
docCnt = docCnt + 1
'reset startrow of new employee
pStRow = c
empNme = .Cells(c, dCol).Value
'add hpage break
.HPageBreaks.Add before:=.Cells(c, dCol)
lnCnt = 0
End If
'at page length
If lnCnt = rwsPerPage Then
'add hpage break
.HPageBreaks.Add before:=.Cells(lnCnt, dCol)
lnCnt = 0
End If
Next c
'last employee if appropriate to array
If c - 1 > pStRow Then
ReDim Preserve dArr(docCnt)
dArr(docCnt) = .Range(.Cells(pStRow, dCol - 3), .Cells(c - 1, dCol - 1)).Address
End If
'produce pdf files
For d = 1 To UBound(dArr, 1)
.Range(dArr(d)).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
outputPath & fileStem & d & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Next d
End With
End Sub
此代码可以完美地根据 D 列将 Excel 工作表拆分为分页符,并将它们作为单独的 PDF 输出到正确的输出 - 只缺少一个。 C列(组)与D列非常相似,但是虽然我不希望每个组都有个性化的PDF,但我希望每个个性化的PDF(来自D列)按C列分页。例如,对于“员工 1”PDF,而不是在一个 PDF 上包含 13 个姓名(代码当前是如何编写的),它将是一页五个姓名(A 组),然后是第二页八个姓名(B 组)相同的“员工 1”PDF。
任何人都可以帮忙调整代码以使其成为可能吗?
谢谢!
编辑:更新代码:
Option Explicit
Option Base 1
Sub pdf()
Dim ws As Worksheet
Dim dArr() As String, outputPath As String, fileStem As String
Dim dCol As Long, stRow As Long, endRow As Long, pStRow As Long
Dim docCnt As Long, lnCnt As Long, c As Long, d As Long, gCol As Long
Dim rwsPerPage As Integer, topM As Integer, botM As Integer
Dim empNme As String, empGrp As String
Dim rngRange As Range
Dim i As Long
Set ws = Sheets("Sheet1")
dCol = 8 'col (pdf)
gCol = 7 'col (group)
stRow = 2 'row 2
pStRow = stRow
rwsPerPage = 21
topM = 36 'default in points
botM = 36 'default in points
outputPath = "Macintosh HD:Users:Ryan:Desktop:"
Set rngRange = Worksheets("Sheet1").Range("A2")
fileStem = rngRange.Value
docCnt = 1
lnCnt = 0
For i = 1 To Worksheets.Count
Sheets(i).PageSetup.PrintTitleRows = "$1:$1"
Next i
With ws
'set essential page parameters
With .PageSetup
.Orientation = xlLandscape
.TopMargin = topM
.BottomMargin = botM
End With
.ResetAllPageBreaks
'last data row
endRow = .Cells(Rows.Count, dCol).End(xlUp).Row
'first employee pdf
empNme = .Cells(stRow, dCol)
'first group
empGrp = .Cells(stRow, gCol).Value
'for each data row
For c = stRow To endRow
lnCnt = lnCnt + 1
'at change of employee pdf (col dCol)
If Not .Cells(c, dCol).Value = empNme Then
'put doc range into array
ReDim Preserve dArr(docCnt)
dArr(docCnt) = .Range(.Cells(pStRow, dCol - gCol), .Cells(c - 1, dCol - 1)).Address
docCnt = docCnt + 1
'reset startrow of new employee
pStRow = c
'reset empNme/empGrp
empNme = .Cells(c, dCol).Value
empGrp = .Cells(c, gCol)
'add hpage break
.HPageBreaks.Add before:=.Cells(c, dCol)
lnCnt = 0
Else
'at change of group (col gCol)
If Not .Cells(c, gCol).Value = empGrp Then
'reset empGrp
empGrp = .Cells(c, gCol)
'add hpage break (within pdf)
.HPageBreaks.Add before:=.Cells(c, gCol)
lnCnt = 0
End If
End If
'at page length
If lnCnt = rwsPerPage Then
'add hpage break
.HPageBreaks.Add before:=.Cells(lnCnt, dCol)
lnCnt = 0
End If
Next c
'last employee if appropriate to array
If c - 1 > pStRow Then
ReDim Preserve dArr(docCnt)
dArr(docCnt) = .Range(.Cells(pStRow, dCol - gCol), .Cells(c - 1, dCol - 1)).Address
End If
'produce pdf files
For d = 1 To UBound(dArr, 1)
.Range(dArr(d)).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
outputPath & fileStem & d & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Next d
End With
End Sub
【问题讨论】: