Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
選択中のコメントが設定されているセルを取得したい
投稿日時: 22/11/25 14:08:42
投稿者: ひろと

セルに設定したコメントを選択中のSelection.TopLeftCellは、そのコメントを図形と考えたときに左上の頂点が属しているセルを取得しますが、コメントがどこにあってもそのコメントが設定されているセルを取得する方法はありますでしょうか?
 
具体的には、A1セルにコメントを設定中としたときに以下の2ケースともでA1を取得したいです。
ケース1:コメント左上頂点がB1セルにあるとき
 →Selection.TopLeftCellはA1ではなくB1を取得してしまう(A1を取得したい)
ケース2:コメント左上頂点がA1セルにあるとき
 →Selection.TopLeftCellはA1を取得出来る
 
A1が取得できれば、方法はSelection.TopLeftCellでなくても全く問題ありません。
以上、よろしくお願い致します。

回答
投稿日時: 22/11/25 15:15:16
投稿者: Suzu

選択中のコメント から セルを取得するのは難しいので
 
Cells.SpecialCells(xlCellTypeComments) のコレクションから、
当該 コメントと Nameプロパティー が同じ コメントを持つ
Range を走査してはどうでしょうか。

回答
投稿日時: 22/11/25 22:44:26
投稿者: WinArrow
投稿者のウェブサイトに移動

>コメントがどこにあってもそのコメントが設定されているセルを取得する方法はありますでしょうか?
一般機能のなかに「ジャンプ」というコマンドがあります。
「ホーム」タブの一番右に「検索」「置換」「ジャンプ」・・・というボタンがあります。
「ジャンプ」をクリック→ダイアログ表示→左下の「セル選択」ボタンクリック→
別のダイアログ→「コメント」クリック・・・コメントが設定されている全セルが選択できます。
   
この操作をマウロの記録でコード作成します。
これをアレンジすれば、目的のセルを探すことが可能です。
 

回答
投稿日時: 22/11/26 06:33:53
投稿者: simple

 選択中のコメントとか言われていて、シチュエーションがピンと来ないのですが、
 コメント内の文字列を元に、検索してヒットしたセルのアドレスを得たいということですか?
  
 既に指摘がありましたように、
 コメント内容から、簡単にセルアドレスを取得できるような直接的なプロパティはないので、
 以下のようなコードを参考に、全部のコメントを調べていくしかありません。
 参考にしてください。(これをそのまま使うというわけではないので注意してください)
  

Sub test()
    Dim r As Range
    
    For Each r In Cells.SpecialCells(xlCellTypeComments)
        Debug.Print r.Address                               'そのセルのアドレス
        Debug.Print r.Comment.Shape.OLEFormat.Object.Text   'メモ内容
    Next
End Sub

回答
投稿日時: 22/11/26 16:00:51
投稿者: WinArrow
投稿者のウェブサイトに移動

>コメントがどこにあってもそのコメントが設定されているセルを取得する方法はありますでしょうか?
コメントがどこにあっても
という意味がようやく理解できました。
  
コメントは「テキストボックス」として認識されます。
ですから、テキストボックスの親を取得すると
設定時には、セルを指定したのに、ワークシートになってしまいます。
 
対策として
一旦、コメント(テキストボックス)に自動設定された名前を変数に記憶し、
ワークシート内の全コメントを検査し、設定されている名前と照合します。
  
参考コード

Sub test()

Dim CMTName As String
Dim CMTX As Long

    CMTName = Selection.Name
  
    With ActiveSheet
        If .Comments.Count > 0 Then
            For CMTX = 1 To .Comments.Count
                If .Comments(CMTX).Shape.Name = CMTName Then
                    Debug.Print "Cell_Address:" & .Comments(CMTX).Parent.Address
                    Debug.Print "Shape_Address:" & .Comments(CMTX).Shape.TopLeftCell.Address
                    Exit For
                End If
            Next
        End If
    End With
End Sub

投稿日時: 22/11/28 10:12:23
投稿者: ひろと

皆様
色々とアドバイスをありがとうございます。
 
使う目的は、コメント機能周りをショートカットで楽する為です。
コメント機能をメモ代わりによく使うので以下のように設定しているのですが
・コメントの無いセル
 →Shift+F2で新規空白コメントを挿入し、コメントオブジェクトを選択した状態にする。
・コメントがあり、そのコメントを表示中のセル
 →Shift+F2でコメントを非表示にする。
  Shift+F3でコメントを削除する。
・コメントがあり、そのコメントを非表示中のセル
 →Shift+F2でコメントを表示し、コメントオブジェクトを選択した状態にする
  (マウス操作なしですぐに編集したいからコメントを選択する)。
  Shift+F3でコメントを削除する。
 
コメントを非表示中のセルにShift+F2→不要コメントと分かったからShift+F3で削除
としたくても選択中の対象がセルではなくコメントのため上手くいかず、いいものを思いつけなかったので質問しました。
(TypeNameでRangeかTextBoxで分けようとしましたが、誤操作で他のテキストボックスを消したくないので…)
 
出来上がったコードを備忘録や同じ悩みを持つ人の為に後で貼り付けようと思います。
ありがとうございました。

回答
投稿日時: 22/11/28 13:15:37
投稿者: simple

引用:
コメントを非表示中のセルにShift+F2→不要コメントと分かったからShift+F3で削除
としたくても選択中の対象がセルではなくコメントのため上手くいかず、いいものを思いつけなかったので質問しました。

確認ですが、そもそも、コメントの編集中は、セルの編集中と同じく、
マクロは使えないと思いますが、そこはどのように整理されているのですか?
何かタイマーとかそういったことで回避するとかですか?
 
普通に、編集状態から脱してコメントオブジェクトを選択して、deleteではまずいのですか?
 
「コメントオブジェクトを選択」が手間だというのであれば、
もともと特定のセル上でShift+F2を押したわけですから、まして見えているわけですから、
そのセルにカーソルを戻す手間を惜しまず、
Sub test1()
    ActiveCell.Comment.Delete
End Sub
Sub test2()
    Selection.Delete
End Sub
とかのマクロ(に関連付けたショートカット)を実行するのが自然ではないですか?

投稿日時: 22/11/28 13:17:10
投稿者: ひろと

simple様
 
コメントの編集中はマクロは使えない
→今試してみてマクロが使えないことを初めて知りました。
セルと違って、コメント選択状態とコメント編集状態ではボックス選択中の8つの□が出ているという点で見た目に違いが無かったので全然知らなかったです。
 
とはいえShift+F3でまとめたい気持ちがあるので、ESC→Deleteの機能を持たせようかなと思います。

回答
投稿日時: 22/11/28 20:54:11
投稿者: simple

以下のマクロを SHIFT+F3に割り当てれば、よいと思います。

Sub test()
    Application.CommandBars.ExecuteMso "ReviewDeleteComment"
End Sub

(1)コメントのあるセルにカーソルがある場合
(2)SHIFT+F2でコメント編集モードの場合は、いったんEscで編集モードを抜けてから
のいずれの場合も、該当するコメントを削除できます。
 
ただし、「いったんEscで編集モードを抜けてから」というのを
他のユーザーや将来の自分が覚えていられるか、ということはあると思います。
("コメントのあるセルを選択して"、というのがそんなに高価な手作業とも思えませんが。)

投稿日時: 22/11/29 12:08:04
投稿者: ひろと

simple様
 
追加のアドバイスを色々とありがとうございます。
 
もともと特定のセル上でShift+F2を押したわけですから、まして見えているわけですから、
そのセルにカーソルを戻す手間を惜しまず、
→私が超ズボラなことが原因ですが、ご指摘の通り単一セルに使う時もあれば、ガーッとセル範囲をマウスで選択してShift+F3で削除したい時もあるのに両方を同じ操作で済ましたい思いがあります。
 
大元が、リボンのコメント削除ボタンみたいなことがやりたいなという思いがあったので
ExecuteMso "ReviewDeleteComment"
がとてもありがたいです(アクセスツールバーをOPまで登録済みでもう増やしたくない気持ちもあります)。
直接呼び出せるということを知って大変勉強になりました。
 
ありがとうございました!

回答
投稿日時: 22/11/29 15:15:51
投稿者: simple

引用:
もともと特定のセル上でShift+F2を押したわけですから、まして見えているわけですから、
そのセルにカーソルを戻す手間を惜しまず、
→私が超ズボラなことが原因ですが、ご指摘の通り単一セルに使う時もあれば、ガーッとセル範囲をマウスで選択してShift+F3で削除したい時もあるのに両方を同じ操作で済ましたい思いがあります。
ちょっと理解しかねます。
 
複数の場合と同じようにするなら、
単一セルでもマウスで元のセルを選択するのが整合的ではないんですか?
私の案となんら変わらないじゃないですか?

回答
投稿日時: 22/11/29 16:08:41
投稿者: simple

ついでに参考情報。
"ReviewDeleteComment"などのidの探し方については、下記を参照してください。
「マクロで実行したいコマンドのIDを調べる簡単な方法」
https://www.ka-net.org/blog/?p=4438

回答
投稿日時: 22/11/30 09:09:37
投稿者: Suzu

結局、

引用:
ただし、「いったんEscで編集モードを抜けてから」

を必要とする状態なのであれば、
 
その状態(コメントの枠であるテキストボックスが選択された状態)なのですから、
そこで、DELETE で済む話になります。
 
セルを選択した状態(Shift+F2 でコメントを挿入し Esc 2回)からであれば、
 
・Alt → R → D で良いと思います。
または、
・アプリケーションキー(右側の Alt と Ctr の間にある)→ M
で良いと思います。
Shift + F3 に登録する必要 がありますでしょうか?
 
 
------------------------------------------------------------------------------------
以下 私見です。
 
ショートカットキー に 個別マクロを登録したいと思うほど コメントを利用する状態なのであれば
そもそも、コメント自体を使用せず、隣のセル等にコメントを入れる様にした方が合理的だと思います。
表示したくなければ、列を非表示にする や、 セル背景色とフォントを同じ色にする等で対応します。
大きさが変わるとか、配置位置を調整する必要があるとか、逆に面倒と感じてしまいます。
 
 
クイックアクセスツールバーがいっぱい との事ですが、
面倒なのは、キーボードから手を放し、マウスに持ち替える方が面倒です。
キーボード操作で済む操作であればキーボード操作で済ませたいです。
 
クイックアクセスツールバー も Alt + 数字 で操作はできますが、
ショートカットキーが 比較的 少ない手数で済むものまで登録するのは
他の よく使うけど 手数が多いものを登録できなくなったり、Alt+数字 の数字の桁が多くなるので
もったいないと思ってしまいます。
 
「マウスに持ち替える」という操作について見直した方が効率的だと考えています。

投稿日時: 22/11/30 16:31:09
投稿者: ひろと

引用:
複数の場合と同じようにするなら、
単一セルでもマウスで元のセルを選択するのが整合的ではないんですか?
私の案となんら変わらないじゃないですか?

整合性の有無で言えば、simpleさんの仰る通りです。ただ、私の単一セルの選択方法が、
選択したいセルが今選択中のセルから
・近いとき→矢印キーを使う
・遠いとき→マウスで選択するが、選択直後に文字入力などの視覚的な邪魔になるのですぐに遠くに離す
またSEの方なら嫌うであろうエクセルを文書ソフトとしても使う非SE業界の為、上下で全く幅の違う表を並べても収まり良くなるように、常時セル幅を1にしています。余談ですが当然セル結合もします。
なので、常にマウスカーソルが編集中のセルの近傍には無いので、「そのセルにカーソルを戻す手間」は省きたいことです(加えてマウスカーソルを探す手間も省きたいので、非使用中でも画面上のどこかで常に見えていてほしいです)。
 
simpleさん目線だと面倒だなと思うかもしれませんが、人それぞれ・非SEなんてこんなものということで目を瞑って頂ければ。

投稿日時: 22/11/30 17:03:09
投稿者: ひろと

Suzu様

引用:
Shift + F3 に登録する必要 がありますでしょうか?

→要不要で言うと不要ですが、仕事の仕方がエクセルで文書を作成しながら分からないことがあればネット検索し、pdfを確認し、上司から修正食らう前のバージョンのエクセル(文書)から文字列をコピペし、これらファイルを開くためにフォルダの操作もし、…といった感じなので比較的右手はマウスにいる時間が長いので左手で済ましたい思いがあります(カーソルはsimpleさんへのお礼に記載した通り、どこかその辺にあります)。
Suzuさんの私見と正反対ですが、文字入力の為に右手をマウスからキーボードに移動させているイメージです。
 
クイックアクセスツールバーについてもキー操作は左手でカバーできる4ぐらいまでで、後は例えば印刷用紙サイズ+余白サイズ変更等の頻繁に使うわけではないが、いざ使う時に操作手数が多い・覚えておく数値が多いようなものをマクロ化して登録しています。
 
皆様と比較するとエクセル力は低いと思いますが、これでも部署内では断トツなので、他人に数値根拠や考え方を説明する為には、コメントに残して常に見せておくのが、エクセルの使い方といった業務外の質問を防止できるので、業務効率が良いと考えています。
個人的にはSuzuさんの考え方に近いのですが、業務上やむなしといった感じです。
 
半分以上関係ない話ですみません。
 
尚、Shift+F2のコメント挿入は普通のではなくて以下のマクロに上書きしています。
EnableEventsが要るのかは理解していません。
Sub コメント()
Application.EnableEvents = False
 With ActiveCell
  If TypeName(.Comment) <> "Comment" Then
   .AddComment
   .Comment.Shape.TextFrame.Characters.Font.Name = "MS 明朝"
   .Comment.Shape.TextFrame.Characters.Font.Size = 10
   .Comment.Shape.Placement = xlMoveAndSize
   .Comment.Visible = True
   .Comment.Shape.TextFrame.AutoSize = True
   .Comment.Shape.Select
   Application.EnableEvents = True
   Exit Sub
  End If
  
  Select Case .Comment.Visible
   Case True
    .Comment.Visible = False
   Case False
    .Comment.Visible = True
    .Comment.Shape.Select True
  End Select
 End With
Application.EnableEvents = True
End Sub

回答
投稿日時: 22/11/30 23:06:34
投稿者: simple

>目を瞑って頂ければ。
と言われてもねえ。ご自分の好きなようにされたらよいのでは?
 
それで、現時点で何が問題になっているんですか?
解決したのなら閉じてもらえばと思いますし、
問題が残っているなら、それを明確にしてください。

回答
投稿日時: 22/12/01 08:36:41
投稿者: Suzu

引用:
右手はマウスにいる時間が長いので左手で済ましたい思いがあります

 
であれば、
マウスのみの操作 右クリック コメントの削除 で 良いと思います。

投稿日時: 22/12/02 09:21:29
投稿者: ひろと

皆様
 
どうもありがとうございました。