プロが教える店舗&オフィスのセキュリティ対策術

前提
A1:K68までのデータがA4用紙1枚に収まるよう設計されたエクセルファイルがあります。
これが600枚分、A1:K40800までデータがあり、ファイル出力(プリンタ名DWを指定して印刷)します。

やりたいこと

①A1,A69,A137…のA列68行ごとの値が同じものをひとまとめとしてファイル出力したい
(A4用紙600枚中、30グループほどある)

②出力したファイル名を①の値の名前にしたい
(通常、作業しているエクセルのファイル名になる)
これを実現できるvbaを教えてください。お願いします。

質問者からの補足コメント

  • すみません補足します。
    A1,A69,A137…のA列68行おきのセルの値が同じものをファイル出力したいです。
    印刷は仮想プリンタのDocuWorksで行います。
    出力されたDocuWorksファイルはエクセルのファイル名になりますが、名前をvbaで指定することは可能でしょうか?(処理速度的にこちらが望ましい)
    ファイル名を変更、保存での処理が妥当でしょうか?

      補足日時:2019/09/02 12:35

A 回答 (4件)

こんにちは



そのままのテスト環境がないので、完全なテストはできていませんが・・・
まずは、少なめのデータでテストしてみてください。

※ プリンタ名は(一般的と思われる)「DocuWorks Printer」にしてありますので、異なる場合は修正願います。
※ アクティブなシートを対象として処理します。
※ 出力時のページ設定は省略していますので、デフォルトの設定で出力されます。
(必要な場合は追加願います)

Sub Sample()
Dim ss As Worksheet, ds As Worksheet
Dim rg As Range, key_data, key
Dim rw As Long, idx As Long, tmp
Dim wfolder As String

Const set_rows = 68
Const printerName = "DocuWorks Printer"

Application.ScreenUpdating = False

Set ss = ActiveSheet
Worksheets.Add after:=Worksheets(Worksheets.Count)
Set ds = ActiveSheet

wfolder = ThisWorkbook.Path & "\DocumWorks"
If Dir(wfolder, vbDirectory) = "" Then MkDir wfolder


Set rg = ds.Cells(1, 1)
For rw = 1 To ss.Cells(Rows.Count, 1).End(xlUp).Row Step set_rows
 rg.Value = ss.Cells(rw, 1).Value
 rg.Offset(0, 1).Value = (rg.Row - 1) * set_rows + 1
 Set rg = rg.Offset(1)
Next rw
ds.Cells(1, 2).CurrentRegion.Sort key1:=ds.Cells(1, 1), order1:=xlAscending
ds.Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = "END"
key_data = ds.Cells(1, 2).CurrentRegion.Value


idx = LBound(key_data)
While idx < UBound(key_data)
 ds.Cells.ClearContents
 key = key_data(idx, 1)
 Set rg = ds.Cells(1, 1)

 While idx < UBound(key_data) And key = key_data(idx, 1)
  ss.Cells(key_data(idx, 2), 1).Resize(set_rows).EntireRow.Copy Destination:=rg
  idx = idx + 1
  Set rg = rg.Offset(set_rows)
 Wend

 ds.Copy
 ActiveWorkbook.SaveAs Filename:=wfolder & "\" & key, FileFormat:=xlWorkbookDefault
 ActiveSheet.PrintOut Copies:=1, ActivePrinter:=printerName
 ActiveWorkbook.Close
Wend

Application.DisplayAlerts = False
ds.Delete
Application.DisplayAlerts = True
Kill wfolder & "\*"
RmDir wfolder
Application.ScreenUpdating = True

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

ありがとうございます!
分かりずらい質問にこんなに丁寧にコード書いてくださって、本当に感謝です!!
修正しつつ頑張ってみます!

お礼日時:2019/09/04 15:02

DWのバージョンは?


>A4用紙1枚に収まるよう設計されたエクセルファイル。設計内容は?

方法、処理速度、メモリスタックは、考慮しません。

全データをページレイアウト設定、A1から68ピッチでループ
同じ値のページ(Row/ピッチ)を配列 値、ページ に入れグループ化

グループの数ループ
ファイル名(シート名)=値
先に挙げたページの PRN_NM, from:=1, To:=1, 部分でページ指定する
検証するすべがないので、ご自分で作ってください。

参考、引用 サイト:ブログ 「桜のうろの中で」
http://blog.livedoor.jp/arumakan_ywa/archives/51 …
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2019/09/04 15:03

ご質問の意味がよく分からないです。



>A列68行ごとの値が同じものをひとまとめ
「68行ごとの値」というものは、合計ですか、何を意味するのでしょうか。

>出力したファイル名を①の値の名前にしたい
それはどこにあるのでしょうか。

>(通常、作業しているエクセルのファイル名になる)

「通常、作業しているエクセルのファイル名」の意味がよく分かりません。
拡張子の意味でしょうか。でも、xlsx, xlsm, xlsb, xls  などがあります。

Docuworks ?
    • good
    • 0

Docuworksよくわからないので


こちらを、参考にすれば、ファイル名を変えることは出来ますね
http://blog.livedoor.jp/arumakan_ywa/archives/51 …
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2019/09/04 15:03

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