こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

シートへのD&Dを禁止にする

VBAでフォーム上のListViewにavi動画ファイルをD&Dすると
そのパスを読み取って、自動でプログラムを実行するマクロを作成しました。

問題無く実行できる場合には問題ないのですが
バグがあったりして、デバッグモードに入ったり
途中でプログラムの実行を中断したりすると、
そのavi動画ファイルをシート上にD&Dしたのと同じ状態になり
Excelでavi動画ファイルを開こうとしてしまいます。

大きなファイルなら開けませんが、
小さなファイルだとバイナリデータとして無理矢理開くことになり
Excelがフリーズしてしまいます。

それでVBAかExcelの設定で
シート上にファイルをD&Dしても読み込まない設定にしたいのですが
どのようにすれば良いでしょうか?

一応検索して調べたのですが見つかりませんでした。
どなたか教えてください。

投稿日時 - 2014-12-12 12:50:40

QNo.8855777

すぐに回答ほしいです

質問者が選んだベストアンサー

回答No.1 です。

○effect 引数, AllowedEffects というのはどのように
 して使うのでしょうか?

ここから先は私もサンプル組んで検証しないことには
何とも言えません。しかし、私としてもこれ以上は時間を
割きにくいので、これで私はギブアップにさせてください。

なお、回答No.3さんのアドバイスも問題解決案としては
魅力的なアイディアですよ。

投稿日時 - 2014-12-16 00:30:46

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(5)

回答No.1 です。追質問についてご回答します。

○ListviewのOLEDragmodeを使っています
 ⇒ 失敬。OLEDrag なら OLEDragDrop イベントでしょう
   から effect 引数か AllowedEffects あたりで制御できな
   いでしょうか。(当方は未検証ですが)
   http://msdn.microsoft.com/ja-jp/library/cc482733.aspx

○On Error GoTo でどこでエラーが出たかを知ることはでき
 ないでしょうか?
 ⇒ 残念ながらできません。
   デバッグ時は On Error GoTo をコメントアウトするか、
   自分でどこまで実行したかを記録する変数でも作って、
   処理を実行するごとに変数に『ここまで実行した』と
   記録するコードをいちいち書くくらいしかできません。

投稿日時 - 2014-12-14 18:14:51

お礼

effect 引数, AllowedEffects というのはどのようにして使うのでしょうか?

AllowedEffects = False
と入力してもうまくいかないのですが
 

投稿日時 - 2014-12-15 19:38:37

ANo.3

Dropでファイルを開くのは基本機能なので、禁止は難しそうですね。。。

おそらく、どこかでD&Dをキャンセルしているはずです。その前に処理が止まることで問題が起きるのなら、なるべくその処理を先に持ってきたらいいです。
まずは、どこまで進めばOKなのか確認してみてください。

Object.Clearみたいな方法でキャンセルされるなら、さっさとパス取得&クリア。もし、Dropイベントを完全に抜けないとダメなら、Application.Ontimeでメイン処理を遅延実行。Ontimeはスマートでよいかも。

'Ontime使用例 main終了直後にhogeが実行される
Sub main()
 Application.Ontime Now, "hoge" '並行処理されないので時間はNowでいい
 MsgBox "main"
End Sub
Sub hoge()
 MsgBox "hoge"
End Sub

投稿日時 - 2014-12-14 17:49:17

回答No.1 です。追質問についてご回答します。

○改良を行っている途中では使えないことないですか?
 ⇒ 改良を行っている場合は、On Error Goto はコメント
   アウトすることも多いです。そこは開発の方法次第で。

○On Error GoTo を使ってD&Dがなかったことにする、
 キャンセルすることってできないでしょうか?
 ⇒ Drag&Drop の処理を実行しているイベントは何で
   しょう? BeforeDropOrPaste なら引数 Cancel
   に True を入れれば既定の動作はキャンセルされます。
   http://msdn.microsoft.com/ja-jp/library/office/gg264583%28v=office.15%29.aspx

投稿日時 - 2014-12-14 16:02:09

お礼

質問文にも書いていますが
ListviewのOLEDragmodeを使っています。


BeforeDropOrPaste は
BeforeDropOrPaste = False
のようにして使えば良いのでしょうか?
これでもD&Dがキャンセルされないようなのですが

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=49886;id=excel

このページには
「そのイベントはControlのドラッグ&ドロップだと思います。」
とかかれており、Listviewのものとは別のものだと書かれています。


On Error GoTo
で飛んだ場所にStopを置いて
処理を一時停止させれば、ある程度のデバッグはできるのですが
どこでエラーが出たかを知ることはできないでしょうか?

投稿日時 - 2014-12-14 17:26:06

そんなに難しく考えずに、On Error GoTo を使って
バグがあってもデバッグモードに入ったり途中で止まら
ないようにすれば良いのでは?

投稿日時 - 2014-12-13 23:26:25

お礼

ありがとうございます。

On Error GoTo のことは知らなかったので調べてみたのですが
プログラムが完成してこれ以上変更を行わない場合には使えそうですが
改良を行っている途中では使えないことないですか?

要は、エラーが出るとデバッグモードに入るわけですが
それでプログラムの停止ボタンを押すと
D&Dしたファイルが直接シートに読み込まれてしまうのです。

On Error GoTo を使って
D&Dがなかったことにする、キャンセルすることってできないでしょうか?

投稿日時 - 2014-12-14 12:43:57

あなたにオススメの質問