Help us understand the problem. What is going on with this article?

Word VBA 変更履歴やノートは印刷せず、メイン文書だけを印刷するマクロ

本番印刷の仕様

英語では発行(publish)とか言いますが、Publishっていっぱい意味があって全く分かりません。本番です。これをお客様やクライアントに渡す、というときに印刷です。そういう時に、何を「印刷しないか」が求められます。当然、本番印刷の仕様は変わります。今回はこの記事の中での本番なので、ご自身の「本番」の仕様はご自身で決めましょう。

隠し文字は印刷しない

隠し文字は注釈等に使うため、印刷しない
この設定はまずメイン文書のみ
wdPrintDocumentContent
という定数と
Option.PrinteHiddentext
を合わせています。

Printerの用紙と、Wordのファイルの用紙の設定は同じA4

標準がA4なので、それを前提にして拡大、縮小は考えていません。

すべてのページをバックグラウンドで印刷

次のプロセスに移行する。Falseにすると移行しない。

変更履歴、コメントは印刷しない

これをオプションで標準では印刷させないようにする設定はないのですが、これは日ごろ悪口ばかり言っている当方でもそうだろうな、と思います。
なぜなら、Wordは共同編集を目指しているので、注釈が印刷されないオプションがあるといらぬトラブルを招くからです。

部数は1部、すべてのページを印刷

このほかにも圧縮などの設定がありますが、これは省略しています。これはあらかじめすべて決まっているという想定になっています。
なんどもテストを重ねてから印刷する。

フィールドを隠し文字にしておく

これは次回やります。

コード

Sub Publish_Print_MainDocument()
'隠し文字は印刷しない
'全てのページをバックグラウンドで一部印刷
'変更履歴コメントは印刷しない
On Error GoTo Err_Handle
Dim bl As Boolean
With Application
bl = .Options.PrintHiddenText
.Options.PrintHiddenText = False
.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _
wdPrintDocumentContent, Copies:=1, Pages:="", PageType:= _
wdPrintAllPages, Background:=True, PrintToFile:=False
End With
GoTo Err_Handle
Exit Sub
Err_Handle:
With Application
.Options.PrintHiddenText = bl '通常は隠し文字を印刷する仕様であるため、印刷後もとに戻す。通常はTrueが推奨。気づかないとトラブルになる恐れがあるため。
Debug.Print "Publish_Print_MainDocument run. 隠し文字(HiddenText)印刷しない すべてをバックグラウンドで1部印刷。変更履歴コメントは印刷しない。"
'.Final = True '最終版にする
End With
End Sub

PrintOutとExportAsFixedFormatは出力できるファイルの種類が違う。PrintOutの方が多い

WdPrintOutItem
wdPrintDocumentContent ’コメントが入らない印刷。ふつうはこれが標準だと思うけどね
wdPrintDocumentWithMarkup '変更履歴をドキュメントと表示した状態での印刷。本文が見えないので全く役に立たない。
ここから下があまり使われていない。
ちなみにExportasFileformatではこれから下の定数は使えない。
wdPrintProperties ' ファイル情報(プロパティ一覧)
wdPrintStyles '文書で使用しているスタイルの一覧。ただし詳細設定は表示されず、概要のみ
wdPrintKeyAssignments 'キー定義(カスタムショートカットキー一覧、標準は出力されない)
wdPrintAutoTextEntries '定型句の登録名
Document.ExportAsFixedFormat
Document.ExportAsFixedFormat2
この2つは
WdExportItem

Name Value Description
wdExportDocumentContent 0 Exports the document without markup.
wdExportDocumentWithMarkup 7 Exports the document with markup.

を見るとメイン文書のみか、変更履歴とコメントとメイン文書の2択しかありません。
最もスタイルだけとか印刷した人っています?

ExportAsFixedFormatは指定したページ範囲が設定できない

WdExportRange enumeration (Word)
Specifies how much of the document to export.

Name Value Description
wdExportAllDocument 0 Exports the entire document.
wdExportCurrentPage 2 Exports the current page.
wdExportFromTo 3 Exports the contents of a range using the starting and ending positions.
wdExportSelection 1 Exports the contents of the current selection.

WdPrintOutRange enumeration (Word)

Name Value Description
wdPrintAllDocument 0 The entire document.
wdPrintCurrentPage 2 The current page.
wdPrintFromTo 3 A specified range.
wdPrintRangeOfPages 4 A specified range of pages.指定したページ範囲
wdPrintSelection 1 The current selection.

その代わりSelection.ExportAsFixedFormatがある

たぶんこれがその代わりらしい。
Selection.ExportAsFixedFormat
Selection.ExportAsFixedFormat2

PrintOutの違い

Word.Application のメンバーのPrintOut

Sub PrintOut([Background], [Append], [Range], [OutputFileName], [From], [To], [Item], [Copies], [Pages], [PageType], [PrintToFile], [Collate], [FileName], [ActivePrinterMacGX], [ManualDuplexPrint], [PrintZoomColumn], [PrintZoomRow], [PrintZoomPaperWidth], [PrintZoomPaperHeight])
FileName 省略可能 Variant 印刷するドキュメントのパスとファイル名です。 この引数を省略すると、作業中の文書が印刷されます。 Application オブジェクトに対してのみ指定できます。

Word.Document のメンバーのPrintOut

Sub PrintOut([Background], [Append], [Range], [OutputFileName], [From], [To], [Item], [Copies], [Pages], [PageType], [PrintToFile], [Collate], [ActivePrinterMacGX], [ManualDuplexPrint], [PrintZoomColumn], [PrintZoomRow], [PrintZoomPaperWidth], [PrintZoomPaperHeight])

Word.Envelope のメンバーのPrintOut

文書に関連付ける封筒を表します。
Envelope.PrintOut method
Prints an envelope without adding the envelope to the active document.

Sub PrintOut([ExtractAddress], [Address], [AutoText], [OmitReturnAddress], [ReturnAddress], [ReturnAutoText], [PrintBarCode], [PrintFIMA], [Size], [Height], [Width], [FeedSource], [AddressFromLeft], [AddressFromTop], [ReturnAddressFromLeft], [ReturnAddressFromTop], [DefaultFaceUp], [DefaultOrientation], [PrintEPostage], [Vertical], [RecipientNamefromLeft], [RecipientNamefromTop], [RecipientPostalfromLeft], [RecipientPostalfromTop], [SenderNamefromLeft], [SenderNamefromTop], [SenderPostalfromLeft], [SenderPostalfromTop])

Word.MailingLabel のメンバーのPrintOut

宛名ラベルを表します。
Sub PrintOut([Name], [Address], [ExtractAddress], [LaserTray], [SingleLabel], [Row], [Column], [PrintEPostageLabel], [Vertical])

Word.MailingLabel.PrintOutByID

1 つの住所を 1 枚の宛名ラベルまたは宛名ラベルのシート全体に印刷します。
Sub PrintOutByID([LabelID], [Address], [ExtractAddress], [LaserTray], [SingleLabel], [Row], [Column], [PrintEPostageLabel], [Vertical])

lasertray, 省略可能 Variant 使用するレーザー プリンターのトレイです。 任意のwdpapertray定数を指定できます。
LaserPrnter前提?
singlelabel 省略可能 Variant True は 1 つのラベルを印刷するには False に同じラベルのページ全体を印刷します。

Word.Window のメンバーのPrintOut

指定されたウィンドウに表示される文書の全部または一部を印刷します。
Sub PrintOut([Background], [Append], [Range], [OutputFileName], [From], [To], [Item], [Copies], [Pages], [PageType], [PrintToFile], [Collate], [ActivePrinterMacGX], [ManualDuplexPrint], [PrintZoomColumn], [PrintZoomRow], [PrintZoomPaperWidth], [PrintZoomPaperHeight])

隠しコマンドその1 PrintOutOld

ApplicationClass.PrintOutOld(Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object) Method
これは下記のQAのPrintOutMethodと一致している。互換性のために残っているのかもしれない。

隠しコマンドその1 PrintOut2000

ApplicationClass.PrintOut2000(Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object) Method
パラメーターの変数がPrintOutと同じになっている。これがよくわからない。

突っ込みどころが多すぎるQA

http://www.host.or.jp/cgi-win/webboard/wb_cont.exe?programing+g+10406+NAME

日 時 '01年 1月16日 17:39:09
タイトル PrintOutをWordマクロじゃなくてVBSで呼出す方法(かなり長いです) (閲覧回数:4395回)
WSHのVBSで質問です。
VBS、Wordマクロ共に急遽使用しなければならなくなり、
前知識がほとんどない状態で質問してるので、
かなり素人っぽい話をしてると思うのですが、よろしくお願いします。<こう書いている時点でこういうのは相手にしないですね。

今までWordのマクロからPrintOutで印刷を行っていたものを
VBSからWordオブジェクトを作成して印刷してみようとしましたが、
うまくいきません
Wordマクロで

 ActiveDocument.PrintOut _
  Range:=wdPrintAllDocument, _
  Item:=wdPrintDocumentContent, _
  Copies:=1, _
  PageType:=wdPrintAllPages, _
  Collate:=True, _
  Background:=False, _
  Append:=False

と書いてうまくいっていたものを、<けんか腰で自分が思っている通りに動くと思っているのがおかしい
VBSで

 Set objWd = WScript.CreateObject( "Word.Application" )
 objWd.Visible = true
 objWd.Documents.Open( filename )
 objWd.ActiveDocument.PrintOut _
  Range:=wdPrintAllDocument, _
  Item:=wdPrintDocumentContent, _
  Copies:=1, _
  PageType:=wdPrintAllPages, _
  Collate:=True, _
  Background:=False, _
  Append:=False '[編注]名前付き引数は使えないうえに、順番が全く違う。マクロを記録するとこの順番になる

と置きかえると、
まず実行時に「ステートメントがありません」というエラーが出てしまいます。

[編注]定数も名前付き引数も使えない。定数はVBEでオブジェクトブラウザで定数を検索すると、Const で出るので、それをコピペします。定数は恣意的な名前を付けずに、これを活用する方がよいです。
次に魔界の仮面弁士様のアドバイスを受け売りにすると Openをオブジェクトで受けていない、という点が非常に問題です。
当方でVBSCRIPTを訂正してみるとこうなると思います。実際に動作も確認しました。さらに今回のテーマの変更履歴等を印刷させないというものです。

' Vbscript
Const wdPrintAllDocument = 0
Const wdPrintDocumentWithMarkup = 7
Const wdPrintDocumentContent = 0
Const wdPrintAllPages = 0
Const wdOpenFormatAuto = 0
Const wdRevisionsMarkupNone = 0
Const wdRevisionsViewFinal = 0
Const wdPrintFromTo = 3
Dim wApp ' As Word.Application
Set wApp = CreateObject("Word.Application") '変数の宣言と同時にCreateObjectを入れる。
Dim wDoc ' As Word.Document
Dim sFileName ' As String
sFileName = "%USERPRIFILE%\Documents\WordDocumentFilename.docm"
With wApp
.Visible = true
Set wDoc = .Documents.Open( sFilename, False, False, False, , , , , , wdOpenFormatAuto, , True, , , True)

wDoc.Activate
With wApp.ActiveWindow.View.RevisionsFilter
.Markup = wdRevisionsMarkupNone
.View = wdRevisionsViewFinal
End With
'.PrintOut False
'wDoc.PrintOut True, False, wdPrintAllDocument
.PrintOut True, False, wdPrintAllDocument, , "1", , wdPrintDocumentContent, "1", , wdPrintAllPages
End With
if err.number <> 0 then wscript.Echo Err.Number, Err.Description
wDoc.Close false
Set wDoc = Nothing
wApp.Quit
If Not wApp Is Nothing Then Set wApp = Nothing
WScript.Quit

ここでPrintOutの呼出し方を

 objWd.ActiveDocument.PrintOut _
  Range=0, _
  Item=0, _
  Copies=1, _
  PageType=0, _
  Collate=True, _
  Background=False, _
  Append=False

にしてやるとエラーは出ずにWord文章は開けました。
ただ「型が一致しません。objWd.ActiveDocument.PrintOut」というエラーが出てしまいます。

名前付き引数を使っているのが誤りだが、それを訂正してもオプションが多いとこの確かにエラー表示が出現する。単純に wDoc.PrintOutが成功する。
これは確かにハマるのは無理はない。答えはPage数を文字列にする。
[Wordマクロ]PrintOutメソッド実行時に「型が一致しません」との実行時エラーが発生する。
これはページだけでなく、セクションでも指定できるようになっているため。
Word 2013、Word 2010、Word 2007、および Word 2003 で複数セクションの文書内のページの範囲を印刷する方法

ここで疑問に思ったのですが、
WordマクロのヘルプでPrintOutの構文としては
「expression.PrintOut( ・・・ )」と書いてあるのに
使用例には
「expression.PrintOut Range:=・・・」と書いてあります。
<質問1>このかっこがある場合とない場合の違いは何ですか?
ためしに構文のようにかっこをつけて
 objWd.ActiveDocument.PrintOut( 0, 0, 1, 0, True, False, False )
でやってみると
**「Subプロシージャを呼出す時はかっこを使うことができません」とエラーが出ました。 ** <かっこを使うときは通常、式の右辺に来た時限定です
かっこなしに戻して
 objWd.ActiveDocument.PrintOut 0, 0, 1, 0, True, False, False
に戻しましたが同じく
「型が一致しません。objWd.ActiveDocument.PrintOut」というエラーが出てしまいます。
ここで省略可能な値のことを思い出して、 <思いついた過程は全くどうでもいい。そこは整理して質問しよう
 , , といった形でカンマだけをつけてみても結果は同じでした。
**<質問2>VBSからWordのPrintOitを行うにはどうすればよいのでしょうか? ** <一応上記のとおり
**<質問3>Wordマクロでは定数を使用してますがVBSでは使用できないのでしょうか? ** <できません。ただしConstで定義してこれを回避します。

ここまで長い文章を読んでいただきありがとうございました。
甘えついでに、質問に答えていただければ、なおありがたく思います。
よろしくお願いします。
http://www.host.or.jp/cgi-win/webboard/wb_cont.exe?programing+g+10431+NAME

日 時 '01年 1月19日 22:24:42
タイトル Re(1):PrintOutをWordマクロじゃなくてVBSで呼出す方法 (閲覧回数:1483回)
投稿者 YAMさん 
[1月16日 17:39 こうじさんの投稿]

YAMです。
(長いので適宜省略)

レスがつかないので、ちょっとだけフォロー。

今までWordのマクロからPrintOutで印刷を行っていたものを
VBSからWordオブジェクトを作成して印刷してみようとしましたが、
うまくいきません

<質問1>このかっこがある場合とない場合の違いは何ですか?
よくわかりません。パス '<!?!?!

<質問2>VBSからWordのPrintOitを行うにはどうすればよいのでしょうか?
こまかいパラメータさえきにしなければActiveDocumentオブジェクトのPrintOut
メソッドを単に実行すれば印刷できます。 <確かにそうだけど、20年前から変わらない。

例)
set oWD = WScript.CreateObject("Word.Application")
oWD.visible=true
oWD.Documents.open("test.doc")
oWD.ActiveDocument.PrintOut
oWD.quit

<質問3>Wordマクロでは定数を使用してますがVBSでは使用できないのでしょうか?
wordのVBAで使える定数はそのままVBSで使えるわけではなさそうです。

VisualBasicEditorの入力候補を鵜呑みしていいなら
PrintOutメソッドは以下のパラメータを指定できます。

oWD.ActiveDocument.PrintOut Background,Append,Range,OutputFileName,
 From,To,Item,Copies,Pages,PageType,PrintToFile,Collate,FileName,
 ActivePrinterMacGX,ManualDuplexPrint 

doc時代は後ろに縮小率とかついていないのですね。上記でも書きましたが、現在はPrintOutOldになります。
あくまで推定ですが、Printoutはファイルのバージョンの違いで内部でPrintoutOldを使い分けていると考えられます。

なので
PrintOut ,,,,,,,2とすれば2枚印刷されますし、
PrintOut ,,,"test.prn"とすればファイルに印刷できます。

時間があったら色々ためしてみてください。
(きがむいたので少しテストしてみましたが、もうあきましたのでやめます)

Q11Q
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした