[[20170322021114]] 『pasteを実行するには』(yama) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『pasteを実行するには』(yama)

マクロ記録で得られたデータを参考に下部のように
作成して見たのですが★部分の文を御教授ください。
宜しくお願いします。
他のアプリケーションから貼り付けのみを実行
Sub Macro1()
'

    Range("A1").Select
    ActiveSheet.PasteSpecial Format:="テキスト", Link:=False, DisplayAsIcon:= _
        False
    Range("A1").Select
End Sub

以下のようにif文で作成したい
Sub 貼り付け()
  IF ★ then

    Range("A1").Select
    ActiveSheet.PasteSpecial Format:="テキスト", Link:=False, DisplayAsIcon:= _
        False
    Else
        MsgBox "貼付け対象がありません。コピーしてからやり直してください。", vbExclamation
    End If

< 使用 Excel:Excel2016、使用 OS:Windows10 >


Application.CutCopyMode プロパティをヘルプで調べてみてください。

(γ) 2017/03/22(水) 02:33


こんな感じなんでしょうか?
  '現在のコピーモードを出力する
  Select Case Application.CutCopyMode
  Case Is = False
     Range("A1").Select
    ActiveSheet.PasteSpecial Format:="テキスト", Link:=False, DisplayAsIcon:=False
  Case Is = XlCutCopyMode.xlCopy
     MsgBox ("コピーモード")
  Case Is = XlCutCopyMode.xlCut
     MsgBox ("切り取りモード")
  End Select
(yama) 2017/03/22(水) 02:56

 そうですね。
 これでも、問題なく実行されますけど、

 ・Case 文、Case Is と記述しなくとも、ふつうに、さらっと書くことができます。
 ・また、定数ですけど、もちろん 定数クラス名.定数名 でもいいのですが、単純に定数名だけでOKです。
 ・MsgBox の引数指定、結果オーライですが、実は(  ) で囲むのは【間違った記述】です。 

 Sub Sample()
    Select Case Application.CutCopyMode
        Case False
            Range("A1").Select
            ActiveSheet.PasteSpecial Format:="テキスト", Link:=False, DisplayAsIcon:=False
        Case xlCopy
            MsgBox "コピーモード"
        Case xlCut
            MsgBox "切り取りモード"
    End Select
 End Sub

(β) 2017/03/22(水) 05:12


失礼しました。
見逃していましたが、
>他のアプリケーションから貼り付けのみを実行
ですか。
 
他のアプリからコピーの場合は、
Aplication.CutCopyMode は常に0を返すようです。
 
そうであれば、
  Application.CutCopyMode = False 
かつ
  CB = Application.ClipboardFormats
  If CB(1) <> True Then
などと判定するんでしょうか。    
 
http://officetanaka.net/excel/vba/tips/tips20.htm
を参照ください。

そのほかAPIを使う手もあるかもしれません。

(γ) 2017/03/22(水) 05:45


 おはようございます。

 他アプリからの貼付けなら、γさんの言われている通り ClipboardFormats で確認したら良いですが、
 中身がテキストなら、0の時だけになると思います。(他にもあったらすいません)
 CutCopyMode がコピーかカットモードでも0になるので以下のように判断して下さい。

 If Application.ClipboardFormats(1) = 0 And  Application.CutCopyMode = False Then

 γさん

 True以外にすると画像とかも対象になってしまいますね。

 yamaさん βさん

 ご提示のコードではクリップボードが空でモードがFALSEの時はエラーになりますよ。

(sy) 2017/03/22(水) 07:34


 γさん

 すいません。
 True以外だから0のみOKになるんでした。
 失礼しました。

(sy) 2017/03/22(水) 07:48


 > ご提示のコードではクリップボードが空でモードがFALSEの時はエラーになりますよ。

 そうですね。γさんも指摘しておられるように クリップボードの中身の確認は
 必須ですね。

 ロジックというより、コード記述方式についてコメントしたつもりでした。

(β) 2017/03/22(水) 08:16


(γ)さん
(β)さん
(sy)さん
朝早くからアドバイスありがとうございます。
以下のように書きテストしてみたのですが
コピーモードが解除されていないようです。
どこか違いますか?
判定お願いします。

Sub harituke()

  Dim CB As Variant
    Application.CutCopyMode = False
    CB = Application.ClipboardFormats
      If CB(1) <> True Then
         Range("A1").Select
          ActiveSheet.PasteSpecial Format:="テキスト", Link:=False, DisplayAsIcon:=False
      Else
        MsgBox "貼付け対象がありません。コピーしてからやり直してください。", vbExclamation
      End If
    '切り取りモードまたはコピーモードを解除
    Application.CutCopyMode = True
End Sub
(yama) 2017/03/22(水) 12:01

 >コピーモードが解除されていないようです。 

 解除は最初のほうにある Application.CutCopyMode = False で行っているわけですが
 マクロ終了直前の Application.CutCopyMode = True
 これは、何をしようとして記述してあるのですか?

( β) 2017/03/22(水) 12:55


( β)さん
ありがとうございます。
ネット検索でコピーモードの解除と出ていたので書いてみたのですが・・・
    '切り取りモードまたはコピーモードを解除
    Application.CutCopyMode = True
やはり違いますか?
クリップボードを空の状態にしたかったのですが・・・
よろしくお願いします。

(yama) 2017/03/22(水) 13:08


 >ネット検索でコピーモードの解除と出ていたので書いてみたのですが・・・ 

 どこに書いてあったのでしょうね?
 たとえば MSDN内の

https://msdn.microsoft.com/ja-jp/library/office/ff839532(v=office.15).aspx

 ここには、 

 設定値 内容
 False 切り取りモードまたはコピー モードを解除し、点滅している枠線を取り除きます。
 True  切り取りモードまたはコピー モードを開始し、点滅している枠線を表示します。

 と書いてあります。

 ところで、

 >コピーモードが解除されていないようです。

 なぜ、そう判断されたのですか?
 コピー元の領域の枠線が残っているということですか?

( β) 2017/03/22(水) 13:24


 もしや、officeクリップボードの中身を消したいということでは。
 左側に出るクリップボードの中身を消したいということだったりしますか?
(2Win) 2017/03/22(水) 13:37

(2Win)さん
>もしや、officeクリップボードの中身を消したいということでは。
そうです。これはマクロでは無理ですか?

( β)さん
ありがとうございます。
わたしが勘違いしているみたいです。
(yama) 2017/03/22(水) 14:55


 VBAでコード一文では無理っぽいです。
 下記で操作するコードが記載されています。

 http://www.ka-net.org/office/of56.html

 無理ではないけど手間が掛かってますね。

(2Win) 2017/03/22(水) 15:34


 要件を誤解しているかもしれませんが

http://www7b.biglobe.ne.jp/~whitetiger/ex/ex2002092.html

 API利用はかわりませんが、↑に、もう少しシンプルなコード例が紹介されています。

(β) 2017/03/22(水) 17:47


 こんなのでも行けるんじゃないかと、

 Range("A1").Copy
 Application.CutCopyMode = False

(sy) 2017/03/22(水) 19:45


 To syさん

 これだと【別アプリ】でクリップボードに格納されたものが、そのまま クリップボードに表示されますね。

(β) 2017/03/22(水) 20:34


質問者さん wrote:
> 以下のように書きテストしてみたのですが
> コピーモードが解除されていないようです。
 
今浦島状態の私です。
 
質問は、"コピーされているかどうかの判定"の話ではなかったのですか?
いつの間に当初の質問そっちのけで別の話になっているのですか?
 IF ★ then に入れるものとして適切だったのですか。
最初の質問が解決できたのかきちんとコメントしてください。

(γ) 2017/03/22(水) 20:43


皆さん貴重なアドバイスありがとうございます。
投稿者さんの流れにについて行けそうもありません

以下のようにしましたが自信が無い状態です。
再判定よろしくお願いします。。
Sub 貼付()

  Dim CB As Variant
    Application.CutCopyMode = False
    CB = Application.ClipboardFormats
      If CB(1) <> True Then
         Range("A1").Select
          ActiveSheet.PasteSpecial Format:="テキスト", Link:=False, DisplayAsIcon:=False
      Else
        MsgBox "貼付け対象がありません。コピーしてからやり直してください。", vbExclamation
      End If
    '切り取りモードまたはコピーモードを解除
    Application.CutCopyMode = False
    'クリップボードを空に!
    Call ClearClipboard
End Sub
(yama) 2017/03/22(水) 20:55

 βさん

 >これだと【別アプリ】でクリップボードに格納されたものが、そのまま クリップボードに表示されますね。
 ?
 (β) 2017/03/22(水) 17:47 のAPIと同じように右クリックでの貼付けは出来なくなりますよ。

 それともクリップボードの「すべてクリア」と同じ事がしたいと言う事だったのかな?

 でしたら(2Win) 2017/03/22(水) 15:34 で紹介されているのAPIの Sample02 を実行する事になりますけど、
 こんな中身のクリアなんて、何の為にするんでしょうかね?

 普通はクリップボードの中身なんて気にする人はいないと思うけど、残ってたら悪戯する人でもいてるのかな?

(sy) 2017/03/22(水) 20:57


yamaさんへ。
>投稿者さんの流れにについて行けそうもありません
それは私のセリフです。
最初の質問は解決したのか尋ねています。
 
そして、今やりたいことはなんですか?
Officeクリップボードの内容をクリアーすることなんですか?

(γ) 2017/03/22(水) 21:06


 To syさん

 >こんな中身のクリアなんて、何の為にするんでしょうかね?

 ですよね。質問者さんから答えていただくテーマですね。
 想像ですけど、2Winさんからの問いかけ、

 > もしや、officeクリップボードの中身を消したいということでは。
 >左側に出るクリップボードの中身を消したいということだったりしますか?

 に対して【そうです】というレスでしたので、なにかしら、そういうことがしたいんだろうなと
 思っています。

 で、これも、なぜかはわかりませんが、

 >他のアプリケーションから貼り付けのみを実行

 とありますね。
 他のアプリというのが何かはわかりませんが、IE や メモ帳 といったものだとして、
 マクロ実行後も、ホームタブのクリップボード表示を行うと、そこに貼り付けたものが残っている。
 それを消したいということなのかなと思っています。(想像)

(β) 2017/03/22(水) 22:14


皆様 ありがとうございました。
いろいろ想像させてしまいましたね
 >こんな中身のクリアなんて、何の為にするんでしょうかね?
確かにあまり必要ではない気がします。
お騒がせしました。勉強になりました。

(yama) 2017/03/23(木) 00:59


Excel内のコピーからであれば処理せず、
他のアプリケーションから貼り付けのみを実行 する。
併せて Officeクリップボードを"すべてクリアー"するなら、
下記のようなコードになるのでは?

 Sub 貼付()
     Dim CB As Variant
     Dim ccm As Variant

     ccm = Application.CutCopyMode
     CB = Application.ClipboardFormats

     If ccm = False Then
         If CB(1) <> True Then
             Range("A1").Select
             ActiveSheet.PasteSpecial Format:="テキスト", link:=False, DisplayAsIcon:=False

             'クリップボードを空に!
             Call ClearClipboard2

         Else
             MsgBox "貼付け対象がありません。コピーしてからやり直してください。", vbExclamation
             Exit Sub
         End If

     End If

 End Sub

 Sub ClearClipboard2()   ' Thanks To Abyssさん

     Const NAVDIR_FIRSTCHILD = 7&
     Dim acc As IAccessible
     Dim bar As Office.CommandBar

     Set bar = Application.CommandBars("Office Clipboard")
     If Not bar.Visible Then bar.Visible = True

     Set acc = bar.accChild(1&) _
               .accNavigate(NAVDIR_FIRSTCHILD) _
               .accNavigate(NAVDIR_FIRSTCHILD) _
               .accNavigate(NAVDIR_FIRSTCHILD)

     ''''acc.accDoDefaultAction 1&   ' すべて貼り付け
     acc.accDoDefaultAction 2&   ' すべてクリア

 End Sub

回答者からのお尋ねにはしっかり返事するようにしてください。

(γ) 2017/03/23(木) 06:22


 私の発言から皆さんを混乱させてしまったようで、申し訳ございません。

 yamaさん
 混乱させてしまうようなことを書いてしまって申し訳ございませんでした。
 で、γさんからの問いかけですが、If〜thenの記述は納得できる記述になってますか?

 以下、必要ないかもですが言い訳です。
 (yama) 2017/03/22(水) 12:01 ここでのコードで、Application.CutCopyMode = Falseが書いてあるのにクリップボードが消えないとおっしゃっていたので、
 Excelの画面であと見るとこといったらオフィスクリップボードかなー?と勝手に解釈しての発言でした。
 ちょっと軽率でした。今後は気をつけます。

(2Win) 2017/03/23(木) 09:18


2Winさんへ
適切なコメントをされたと思います。
軽率なことは少しもなかったと思います。
こちらがご迷惑かけたかもしれません。
遅くなりました。

(γ) 2017/03/24(金) 07:34


 γさん
 そう言っていただけるとありがたいです。
 迷惑だなんてとんでもありません。

 ご返信くださってありがとうございました。
(2Win) 2017/03/24(金) 11:53

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.