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

エクセルについての質問です。
シートを複数選択したのち、「すべてのシート」の「同じセル」に「全く同じコメント」を入力する方法はありますか?機能としてない場合はマクロでも構いません。
マクロに関しては知識が乏しいので回答に構文を書いていただけるととても有難いです。
ご回答お待ちしております。

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

  • ご回答ありがとうございます。
    ただの文字列を入れたいのではなく、‘ コメント’の機能で入れた文章を全てのセルに反映させたいのです。
    (コメントは入れるとセルの左上に赤い三角が付くあの機能です。)
    教えていただいたやり方は最初に試したのですが、複数のシートへのコメント同時挿入は出来ませんでした…

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/05/26 18:07
  • ありがとうございます!
    コメントの複数入力できました!
    ちなみになのですが、例えば、Sheet1 A1に入っているコメントをもとに複数コピーする。というようなことは可能でしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/05/27 09:04
  • なぜこのようなことを聞くかというと、
    コメントの内容が、外部ソフトに読み取らせる為の構文のようなものを入れる予定です。
    アドインから追加した設定をもとに入力が行われているので、手入力ができないコメントなのです。

      補足日時:2020/05/27 09:09
  • なぜこのようなことを聞くかというと、
    コメントの内容が、外部ソフトに読み取らせる為の構文のようなものを入れる予定です。
    アドインから追加した設定をもとに入力が行われているので、手入力ができないコメントなのです。

      補足日時:2020/05/27 09:59
  • ご返信ありがとうございます!

    例で出していただいた、配列を指定する方がやりたいことにドンピシャだったので使ってみたのですが、sh.Range(Cel(i)).AddComment buf この部分に「実行エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」と出てしまってうまく動作しませんでした。

    もしかしたら私の手順が間違っているかもしれないので記しておきます。
    ご指摘お願いいたします。

    「A1、A2にコメントを挿入→Alt11→挿入から標準モジュール→貼り付け→F5」

    No.4の回答に寄せられた補足コメントです。 補足日時:2020/05/27 10:51
  • 特定のセルに入れたコメントをもとにコピーするのではなく、”コメント”の中の文章を入れ替えてということだったのですね。
    早とちりでした。
    やはり、特定のセルに入れたコメントを元にほかのシートの同じセルにコピーするのは難しいのですね...

      補足日時:2020/05/27 10:58
  • ありがとうございました!
    テスト動作、うまく動きました。
    詳しい解説やご指摘で非常にわかりやすかったです。
    削除の構文はこれで正しいですか?
    For文が二重になってると言われたので色々試してみたのですが、うまく動かせませんでした。

    ~省略
    For Each sh In Worksheets
    For i = 0 To UBound(Cel)
    If sh.Range(Cel(i)) <> "" Then
    j = 0
    Else
    j = 1
    End If
    On Error Resume Next ’エラーを無視
     For Each sh In Worksheets
      sh.Cells.SpecialCells(xlCellTypeComments).ClearComments
     Next
    Next sh
    End Sub

    No.5の回答に寄せられた補足コメントです。 補足日時:2020/05/27 13:03

A 回答 (6件)

#5の補足について


sh.Cells.はシート内全てを指します。 列、行の左上の角をクリックした時と同じ範囲です。
なので、個別セルをループさせる必要はありません。For~Next範囲を確認しましょう。
補足質問の場合は、下記のみでプロシージャを分けて示します
Sub Test()
  Dim sh As Worksheet
  On Error Resume Next  'エラーを無視
  For Each sh In Worksheets
   sh.Cells.SpecialCells(xlCellTypeComments).ClearComments
  Next sh
End Sub

例えば、先のコメントを削除して新しいコメントを作成したい場合は、
同じモジュール内に#5のプロシージャ、上記削除プロシージャがある場合

#5のプロシージャから呼ぶ場合
Sub Test1()
Dim buf As Variant, i As Long, j As Long
Dim sh As Worksheet, Cel

Call Test  'を追加すれば削除プログラムが実行されてから下のコードに進みます。

buf = Array(Range("A1").Text, Range("A2").Text)

全く違う実行プロシージャを作成した場合は

Sub 実行()
Call Test
Call Test1
End Sub
のように書くことも出来ます。実行プロシージャを実行すると2つのプロシージャが順に実行されます。
プロシージャ名は適時変更しましょう。

ご質問の表題からだいぶ離れたのでこの辺で、、
    • good
    • 0
この回答へのお礼

色々と聞いてしまって申し訳ありません!
親切な説明でとても助かりました。

お礼日時:2020/05/27 13:56

#4補足について


>「A1、A2にコメントを挿入→Alt11→挿入から標準モジュール→貼り付け→F5」
勘違いと言う事で、了解しました。
>特定のセルに入れたコメントを元にほかのシートの同じセルにコピーするのは難しいのですね

これは、コメント文になる buf = "コメント"の変数bufに参照式で代入すれば可能です。
Sub Test1()の
bufをVarianにします。

標準モジュールに下記をコピペF5 または、F8でステップ実行で確認してください。
Sub Test1()
Dim buf As Variant, i As Long, j As Long
Dim sh As Worksheet, Cel
buf = Array(Range("A1").Text, Range("A2").Text)
Cel = Array("C1", "C2")
For Each sh In Worksheets
For i = 0 To UBound(Cel)
If sh.Range(Cel(i)) <> "" Then
j = 0
Else
j = 1
End If
sh.Range(Cel(i)).AddComment buf(j)
Next
Next sh
End Sub

表示されているシートの A1セル、A2セルのテキストが配列bufに登録されます。
buf(0)はA1セルのテキスト buf(1)がA2セル (サンプルの場合 buf = Array(Range("A1").Text, Range("A2").Text))

実行すると各シートのC1セルC2セルにコメントが作成されます。
If sh.Range(Cel(i)) <> "" Then でA1のコメントかA2のコメントかを振り分けています。
出力コメント、出力先セルアドレスは、共に配列になっています。

A1セルに コメント を入力 A2セルに 空白です を入力 して C1セルに 何か文字などを入れ C2を空白 (又はその逆)で
事項宇するとセルの状態に合わせたコメントが作成されます。

テストのときは、すべてのシートを外して行うかデモ用のブックでシート数を少なくして検証してくださいね。

また、作成するを聞かれていますが、削除する構文もあります
Rangeオブジェクト.AddComment を Rangeオブジェクト.ClearComments で削除できると思います。

全てのシートでコメントを削除するの場合は、
On Error Resume Next ’エラーを無視
 For Each sh In Worksheets
  sh.Cells.SpecialCells(xlCellTypeComments).ClearComments
 Next

のような書き方になりますが、コメントのないセルに対してはエラーが返されますので On Error Resume Next が必須です。

アクティブシートのみなら
On Error Resume Next
 Cells.SpecialCells(xlCellTypeComments).ClearComments

参考まで
この回答への補足あり
    • good
    • 0

>例えば、Sheet1 A1に入っているコメントをもとに複数コピーする。

というようなことは可能でしょうか?
下記コードのコメント作成部分は、sh.Range(cel.Address).AddComment buf のみです。

変数が使われていますが、
sh シート  Range(cel.Address) レンジ(セルアドレス) AddComment コメント作成  buf 文字列

コメントは、1セルに対して実行する必要があるので、複数のセルに実行する場合は、Range(cel.Address) をFor + If などで
変更するように良いかと。

  Set cel = Application.InputBox(Prompt:="単一セルを選択してください。", Type:=8)
  If cel Is Nothing Then Exit Sub

を消して

For Each sh In Worksheets すべてのシートをループしている中で
セルアドレスを変更します。すべてのシートと言う条件が無いのであれば、これも不要です。

例を上げますので参考にしてください。

ループと条件で書き込み実行 A列 1,3,5行目が空白でなければ実行
Sub Test()
Dim buf As String, i As Long
Dim sh As Worksheet, Cel
  buf = "コメント"
  For Each sh In Worksheets
    For i = 1 To 5 Step 2
      If Cells(i, "A") <> "" Then
        sh.Cells(i, "A").AddComment buf  'Cells(i, 1)
      End If
    Next
  Next sh
End Sub

配列で指定 A1セルA2セル

Sub Test1()
Dim buf As String, i As Long
Dim sh As Worksheet, Cel
  buf = "コメント"
  Cel = Array("A1", "A2")
  For Each sh In Worksheets
    For i = 0 To UBound(Cel)
      sh.Range(Cel(i)).AddComment buf
    Next
  Next sh
End Sub

*全シートの場合、非表示シートがあるとエラーが返されると思います。
On Error Resume Nextなど適時対策が必要です。
この回答への補足あり
    • good
    • 0

何度もすみません。


いくら何でも、キャンセルでエラーが返されるのでは
叱られますね。
短い構文なので、書き換えます。
Sub Memo()
  Dim sh As Object
  Dim buf As String, cel As Range
  buf = InputBox("メモを入力してください")
  If buf = "" Then Exit Sub
  On Error Resume Next
  Set cel = Application.InputBox(Prompt:="単一セルを選択してください。", Type:=8)
  If cel Is Nothing Then Exit Sub
  For Each sh In Worksheets
   sh.Range(cel.Address).AddComment buf
  Next sh
End Sub
申し訳ありません。
この回答への補足あり
    • good
    • 0

#1です。


すみません。勘違いしてしまいました。。
マクロでも構いませんとのことなので、構文を
Sub Memo()
  Dim sh As Object
  Dim buf As String, cel As Range
  buf = InputBox("メモを入力してください")
  Set cel = Application.InputBox(Prompt:="単一セルを選択してください。", Type:=8)
  For Each sh In Worksheets 'すべてのシート
   sh.Range(cel.Address).AddComment buf
  Next sh
End Sub

エラー処理などは、書いておりません。
VBAでは、単一のセルアドレスに対してしかコメントを挿入できないかと思いますので
2度目のInputBoxでの選択セルは、単独セルにしてください。
また、書式についてもデフォルトです。
此の辺は、不具合が出るかもしれませんが、取敢えず。
    • good
    • 0

こういう事でしょうか?


Ctrlキーを押しながら、対象のシートタグを選択、対象セルを選択、を入力したいシート数行い入力します。
いかがでしょう。
また、いつも決まっているセルなら、参照式を入力しておき、(='シート名'!A1)参照元シートセルに入力すれば出来るかと思います。
例は、シート名 シートの A1セルに入力で式のあるセルに表示されます。
この回答への補足あり
    • good
    • 0

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