Excel VBA 今日のトリビア 従来のコメント（現在メモ aka ノート）を印刷させないためには複数の設定が必要となる

# ここで言っているコメントと言うのは2019年2月以降はNoteのことです
## 2019年2月にOffice365でスレッドコメントが追加
昭和や大正の時代から平成までExcelを使っていたぼっちゃんやお嬢ちゃんは注意しましょうね。
[スレッド形式のコメントとメモの違い](https://support.microsoft.com/ja-jp/office/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%BD%A2%E5%BC%8F%E3%81%AE%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%81%A8%E3%83%A1%E3%83%A2%E3%81%AE%E9%81%95%E3%81%84-75a51eec-4092-42ab-abf8-7669077b7be3)
## 従来のコメントはメモということになっているというのは実はウソ
表面上はメモですが、英語版をみてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/87ea72c4-0583-8537-6ebe-cc538ce033b0.png)

[The difference between threaded comments and notes](https://support.microsoft.com/en-us/office/the-difference-between-threaded-comments-and-notes-75a51eec-4092-42ab-abf8-7669077b7be3)
> Excel for Microsoft 365 has changed the way comments work. Comments are now threaded, and allow you to have discussions with other people about the data. Notes are for making notes or annotations about the data, and work like comments used to work in earlier versions of Excel.

このようにコメントはメモではなく、ノートになったのです。

### 違い 色
テーマの設定にもよるかと思いますが、スレッドコメントは紫で、ノート（メモ）は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/f01edb0f-bd10-e6ed-c005-600ad2ebf5aa.png)
### 違い スレッドコメントは使われない
現在のところMicrosoft 365で2019年2月以降のバージョンアップに限られています。このため後方互換性が全くありません。
これもあって、現在使用されている例を確認できません。
そもそもセルの中にこれを変えてねって書いてあってもそこを開いて見に行かなければ見えません。
リスクに関わらない部分であれば、メール本文に書いたほうが遥かに早いです。さらに終わったら削除しなければなりません。


## 以下ではスレッドコメントは存在しない

上記の[スレッド形式のコメントとメモの違い](https://support.microsoft.com/ja-jp/office/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%BD%A2%E5%BC%8F%E3%81%AE%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%81%A8%E3%83%A1%E3%83%A2%E3%81%AE%E9%81%95%E3%81%84-75a51eec-4092-42ab-abf8-7669077b7be3)の下をみてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/380ea0f1-0e30-8ed2-8daa-c4bb115ff07a.png)

>ノート と コメントは 、コメントとコメントの Excel for Microsoft 365 ほとんど Web 用 Excel 

<blockquote>

|機能|詳細|
|:---|:----|
|メモを作成する|<br>ノート とスレッド 化されたコメント を作成できます</br><br>は、 Excel for Microsoft 365 と Web 用 Excel</br>|
|メモを表示する|ノートは、ノートとノート の両方に 黄色の付箋 Excel for Microsoft 365 表示 Web 用 Excel|

</blockquote>

このように完全にアウトな文章となっています。このため以下のノート、メモ、コメントはすべて従来のコメントであり、英語ではNoteだったものです。スレッドコメントは最初からなかったものとして記述します。

## ところがVBAで追加するときは変わらない
しかし、Excelの命令自体はノートを追加するときはAddcommentであり、スレッドコメントを追加するときは
`Range("B4").AddCommentThreaded ("test")`
のようになります。スレッドコメントというわけですね。

# コメントを
## 表示させない
挿入（命令文では追加）するときに表示しない設定を入れます。
あとから指定して表示させないようにするのは次のように追加します。
既存のコメントがあれば削除されるので注意してください。

```vb
Range("A1").ClearComments ' 一旦コメントを消して
With Range("A1").AddComment
.Visible = True
.Text Text:="Test"
.Visible = False
End With
```

### コメントのクリア
これはセル範囲にコメントは複数入れられるという建付けになっているからです。実際は入らないのですが。。。
既存のコメントがあるとわけがわからなくなるので追加する場合には全部削除するわけです。

## 印刷させない
次に印刷させないという設定はかなり難しく、不安定になります。
よく知られているように、これらの命令形等はPrintCommunicationつまり、Printerとの通信を切って設定します。
単純にPageSetUpをみても書いていません。
マクロで記録させて初めて挙動がわかります。
[Application.PrintCommunication プロパティ (Excel)](https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.printcommunication)
> PageSetup プロパティを設定 するコードの実行を高速化するには、PrintCommunication プロパティを False に設定 します。
プロパティを設定した後、 PrintCommunication プロパティを True に設定して、キャッシュされたすべての PageSetup コマンドをコミットします。

それでもマシンに相当の負担があり、メモリが4GBだと命令をスルーされるときがあります。高速化どころではなくこうしないと動かないのが実態で、それでも動かない場合もあります。


### Sleepの設定
このためWin32 API のSleepを導入します。
PtrSafe属性をつけた方は　As LongPtrにしている例もありますが、Longでも構いません。

```vb
#If VBA7 Then
        Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
        Private Declare  Sub MSleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
#End If
```

最近はExcel2013以降であれば、
`Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)`
1行で良いという説もあります。なぜならPtrsafe属性は64bitと32bitを自動的に切り変えるためです。最後をLongPtrにしておけば（どちらにしろSleepはLongしか入らないようです）もっと確実かもしれません。


## 印刷させない設定はPrinteCommentsとPrinteNoteが必要

[XlPrintLocation 列挙 (Excel)](https://docs.microsoft.com/ja-jp/office/vba/api/excel.xlprintlocation)
シートでコメントが印刷される方法を指定します。

|名前 |値 |説明|
|:----|:-:|:-----|
|xlPrintInPlace|16|	コメントは、ワークシートに挿入された場所に印刷されます。|
|xlPrintNoComments|	-4142|	コメントは印刷されません。|
|xlPrintSheetEnd |1 |コメントは、ワークシートの末尾に印刷されます。|

### [PageSetup.PrintComments プロパティ (Excel)](https://docs.microsoft.com/ja-jp/office/vba/api/excel.pagesetup.printcomments)
シートにコメントを印刷する方法を返すか設定します。 XlPrintLocation の読み取り/書き込み。
Returns or sets the way comments are printed with the sheet. Read/write XlPrintLocation.

#### 構文
式.PrintComments
式 PageSetup オブジェクトを表す 変数。
#### 例
次の使用例は、ワークシート 1 を印刷するときに、コメントをシートの末尾に印刷します。
`Worksheets(1).PageSetup.PrintComments = xlPrintSheetEnd`

### [PageSetup.PrintNotes プロパティ (Excel)](https://docs.microsoft.com/ja-jp/office/vba/api/excel.pagesetup.printnotes)
PageSetup.PrintNotes property (Excel)
True if cell notes are printed as end notes with the sheet. Applies only to worksheets. Read/write Boolean.
True の場合、セル ノートはシートと一緒に終了ノートとして印刷されます。 ワークシートにのみ適用されます。 読み取り/書き込みが可能な Boolean です。
#### 構文
式.PrintNotes
PageSetup オブジェクトを表す 変数。
#### 注釈
PrintComments プロパティを使用して、コメントをテキスト ボックスまたは終了メモとして印刷します。
#### 例
次の使用例は、コメントを印刷しないように設定します。
`Worksheets("Sheet1").PageSetup.PrintNotes = False`

実はこの2つを設定する方法は知られていた。
[Excel VBAで印刷のマクロを作ったのですが](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13153735648)
まずこのヤフー知恵袋は

> 2015/12/18 14:21

ということでスレッドコメントが存在しないExcel2013を前提にしていることがわかります。

さらにこの回答の中で

>あとは・・・
PrintNotes プロパティ を設定することです。
例えば・・・
`Worksheets("Sheet1").PageSetup.PrintNotes = False`
とかのコードにすると良いでしょう。

さらにBA以外のところで

>PageSetup.PrintNotesプロパティでコメントを印刷するかしないか設定するようです。わたしも知りませんでした。
https://msdn.microsoft.com/JA-JP/library/office/ff822102.aspx
PrintCommentsでは印刷する位置を設定するようです。

### 2つの命令の関係
集約すると、コメント印刷するかしないかは
ワークシートごとに、
PrinteNotesで決まり、
PrintCommentsは位置を指定するだけだというのです。
### 自動露記録では確かでない
このPrinteNotesはマクロの記録では出現しません。

### スレッドコメントを考慮するともっとおかしなことになる
[Excel でコメントとメモを印刷する](https://support.microsoft.com/ja-jp/office/excel-%E3%81%A7%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%81%A8%E3%83%A1%E3%83%A2%E3%82%92%E5%8D%B0%E5%88%B7%E3%81%99%E3%82%8B-718920d5-ddeb-49f5-9460-cc1dc0b074a6)
>注: [ Excel for Microsoft 365では、シートの最後にノートを印刷する必要があります。 ただし、スレッド化されたコメントとノートの両方をシートの末尾に印刷できます。 スレッド化されたコメントとノートを印刷する方法については、前のセクションを参照 Excel for Microsoft 365。

つまりスレッドコメント自体は、メモと一緒に末尾に印刷するしかできません。
メモ（ノート、旧コメント）は画面に表示させた状態でメモだけ印刷することができます。

極めて複雑で業務の改善どころか混乱しか招かないようです。

### とりあえずコメントを印刷させないコード
アクティブシートを対象とします。

```vb
#If VBA7 Then
        Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
        Private Declare  Sub MSleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
#End If

Sub test()
Range("A1").ClearComments ' 一旦コメントを消して
With Range("A1").AddComment
.Visible = True
.Text Text:="Test"
.Visible = False
End With
Application.PrintCommunication = False ' Printerとの通信を停止
With ActiveSheet.PageSetup
Sleep 1000
If .PrintComments <> xlPrintNoComments Then
   .PrintComments = xlPrintNoComments
End If
Sleep 1000
If ActiveSheet.PageSetup.PrintNotes = True Then
   ActiveSheet.PageSetup.PrintNotes = False
End If
Sleep 1000
End With
Application.PrintCommunication = True
End Sub
```

# まとめ
## スレッドコメントは使用禁止
　以上のように、スレッドコメントは知れば知るほど複雑で、これを使えば効率化どころか混乱しか招かず、全く意味がないので使ってはいけません。そもそもエクセルを開いてチャットするよりLineを使っているのが令和ジャパンの実態でしょう。

## 何れにせよVBAの流れは定番
コメントの印刷に関わらずプリンタとの通信を切る、With ～ End With プリンタのとの通信を開始
の流れは重要です。Sleepを入れるのは面倒なので、テストして必要な分だけ入れます。

## VBAに頼らないほうが確実
と言うかPagesetupは最初から手動でやったほうが確実ということです。
しかしながら、こうしたPageSetUpはデータやコメントを入力する過程でページ設定が変わった場合に必要になります。なので完全に回避することはできません。
こうした途中でページが変わってしまった場合の回避方法は印刷するときに最後のページを印刷させないようにする方法もあります。
しかしそれには総ページ数がわからないと難しいです。
なので、面倒ですがVBAを使わず必ずプレビューで確認してから印刷するか、xps、PDFに出力し、イメージ通りか確認して印刷しましょう。