dポイントプレゼントキャンペーン実施中!

office365を使用しています。
1行に1件ずつデータが入っているExcelファイルで,I2セルからI3セルで指定した範囲の行のデータを「様式」シートに順番に反映させながら,連続してPDFを作成するコードを以下のように作成しております。
以下のコードだと,PDFファイルが1件(1行)につき,一つずつ作成されますが,1つのファイルとして結合した状態で出力させるにはどのようなコードにしたら良いか,ご教示いただけないでしょうか。

おそらく,クリップボードのようなところで,1件(1行)のデータを様式シートに反映させたらそれを保存し,順次,次の行のデータを反映させてクリップボード上のデータに追加していくという動きのコードになると思うのではないかと思うのですが,調べてもわかりませんでした。


Sub 連続PDF作成()

Dim i As Long
Dim j, k As Long
Dim l As String
Dim myfolder As String

Application.ScreenUpdating = False

myfolder = ThisWorkbook.Path + "\"
j = Worksheets("回答").Range("I2").Value
k = Worksheets("回答").Range("I3").Value

For i = j To k
Worksheets("回答").Range("A5").Value = Worksheets("回答").Cells(i + 9, 1).Value
l = Sheets("回答").Range("N6").Value & "・" & Sheets("回答").Range("G6").Value & "・" & Sheets("回答").Range("D6").Value


Worksheets("様式").Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=myfolder & "回答\" & l & ".pdf", OpenAfterPublish:=False, IgnorePrintAreas:=False
Next i


Application.Goto Sheets("回答").Range("A5")

Application.ScreenUpdating = True

End Sub

A 回答 (3件)

No2です。



>難しいのであれば今回はあきらめます。
「難しい」と書いた覚えはないのですが・・・?

具体的な説明が何も無いのでよくわかりませんけれど、以下のような感じでできませんか?
ただし、
 ・入力値の(=I2,I3)のチェックが何も無いので、ごく簡単なものを追加
 ・回答!A5セルに値をセットすれば、様式シートは自動計算されると仮定
 ・様式シートのコピーしたいセル範囲を、仮にA1:H40と設定
 ・出力ファイル名を何にするのか不明なので、仮に直接指定する方式
としてあります。

Sub 連続PDF作成()
Dim stK, stY, stD
Dim startN, endN, i As Long
Const AA = "A1:H40" ' ← コピー(転記)対象のセル範囲
Const fileName = "hoge" ' ← 作成するPDFファイル名

Set stK = Worksheets("回答")
Set stY = Worksheets("様式")
startN = stK.Range("I2").Value
endN = stK.Range("I3").Value
If Application.CountBlank(stK.Range("I2:I3")) > 0 Or _
Not (IsNumeric(startN) And IsNumeric(endN)) Then _
MsgBox "無効な入力です": Exit Sub


Application.ScreenUpdating = False
Application.DisplayAlerts = False
stY.Copy
With ActiveWorkbook
Set stD = ActiveSheet
For i = startN To endN
stK.Range("A5").Value = stK.Cells(i + 9, 1).Value
stD.Copy after:=.Worksheets(.Worksheets.Count)
.Worksheets(.Worksheets.Count).Range(AA).Value = stY.Range(AA).Value
Next i

stD.Delete
.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & fileName
.Close False
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

遅くなってすみません。
書いていただいたコードは希望通りに動きましたが,内容が理解できずにお礼が遅くなってしまいました。

以下の部分について教えていただけると幸いです。コメントを付けましたが,流れも理解できていません。
-----------------------------------------------------
With ActiveWorkbook '開いているExcelファイルについて
Set stD = ActiveSheet '開いているシートをstDと定義
For i = startN To endN 'iに始点と終点を設定
stK.Range("A5").Value = stK.Cells(i + 9, 1).Value (ここはわかります)
stD.Copy after:=.Worksheets(.Worksheets.Count) (ここが特にわかりません。stDをワークシートナンバーが一番多いシートにコピぺ?)
.Worksheets(.Worksheets.Count).Range(AA).Value = stY.Range(AA).Value(ここはわかります)
Next i

stD.Delete (アクティブシートを削除?)
-----------------------------------------------------

お礼日時:2024/05/29 17:41

No1です。



>いろいろなプロセスを行うコードが必要になるということですね。
意味がイマイチよくわかりませんけれど・・
要は、新規ブック(新規じゃなくて当該ブックでも良いですが)に結果を溜めておいて、出力はまとめて行えば良いのでは、というだけのことです。

あるいは、「一旦バラバラで出力してから、PDFを結合してまとめる」と言う方法もないことはないですが、こちらの方がハードルは高いはずです。
https://www.sejuku.net/blog/99185#google_vignette
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはり難しそうですね。

簡単なコードの書き換えで実現できれば良いのですが,難しいのであれば今回はあきらめます。(希望のマクロが動くようになったときのメリットと比べて割に合わないため)

お礼日時:2024/05/24 13:56

こんにちは



>おそらく,クリップボードのようなところで,1件(1行)のデータを
>様式シートに反映させたらそれを保存し~~
クリップボード利用でできるのかどうかは知りませんけれど、以下は、ひとつのアイデアです。

1)新規ブックを作成
2)様式シートを表示したら、順に上記ブックの新シートへ値をコピペ
(書式等もコピーする必要があるのなら、最初にシートを複製してテンプレート化しておく方が良いかも)
3)全シートを作成したら、ブックをまとめてPDF出力
4)作成した新規ブックを消去

という手順で、ご希望の結果を得られると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
いろいろなプロセスを行うコードが必要になるということですね。

お礼日時:2024/05/24 13:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A