Excel VBAでセルのドラッグ操作時に発生するエラーの回避方法

このQ&Aのポイント
  • Excel VBAを使用してセルのドラッグ操作を行う際に、Excel.EXEアプリケーションエラーが発生する問題があります。このエラーを回避する方法を教えてください。
  • Excel VBAでのセルのドラッグ操作時にExcel.EXEアプリケーションエラーが発生してしまいます。このエラーを回避する方法を教えてください。
  • Excel VBAでセルのドラッグ操作を行うとExcel.EXEアプリケーションエラーが発生します。このエラーを回避する方法を教えてください。
回答を見る
  • ベストアンサー

Excel VBA Do~Loop時のドラッグ操作

はじめまして。 ExcelでGUIなガントチャート作成ツールっぽいものを作ろうと思っています。 そして、現在以下の実装で検討中です。 ・実際のタスクを管理する「タスク」シートと、タスクを表として表示する「カレンダー」シートを別に管理。 ・「タスク」シートにはタスクID・タスク名・開始日・終了日の情報を保持 ・「カレンダー」シートは、  1~3行目にカレンダー、1~5列目がタスクID・タスクの分類・タスク名などの情報を表示し、  「タスク」シートに記載されているタスクを「カレンダー」上にプロット。 ・ユーザは「カレンダー」シートのタスク(セルで持っています)をマウスで操作することで、  タスクの追加・削除やスケジュール変更を行う ※Excelはユーザのマウスによる操作をセルの座標から該当タスクを特定し、   「タスク」シートの該当タスクの内容をセルの操作に応じて更新。   その後、更新後のタスクを元にカレンダーを再描画する。 --- で、「カレンダー」シートには、下記の要領のプログラムをかいています。 '常駐監視処理の操作用フラグ dim Flg as Boolean 'ワークシートがアクティブになったときの処理 Private Sub Worksheet_Activate() Flg = True Call 監視 End Sub 'ワークシートが非アクティブになったときの処理 Private Sub Worksheet_Deactivate() Flg = False End Sub Sub 監視()  debug.print "■監視開始" Do While Flg    'ここに監視用の処理を実装予定  Loop debug.print "■監視終了" End Sub Private Sub Worksheet_Change(ByVal Target As Range) 'セル更新時の処理   debug.print "■更新" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) '選択範囲変更時の処理   debug.print "■選択範囲変更" End sub --- このプログラムを起動した状態で、該当シートでセルのドラッグ&ドロップの 操作を行った際、Excel.EXEアプリケーションエラーが発生します。 「デバッグ」ボタンを押すと以下の添付画像のダイアログが表示されます。 ※Worksheet_Change/Worksheet_SelectionChangeのイベントでも   トラップすることができません。 このエラーを回避する方法がありましたら教えていただけると助かります。

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

  • ベストアンサー
回答No.2

Worksheet_Activate()で監視をCallしているのでループしているので処理が終了する前に次のイベントが多数発生してメモリを食い尽くしています。 イベントの処理が完結するまで(ユーザーの処理+Windwsの処理)同タスクからのイベントはDoEventsでは取れずキューイングしたままになるはずです。 Worksheet_Activate()では監視をCallせずFlgの変更のみとして、監視そのものはタイマなどを使用して別に行うべきです。

inakanamazu
質問者

お礼

ありがとうございました!以下のような実装でうまく行きそうです。 '以下、ワークシート内に記述 Private Sub Worksheet_Activate() Flg = True Call 監視2 End Sub Private Sub Worksheet_Change(ByVal Target As Range) Debug.Print "■更新" End Sub Private Sub Worksheet_Deactivate() Flg = False Debug.Print "===監視終了" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Debug.Print "□選択範囲変更" End Sub '以下、標準モジュールに記述 Public Flg As Boolean Sub 監視タイマーセット() If Flg Then Debug.Print "★待機中" Application.OnTime Now + TimeValue("0:0:1"), "監視2" End If End Sub Sub 監視2() On Error GoTo Err_Trap: 'ここに監視処理を記載 Debug.Print "===監視処理中===" Call 監視タイマーセット Err_Trap: End Sub

その他の回答 (1)

  • webnas
  • ベストアンサー率30% (3/10)
回答No.1

Sub 監視() Debug.Print "■監視開始" Do While Flg DoEvents   'ここに監視用の処理を実装予定 Loop Debug.Print "■監視終了" End Sub ループ分の中でメモリがいっぱいになっちゃってますので ループ分内にOSに処理を返す、DoEvents を入れてみたらどうでしょうか?

inakanamazu
質問者

補足

さっそくありがとうございます。 ご指摘の通り、DoEvents、確かに入れていました。 ※監視処理のベースは下記のURLのものを使う想定です。 http://www.keep-on.com/excelyou/1999lng4/199909/99090194.txt

関連するQ&A

  • データ更新時の処理について(エクセルVBA)

    セルA2に数字の66が入っているとして、セルA2を67に更新した瞬間に67-66という処理をさせたいのですが、下記の???の部分が分かりません。どなたか、教えてください。お願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$2" Then  ??? End If End Sub

  • エクセルVBAで Cancel=Trueの使い方

    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_Deactivate() Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cancel = True MsgBox "キャンセルしました" End Sub 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?

  • エクセルマクロ(VBA)で指定したセルが変化したときに実行するには?

    VBAでsheetの中のworksheet_changeなどでマクロを書くと、そのシー トの中のどのセルを変化させてもマクロが実行されるのですが、これ を、A1とc1とc2が変化したときだけ処理を実行させたいのです。 以下のマクロのどこかを編集すると、そのようなことが出来るのでし ょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) ----実行する内容---- End Sub Private Sub Worksheet_Change(ByVal Target As Range) ----実行する内容---- End Sub

  • どこが間違ってますか? (エクセルVBAです)

    質問をご覧くださりありがとうございます。 どなたか助けていただけないでしょうか。 以下のコードの場合、B2セルをダブルクリックすればシート(1)が開くと思っていたのですが、B2以外のセルをダブルクリックしてもシート(1)が開いてしまいます。 どこが悪いのでしょうか。 詳しい方がいらっしゃいましたら、どうか教えてください。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean) If Target = Range("B2") Then cancel = True Worksheets("シート(1)").Activate End If End Sub どうか、宜しくお願いいたします。

  • Excel VBA イベントプロシージャを2つ記述する(基本です)

    基本的な事なのですが、Excelのイベントプロシージャで2つプログラムを作るにはどうやって記述すればよいのでしょうか? 具体的には、worksheetのchangeイベントで、セルC5の値を変えた時と、セルG7の値を変えた時の2通りのマクロを作成したいのです。 Private Sub Worksheet_Change(ByVal Target As Range) C5を変えた時の処理 End Sub Private Sub Worksheet_Change(ByVal Target As Range) G7を変えた時の処理 End Sub このように書けばよいのでしょうか?そうするとTargetがかぶっておかしくなる気がします。。 お願いします。

  • エクセルvba  (ByVal Target As Range)について

    シートのイベントプロシージャーが Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub となりますが (ByVal Target As Range)部分は何なのでしょうか? 何のためにあるのかわかりません。 Private Sub Worksheet_SelectionChange() End Sub としたらエラーが返ってきました。 理由を教えてください。 よろしくお願いします。

  • (エクセルVBA)セルを左クリックしたら実行させるには?

    エクセルVBA初心者です。 下のように、同じシート内のコードとして2つのサブプロシージャがある状態なのですが、 シート内のどこかのセルを左クリック→指示(1) シート内のどこかのセルを右クリック→指示(2) のようにするにはどうしたらいいのでしょうか? (この状態だと、右クリックすると選択範囲が変わったことが優先的に認識されて指示(1)のほうが実行されてしまうようです。) 説明不足かもしれませんが、何を説明していいのか分からないので、補足が必要だったら言ってください。すみませんがよろしくお願いします。 --------------------------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) 指示(1) End Sub --------------------------------------------------------------- Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 指示(2) End Sub ---------------------------------------------------------------

  • Excel vba

    Excel vba をはじめて1ヵ月程度の初心者ですが、すいません質問させて下さい。 シートをCodeNameでSheets()みたいに指定はできるのでしょうか? また、図形をIDでShaps()みたいに指定する方法はあるのでしょうか? どちらも名前(.Nameの方)は変えてある状態です。 例えばアクティブシート名は"テスト"、図形名は"サンプル"みたいな状態です。 名前は自由に変えていきたいのですが、名前が変わってもかわらず指定できるようにしたいです。 Sub test1 Debug.Print Activesheet.Name Debug.Print Activesheet.Index Debug.Print Activesheet.CodeName Debug.Print Excel.Selection.Name Debug.Print Excel.Selection.Index Debug.Print Excel.Selection.ShapeRange.ID End Sub どなたか御教授おねがい致します!!

  • エクセルVBAのコーディング

    現在、次のようなことがやりたくてエクセルのコードを作ってみました。 ・データが書かれたエクセルの複数のsheetの特定のセルをコピーして、sheet1にコピーペーストしていきたい。 そこでこのようなコードを書いてみました。 Private Sub Worksheet_Activate() Sheet4.Select Range("A16").Copy Sheet1.Select Range("U63").Select Sheet1.Paste End Sub とりあえずSheet4のセルA16のデータをSheet1のU63にコピーペーストするようにしてみたのですが、うまくいきません。 この場合のコードの書き方をご教授いただけないでしょうか? どうぞ、よろしくお願い致します。

  • VBA Do~Loopについて

    VBA勉強中です。 マクロの作成は完了しているのですが、処理効率について指摘を受け、 その際に助言もいただいたのですが、自身の勉強不足、理解不足で どのように変更すれば良いのか分からず、教えていただきたいです。 Do While Ax2 <= 30 で30回繰り返すのではなく (Cells(Ax2,"B").Value <> "" ) の間繰り返すように変更したいです。 ---------------- Sub test()  Dim File1(30) As string  Dim Sheet1(30) As string  Dim Sheet2(30) As string  Dim Cnt As Integer  Ax1=1  Ax2=7  Do While Ax2 <= 30    If Cells(Ax2, "B").Value <> "" Then     File1(Ax1) = Cells(Ax2, "B").Value     Sheet1(Ax1) = Cells(Ax2, "C").Value     Sheet2(Ax1) = Cells(Ax2, "D").Value     Cnt =Ax1    End If    Ax1 = Ax1 + 1    Ax2 = Ax2 + 1  Loop End Sub ---------------- お手数ですが、よろしくお願いいたします。

専門家に質問してみよう