プロが教えるわが家の防犯対策術!

Office365を使用しています。
B列に縦方向に料理名が並んでいたとします。
今回具体的にはB13からB37まで入ってます

12行目は横方向に材料名が並んでいます。
具体的にはC12からL12まで入ってます

このマトリクス表は
B列の料理に必要な材料に1が、不要な材料は0のフラグを付けています。
具体的には、B13の行にはJ13とK13に1が、
B14の行ではC,I,J,K,Lに1が付いてます。

この一覧表をPDF化したファイルと材料毎のPDFが1つのフォルダにまとまっている事前準備の下、
以下の処理が出来ないでしょうか?

料理名のフォルダを作成して、そのフォルダの中に必要な材料名のPDFをコピー格納。
具体的にはB13のフォルダの中には、JとKのPDFを格納、
B14のフォルダの中には、C,I,J,K,LのPDFを格納していきたいです。
つまり材料名のPDFは何回も使用されます。
最終的には25個のフォルダが生成されることになります。
(増減の可能性があるので必ず25個ではありません。材料数も然り)

サンプルプログラムがあると非常に助かります。
よろしくお願いいたします。

A 回答 (5件)

>作業用ブックの全シートを


同じ内容かも知れませんが・・・私的に思う作業手順
作業ブックを作り、(ツール的位置づけブック)このブックにVBAを書く
1シートに当該ご質問にある定義となる一覧表を作る
一覧表を基に 以下VBAで
①料理名シートを作る(シート名を料理名にする”紐づけがしやすくする為”)
②必要なデータ(材料など)を料理名シート(1シート)に纏める(この時印刷範囲(ページなど)設定を行う)ページ設定がPDFのページ順になります)
③②を繰り返し一覧表の料理全てに対して同様な処理を行う
④作業用ブックの一覧表シートを除くシートをPDFで出力する

出力されたPDFファイルはシートで設定した複数ページのPDFになります
ページ設定で必要ページのみを出力する事も出来ますね

各データがブックにあるのならループ処理で出来ると思います
呼び出しブックやシート名が一覧表に紐づくワードならば比較的簡単かと・・もし違うようであれば先に紐づくキーワードを一覧表に加えるなどすれば一覧表を基にループ処理できそうですね
各データと一覧表の紐づけが確りできれば、1料理で出力したり、材料の増減などの対応も都度で出来ると思います(新規シートの必要性はないかも)

要チェック
設定必須の印刷範囲、余白、改ページなどは実際に出力されるPDFファイルと
異なる(プレビュー)可能性があるので 調整が必要かと思います

>ソースを書けそうにないので細分化ごとに質問してくしかないですね。

そうですね

流石に本スレッドはご質問から離れたものになっていますので
閉じられるべきですね
    • good
    • 0
この回答へのお礼

仰る内容に同意です。(詳細が多少違うかもしれません)
具体的には
・縦方向の料理名一覧(作成するフォルダ名)
・横方向の材料名一覧(チョイスするファイル名とシート名)
を定義となる一覧表シートをマクロブック内に置き、
・料理名毎にフラグのついた材料を1シートにまとめるのではなく、
 材料毎にsheet1、sheet2・・・と追加していく。
・一覧表シート以外のシートを、作成したフォルダにPDF保存
以上を料理全てに対して繰り返す。
という流れと思ってます。

材料群を1シートにまとめないのは、材料毎に1ページにまとまるようにレイアウト設定されているからそのまま利用したいからです。
余計な情報もなく印刷範囲設定も不要な状態になっているので、
Ctrl+P のみで都合良く出力できるようになってます。
とはいえ、要チェック事項は結果を見て検討したいと思います。

閉じる前にお礼を兼ねて書かせて頂きました。
貴重なアドバイスをありがとうございました。

お礼日時:2023/05/25 10:05

VBAの場合


PDFファイルを扱うには 条件や制限があるように思います
なのでPDFファイルを統合するより 
シートに1ページ2ページ・・・と印刷エリアを設定して必要データを配置
シートをPDF出力すればよいので出力時に統合してしまう方が容易です

とは言っても少し先に行っているようですので何回も繰り返し処理を行わないのなら、結合にはWebツールやフリーソフトなどを使うのが簡単だと思います
    • good
    • 0
この回答へのお礼

作成するフォルダの数だけPDF結合の手作業が必要なので、何とかしなければいけないことに気づきました。

おっしゃる通り、PDF化は一番最後だなと感じました。
自分の頭の整理も兼ねて書き出すと、
一覧表の元はエクセルブックで複数あるシートの中の1つです。シート名は「一覧表」じゃありません。
各材料もそれぞれ別ブックで、しかも複数あるシートのうちの1シートです。材料名がシート名となってます。

フローとしては、
一覧表シートが入ってるブックから、一覧表シートだけを作業用の新規ブックにコピー(関数を値にしておく必要も?)

左列からの順で材料シートが入ってるブックから材料シートだけを作業用ブックならコピー(関数を値にしておく必要も?)
フラグ1がある限り繰り返す

作業用ブックの全シートをPDFで保存(保存先は生成フォルダの中)

そうすれば希望の順のページ構成になったPDF1ファイルを各フォルダに収められそうです。

ソースを書けそうにないので細分化ごとに質問してくしかないですね。

お礼日時:2023/05/25 00:10

>全てのフォルダに「一覧表.pdf」が入るようにしたいのですが、


パスもファイル名も明確ならfold_pathが生きている
Next
Next
の間にFileCopyステートメントを加えても良さそう

>「一覧表」という列を追加して
表組を拡大しループ回数を増やすデメリットはあるものの
改修や変更をシート表組の変更で対応できるので良いかも知れませんね
DatList = Range("B12:L37")をフレキシブルに変更しないといけないけれど
    • good
    • 0
この回答へのお礼

ありがとうございます!
この先でやりたい事があるのですが、
※今回の質問の域を超えている場合は、別スレッドで改めます。

一応書かせて頂きます。
フェーズ1として(勝手に処理を細分化させて頂いてます)、
フォルダに振り分けましたが、
本当は、各フォルダのPDFはページ結合して1ファイルのPDFにしたいのが本来のゴールなのです。
順番も決まっていて、
一覧表.pdf + C列の材料.pdf + D列の材料.pdf + E列の材料.pdf + ・・・
と左の列からの順番になるように、
1ファイルに全ページが連結された状態で フォルダ名.pdf という名前で保存したいんです。

その為には勝手な解釈ですが、
・振り分けるときに先頭に数字を入れてナンバリングが必要かな
・フォルダ内のPDFを結合するVBAがあるのかな
という工程を想定しましたが可能でしょうか?

PDF結合については下記サイトを見つけたのでこれから試そうと思いますが、
アドバイスあれば嬉しいです。
https://www.sejuku.net/blog/99158
失礼いたしました。

お礼日時:2023/05/23 17:36

こんにちは


フォルダパスが不明ですね
前回答者の方法です 数行の処理なので解決されているかもですね

フォルダパスは不明なのでデスクトップとして
纏っているフォルダをデスクトップのPDFフォルダとして
ざっくり書いて見ました デバッグはしていないのでエラーやロジックミスがありましたら直してください

>増減の可能性がある
これに付いても38行目以降、M列より右列がどの様になっているか不明などで未対応です

Sub sample()

Dim wsh As Object, targetPath As String
Set wsh = CreateObject("WScript.Shell")
targetPath = wsh.SpecialFolders("Desktop")
Set wsh = Nothing

Dim PDFフォルダパス As String
PDFフォルダパス = targetPath & "\" & "PDFフォルダ"

Dim fold_path As String
Dim DatList As Variant

DatList = Range("B12:L37")

Dim i As Long, j As Long
Dim fName As String
For i = 2 To UBound(DatList, 1)
fold_path = targetPath & "\" & DatList(i, 1)
If Dir(fold_path, vbDirectory) = "" Then
MkDir fold_path
End If

For j = 2 To UBound(DatList, 2)
If DatList(i, j) = 1 Then
fName = DatList(1, j) & ".pdf"
FileCopy PDFフォルダパス & "\" & fName, fold_path & "\" & fName
End If
Next
Next

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
ソースを示してくれて非常に助かります。
正常動作しました。
私が手を加えたのは、
デスクトップ¥PDFフォルダ をデフォルトフォルダにしようと思い、
targetPath = wsh.SpecialFolders("Desktop") & "\" & "PDFフォルダ"
としました。

デスクトップ¥PDFフォルダ¥pdf フォルダに各材料pdf が入っていて、
マクロを実行すると、PDFフォルダ内に各材料pdfがコピーされるのを確認しました。一番の山を越えられた気がして助かりました。

pdfフォルダには、「一覧表.pdf」も入っていて、
全てのフォルダに「一覧表.pdf」が入るようにしたいのですが、
「一覧表」という列を追加して、全ての行に1を付けるのが簡単でしょうか?

お礼日時:2023/05/23 16:24

こんにちは



基本的なセルの値の参照・取得や繰り返し(=ループ)に関してはご存じのこととします。

対象各行(=13~37行)について以下を繰り返せばよいことはお分かりになるかと。
1)料理名のフォルダを作成
2)材料の範囲(=C:L列)について以下をループ
 2-1)セル値が1なら材料名のPDFファイルをコピー
 2-2)セル値が0なら次の列へ(=なにもしない)


1)のフォルダの作成には MkDirステートメントを利用すればできます
 MkDir 親フォルダのパス & "\" & フォルダ名
のような感じです。
https://learn.microsoft.com/ja-jp/office/vba/lan …

2-1)のファイルコピーには FileCopyステートメントで可能です。
 FileCopy コピー元ファイルパス, コピー先ファイルパス
の形式です。
https://learn.microsoft.com/ja-jp/office/vba/lan …


>サンプルプログラムがあると非常に助かります。
リンク先にそれぞれのステートメントの使用サンプルがのっていますのでどうぞ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
非常に参考になります!

お礼日時:2023/05/23 16:18

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