none
【Excel VBA】Application.CutCopyMode プロパティの挙動について質問と相談 RRS feed

  • 質問

  • お世話になります。

    Excelにおける、Application.CutCopyMode プロパティの挙動について質問と相談になります。

    マクロを組み込んだBook(以下ブックA)があり、ワークシート上の任意の数のセルを手動でコピーし、
    マクロを組み込んでいない、新しく立ち上げたBook(以下ブックB)にペーストしたのですが、ペーストできませんでした。

    ブックAにはワークブックが非アクティブ時処理として、ドラッグ&ドロップの制限解除を実行していますが、
    どうもこの際にApplication.CutCopyModeがFalseとなることがわかりました。

    【質問と相談】

    1.Application.CutCopyModeをFalseにしていないのに、Application.CellDragAndDropを制御した

      だけで、Application.CutCopyModeがFalseとなるのは仕様でしょうか?バグでしょうか?

    2.Workbook_Deactivate時の処理は残したまま
      上記の操作でブックBにペーストを可能にする方法を教えてください。


    '---ワークブック非アクティブ処理---
    Private Sub Workbook_Deactivate()
       
        Debug.Print "コピーモード:" & Application.CutCopyMode  '...1 Trueが返る
       
        'ドラッグ&ドロップの制限解除
        Application.CellDragAndDrop = True

        Debug.Print "コピーモード:" & Application.CutCopyMode  '...0 Falseが返る
       
    End Sub
    '--------------------


    ---システム環境---
    OS:Windows7 64bit
    Office2013 32bit

    2015年7月13日 8:37

回答

  • Application.CutCopyModeがFalseとなるのは仕様でしょうか?バグでしょうか?

    クリップボード操作にもドラッグアンドドロップにも、そのデータ交換には「IDataObject」というインターフェイスが共通して使われていますので、機能的に繋がりはありそうですね。ただ、ここは公式回答を得るための場では無いので、仕様か不具合かは誰にも答えられないでしょう。

    上記の操作でブックBにペーストを可能にする方法を教えてください。

    コピー準備中の状態に留めておくのではなく、実際にクリップボードに送り込んでしまうという手があります。

    Option Explicit
    Private dataObj As MSForms.DataObject
    Private Sub Workbook_Deactivate()
        If Application.CutCopyMode <> 0& Then
            'クリップボードの中身を取り出しておく
            Set dataObj = New MSForms.DataObject
            dataObj.GetFromClipboard
        Else
            Set dataObj = Nothing
        End If
       
        
       'ドラッグ&ドロップの制限解除
        Application.CellDragAndDrop = True
        
        If Not dataObj Is Nothing Then
            'クリップボードに再送
            dataObj.PutInClipboard
        End If
    End Sub

    ※注: Cut 操作であったとしても、Copy 相当の動作になります。

    • 回答としてマーク snipe_9 2015年7月15日 4:26
    2015年7月13日 10:53

すべての返信

  • Application.CutCopyModeがFalseとなるのは仕様でしょうか?バグでしょうか?

    クリップボード操作にもドラッグアンドドロップにも、そのデータ交換には「IDataObject」というインターフェイスが共通して使われていますので、機能的に繋がりはありそうですね。ただ、ここは公式回答を得るための場では無いので、仕様か不具合かは誰にも答えられないでしょう。

    上記の操作でブックBにペーストを可能にする方法を教えてください。

    コピー準備中の状態に留めておくのではなく、実際にクリップボードに送り込んでしまうという手があります。

    Option Explicit
    Private dataObj As MSForms.DataObject
    Private Sub Workbook_Deactivate()
        If Application.CutCopyMode <> 0& Then
            'クリップボードの中身を取り出しておく
            Set dataObj = New MSForms.DataObject
            dataObj.GetFromClipboard
        Else
            Set dataObj = Nothing
        End If
       
        
       'ドラッグ&ドロップの制限解除
        Application.CellDragAndDrop = True
        
        If Not dataObj Is Nothing Then
            'クリップボードに再送
            dataObj.PutInClipboard
        End If
    End Sub

    ※注: Cut 操作であったとしても、Copy 相当の動作になります。

    • 回答としてマーク snipe_9 2015年7月15日 4:26
    2015年7月13日 10:53
  • 魔界の仮面弁士さま

    返信ありがとうございます。

    まず質問の場所と内容に対するご指摘ありがとうございます。

    よく本フォーラムについて調べずMicrosoftコミュニティにて促されるまま書き込んでしまいました。。。

    さて、ご提案いただいたコードについてですが、まさに私の意図通りに動作いたしました!

    ありがとうございます。IDataObjectについては存在自体知らず、勉強になりました。

    これから理解を深めようと思います。

    最後にCut操作であってもCopy相当の動作になる点についても、今開発中のプログラムとしてはむしろ都合がよかったです。

    2015年7月15日 4:26