Excel (VBA)

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

 
(Windows 8.1 : Excel 2016)
セルのコメントのみのコピーをVBAで実現したい
投稿日時: 20/06/25 15:49:32
投稿者: WAKE

いつもお世話になっております。
ご教授下さい。
複数のセルに同じコメントを貼り付けるマクロボタンを作成する場合
「xlPasteComments」を使うと、コピー元のセルの値も貼付け先に
貼り付けられてしまいます。
エクセル操作であれば、コメント文章、コメント書式のみが貼付けられますが
同じ動作をVBAでは出来ないのでしょうか。
コメントのあるセルを選択後、マクロボタンを押し、コピー先セルを選んで
「ENTER」と言う操作を行いたい。
宜しくご教授下さい。

回答
投稿日時: 20/06/25 16:23:35
投稿者: 虎

試してみましたが、xlPasteCommentsでコメントのみの貼り付けできましたよ?
こちら Windows7 Excel2010です。

回答
投稿日時: 20/06/25 17:04:51
投稿者: sk

引用:
複数のセルに同じコメントを貼り付ける

引用:
コメントのあるセルを選択後、マクロボタンを押し、コピー先セルを選んで
「ENTER」と言う操作を行いたい。

(標準モジュール)
--------------------------------------------------------
Sub CopyOnlyComment()

    Dim rngSource As Excel.Range
    Dim rngDestination As Excel.Range
    
    If Not (TypeOf Selection Is Excel.Range) Then
        Exit Sub
    End If
    
    Set rngSource = Selection
    
    On Error Resume Next
    Set rngDestination = Application.InputBox(Prompt:="コメントの貼り付け先を選択して下さい。", _
                                              Type:=8)
    If Err.Number <> 0 Then
        Set rngSource = Nothing
        Exit Sub
    End If
    On Error GoTo 0
                                                 
    If Not Intersect(rngSource, rngDestination) Is Nothing Then
        Set rngDestination = Nothing
        Set rngSource = Nothing
        MsgBox "コピー元のセル範囲が貼り付け先のセル範囲に含まれています。", _
               vbExclamation, _
               "エラー"
        Exit Sub
    End If
    
    rngSource.Copy
    rngDestination.PasteSpecial Paste:=xlPasteComments
    Application.CutCopyMode = False
    
    Set rngDestination = Nothing
    Set rngSource = Nothing
    
End Sub
--------------------------------------------------------
 
以上のような処理を実行したい、ということでしょうか。

投稿日時: 20/06/25 17:28:37
投稿者: WAKE

虎様 sk様 ありがとうございます。
私のエクセル不具合があるのかもしれませんね。
自動実行などでの操作ではなく
単純にクリップボードにコピーして、形式を選択
してコメント文、書式を貼り付けたいだけなのです。
 
Selection.Copy
Selection.PasteSpecial (xlPasteComments)
 
ですが、セル内容もコピーされてしまいます。
ちなみに、フィルハンドでは、コメントはコピーされなくて
正解ですか。
申し訳ありません。

回答
投稿日時: 20/06/25 17:38:12
投稿者: sk

引用:
Selection.Copy
Selection.PasteSpecial (xlPasteComments)

コピーしたセル範囲と全く同じセル範囲
コメントのみ貼り付けているのですから、
当然の結果です(実質的に何も変わっていない)。

回答
投稿日時: 20/06/25 18:14:06
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

Selection.Copy
Selection.PasteSpecial (xlPasteComments)

↑は実際のコードですか?
 
説明している内容と
コードが整合していないような気がします。
 
実際のコードを掲示しましょう。

回答
投稿日時: 20/06/25 23:42:04
投稿者: simple

既に指摘頂いているように、
コメント付きのセルをコピーしたあとで、別のセルに動かし、

Sub test()
    Selection.PasteSpecial xlPasteComments
End Sub

を実行すると、そのセルにコメントだけが貼り付きますよ。
 
# このところ、ExcelのVersionによって動作が変わる事例が見受けられますが、
# この件は問題無さそうに思います。2010,2019でも同じ動作です。
# (2016は2019に近いので、直接確認していないが、同じ動作でしょう。)
 
ちょっとした操作ミスをしているんじゃないですか?よく確認されては?

投稿日時: 20/06/26 08:17:22
投稿者: WAKE

WinArrow様 ありがとうございます。
実際のコードは
Sub コメントのみコピー()
    Selection.Copy
    Selection.PasteSpecial (xlPasteComments)
End Sub
です。
Selection.PasteSpecial (xlPasteComments)は
Selection.PasteSpecial Paste:=xlPasteComments
でもいですが、同じ結果でした。
エクセル2010でも同じ結果でした。
 
simple様ありがとうございます。
文字入り、コメント付きのセルを[ Ctrl ]+[ C ]でコピーし
任意セル選択して
Sub test()
    Selection.PasteSpecial xlPasteComments
End Sub
を実行すると
実行時エラー 1004
ramgeクラスのpastspecialメソッドが失敗しました。
のデバッグ選択ダイアログ画面に遷移しました。
 
初心者です。皆さまよろしくお願いします。
 

投稿日時: 20/06/26 08:41:24
投稿者: WAKE

すみません。動作説明が不十分だったかもしれません。
「コメントのあるセルを選択後、マクロボタンを押し、コピー先セルを選んで
「ENTER」と言う操作を行いたい。」ではなく
「コメントのあるセルを選択後、マクロボタンを押し、貼付け先セルを選んで
「ENTER」と言う操作を行いたい。
です。よろしくお願いします。

投稿日時: 20/06/26 09:39:38
投稿者: WAKE

sk様
あなた様のコードを実行しました。
うまく、コメントのみ同時に複数セルに貼り付きました。
実現できました。ありがとうございます。
こんなに複雑なコードにしないと実現しないのでしょうか。
マクロ記録では、
range選択→ selection.copy→ コメントを形式選択して
指定rangeに貼り付け
という動作が記録されまますが、このまま、range選択と指定range
を消しただけのコードでは、簡単に動作しないということですか。
Set rngSource = Selection の所はなぜ必要ですか。
rngDestinationにセルアドレスを指定して
rngSource.Copy
rngDestination.PasteSpecial Paste:=xlPasteComments
としていますが
Selection.Copy で選択セルをクリップボードにコピーし
 
次に選択したセルにコメントだけを貼り付ける
Selection.PasteSpecial Paste:=xlPasteComments
と言う単純なことではrange選択の規定か何かに合致しないのでだめなのですか。
ご教授下さい。

回答
投稿日時: 20/06/26 11:29:18
投稿者: sk

引用:
マクロ記録では、
range選択→ selection.copy→ コメントを形式選択して
指定rangeに貼り付け
という動作が記録されまますが

それは例えば以下のようなコードですよね。
 
([マクロの記録]機能で生成されたプロシージャ)
------------------------------------------------------------------------
Sub Macro1()
'
' Macro1 Macro
'
 
'
    Selection.Copy
    Range("B1").Select
    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
End Sub
------------------------------------------------------------------------
 
引用:
このまま、range選択と指定rangeを消しただけのコードでは、
簡単に動作しないということですか。

Selection は「アクティブウィンドウで現在選択されているオブジェクト」
セル範囲だけに限らない)への参照を返すプロパティです。
 
「別のオブジェクトの選択」という操作が全く行なわれなければ、
常に同一のオブジェクト(この場合はセル範囲)への参照を返すことになります。
 
上記のマクロが成り立っているのは、「選択中のセル範囲のコピー」と
「選択中のセル範囲へのコメントの貼り付け」の間に
「別のセル範囲の選択」という命令が呼び出されていることによって、
Selection プロパティによって返されているセル範囲が変更されているからです。
 
そこの部分のコードを削ってしまえば、当然選択範囲は全く動かない
( Selection プロパティによって参照されるセル範囲も変化しない)ので、
「選択中のセル範囲(のコメント)をコピーし、選択中の(同じ)セル範囲へ貼り付ける」
という無意味な操作が実行されることになります。
 
引用:
Set rngSource = Selection の所はなぜ必要ですか。

要るか要らないかで言えば、少なくともこの機能の実装に関しては
「どっちでも良い」です。
「コピー元となるセル範囲」と「貼り付け先となるセル範囲」を
明確に区別するために使用しています。
 
また前述の通り、Selection プロパティは選択範囲が変更された都度
異なるセル範囲への参照を返しますので、選択範囲が変更される前に
その時点における選択中のセル範囲への参照を確保するという意味もあります。
 
( Range オブジェクト型の変数と Selection プロパティの使用例)
------------------------------------------------------------------------
Private Sub Macro2()
 
    Dim rngBefore As Excel.Range
    Dim rngAfter As Excel.Range
     
    Range("A1").Select
    Set rngBefore = Selection
    Range("B1").Select
    Set rngAfter = Selection
     
    Debug.Print "現在の選択範囲のアドレス:" & Selection.Address(False, False)
    Debug.Print "rngBefore が参照するセル範囲のアドレス:" & rngBefore.Address(False, False)
    Debug.Print "rngAfter が参照するセル範囲のアドレス:" & rngAfter.Address(False, False)
     
End Sub
------------------------------------------------------------------------
 
引用:
rngDestinationにセルアドレスを指定して

引用:
Set rngDestination = Application.InputBox(Prompt:="コメントの貼り付け先を選択して下さい。", _
                                          Type:=8)

「アドレスを指定している」というより、InputBox メソッドによって返された
(そのアドレスが示す)セル範囲への参照を rngDestination に渡し、
そのセル範囲への参照を確保するというのが、内部処理上における正しい表現です。

投稿日時: 20/06/26 13:19:18
投稿者: WAKE

sk様、皆さま
ご教授ありがとうございました。
詳しい解説ありがとうございました。
selectionについて、かなり誤解がありました。
selection.copy後、コピーセルがアクティブ表示になり
別セルを選択でき、コメントが複写できたので
単純に出来ると思い込んでしまいました。
selectionは、最初にセルを選択していた状態を
保持したままと言う事で、当初指摘されていた
Selection.Copy
Selection.PasteSpecial (xlPasteComments)
について少し解った様に思います。
試しに
Selection.Copy
Selection.PasteSpecial (xlPasteComments)
selection.value=""
とすると、コピーセルの値が消えたので
漠然とですがわかった様に思います。
宜しければ、sk様の作成したコードを使わせて頂きます。
皆さまありがとうございました。