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

#本番印刷の仕様
英語では発行(publish)とか言いますが、Publishっていっぱい意味があって全く分かりません。本番です。これをお客様やクライアントに渡す、というときに印刷です。そういう時に、何を「印刷しないか」が求められます。当然、本番印刷の仕様は変わります。今回はこの記事の中での本番なので、ご自身の「本番」の仕様はご自身で決めましょう。
##隠し文字は印刷しない
隠し文字は注釈等に使うため、印刷しない
この設定はまずメイン文書のみ
wdPrintDocumentContent
という定数と
Option.PrinteHiddentext
を合わせています。
##Printerの用紙と、Wordのファイルの用紙の設定は同じA4
標準がA4なので、それを前提にして拡大、縮小は考えていません。


##すべてのページをバックグラウンドで印刷
次のプロセスに移行する。Falseにすると移行しない。
##変更履歴、コメントは印刷しない
これをオプションで標準では印刷させないようにする設定はないのですが、これは日ごろ悪口ばかり言っている当方でもそうだろうな、と思います。
なぜなら、Wordは共同編集を目指しているので、注釈が印刷されないオプションがあるといらぬトラブルを招くからです。
##部数は1部、すべてのページを印刷
このほかにも圧縮などの設定がありますが、これは省略しています。これはあらかじめすべて決まっているという想定になっています。
なんどもテストを重ねてから印刷する。
##フィールドを隠し文字にしておく
これは次回やります。



#コード

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

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

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


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

[WdExportRange enumeration (Word)](https://docs.microsoft.com/ja-jp/office/vba/api/word.wdexportrange)
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)](https://docs.microsoft.com/ja-jp/office/vba/api/word.wdprintoutrange)

|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](https://docs.microsoft.com/ja-jp/office/vba/api/word.selection.exportasfixedformat)
[Selection.ExportAsFixedFormat2](https://docs.microsoft.com/ja-jp/office/vba/api/word.selection.exportasfixedformat2)
##PrintOutの違い
###[Word.Application のメンバーのPrintOut](https://docs.microsoft.com/ja-jp/office/vba/api/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](https://docs.microsoft.com/ja-jp/office/vba/api/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](https://docs.microsoft.com/ja-jp/office/vba/api/word.envelope)
文書に関連付ける封筒を表します。
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](https://docs.microsoft.com/ja-jp/office/vba/api/word.mailinglabel.printout)
宛名ラベルを表します。
Sub PrintOut([Name], [Address], [ExtractAddress], [LaserTray], [SingleLabel], [Row], [Column], [PrintEPostageLabel], [Vertical])

###[Word.MailingLabel.PrintOutByID](https://docs.microsoft.com/ja-jp/office/vba/api/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](https://docs.microsoft.com/ja-jp/office/vba/api/word.window.printout)
指定されたウィンドウに表示される文書の全部または一部を印刷します。
Sub PrintOut([Background], [Append], [Range], [OutputFileName], [From], [To], [Item], [Copies], [Pages], [PageType], [PrintToFile], [Collate], [ActivePrinterMacGX], [ManualDuplexPrint], [PrintZoomColumn], [PrintZoomRow], [PrintZoomPaperWidth], [PrintZoomPaperHeight])
##隠しコマンドその１ PrintOutOld
[ApplicationClass.PrintOutOld(Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object) Method](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.word.applicationclass.printoutold?view=word-pia)
これは下記のQAのPrintOutMethodと一致している。互換性のために残っているのかもしれない。
##隠しコマンドその１ PrintOut2000
[ApplicationClass.PrintOut2000(Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object) Method](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.word.applicationclass.printout2000?view=word-pia)
パラメーターの変数が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マクロじゃなくてＶＢＳで呼出す方法（かなり長いです） (閲覧回数：4395回)
ＷＳＨのＶＢＳで質問です。
ＶＢＳ、Ｗｏｒｄマクロ共に急遽使用しなければならなくなり、
前知識がほとんどない状態で質問してるので、
***かなり素人っぽい話をしてると思うのですが、よろしくお願いします。***＜こう書いている時点でこういうのは相手にしないですね。

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

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

>***と書いてうまくいっていたものを、***＜けんか腰で自分が思っている通りに動くと思っているのがおかしい
ＶＢＳで

```vb
　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を訂正してみるとこうなると思います。実際に動作も確認しました。さらに今回のテーマの変更履歴等を印刷させないというものです。

```vb
' 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の呼出し方を

```vb
　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メソッド実行時に「型が一致しません」との実行時エラーが発生する。](https://www.ka-net.org/blog/?p=4018)
これはページだけでなく、セクションでも指定できるようになっているため。
[Word 2013、Word 2010、Word 2007、および Word 2003 で複数セクションの文書内のページの範囲を印刷する方法](https://docs.microsoft.com/ja-jp/office/troubleshoot/word/print-a-range-of-pages)

>ここで疑問に思ったのですが、
ＷｏｒｄマクロのヘルプでPrintOutの構文としては
「expression.PrintOut( ・・・ )」と書いてあるのに
使用例には
「expression.PrintOut Range:=・・・」と書いてあります。
＜質問１＞このかっこがある場合とない場合の違いは何ですか？
ためしに構文のようにかっこをつけて
　objWd.ActiveDocument.PrintOut( 0, 0, 1, 0, True, False, False )
でやってみると
***「Subプロシージャを呼出す時はかっこを使うことができません」とエラーが出ました。 *** ＜かっこを使うときは通常、式の右辺に来た時限定です
かっこなしに戻して
　objWd.ActiveDocument.PrintOut 0, 0, 1, 0, True, False, False
に戻しましたが同じく
「型が一致しません。objWd.ActiveDocument.PrintOut」というエラーが出てしまいます。
***ここで省略可能な値のことを思い出して、*** ＜思いついた過程は全くどうでもいい。そこは整理して質問しよう
　, , といった形でカンマだけをつけてみても結果は同じでした。
***＜質問２＞ＶＢＳからWordのPrintOitを行うにはどうすればよいのでしょうか？ *** <一応上記のとおり
***＜質問３＞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マクロじゃなくてＶＢＳで呼出す方法 (閲覧回数：1483回)
投稿者	YAMさん　
[1月16日 17:39 こうじさんの投稿]

>ＹＡＭです。
（長いので適宜省略）

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

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

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

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

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

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

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

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

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

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

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