Excel VBAのValueによる値貼り付けでのEscキー連続押下時の処理についての問題

このQ&Aのポイント
  • ExcelのVBAマクロでValueを使用して値を貼り付ける処理中にEscキーを1回押下した場合は正常に終了処理を行うが、連続で押下した場合はエラーとなり処理が止まる問題が発生している。
  • 同じ処理をCopyを使用して実装した場合は連続でEscキーを押下しても割り込み処理が行われずに処理が続行されるが、処理時間が長くなる。そこでValueを使用しつつも連続押下に対応する方法を求めている。
  • 目標は、Valueによる値貼り付けを行いつつも処理時間を短縮することであり、連続でEscキーを押下された場合でもキャンセル処理を正常に行いたい。しかし、現状では連続押下時にエラーが発生し、対応策が見つかっていない。
回答を見る
  • ベストアンサー

Valueで値を貼り付けコピー時Escキー連続押下

現在業務で以下のようなマクロを記述しています。 (Xはダミー文字です) Function XXX() (略) On Error GoTo OUTPUT_ERROR Application.EnableCancelKey = xlErrorHandler (略) '別ブックからの値貼り付けコピー XXX.Value = XXX.Value (略) OUTPUT_ERROR: XXXXXXXXXXX (略) End Function この処理において、Valueを用いた値の貼り付けが膨大なデータを対象としており長時間処理がかかる場合、その貼り付け処理中にEscキーを1回押下した時は、エラートラップが正常に働き、値の貼り付けの途中で終了しているようなのですが、同じ状況でEscキーを連続で押下し続けた場合、2回目の押下以降で「実行時エラー '18':」という表記のウィンドウが表示され処理が止まってしまいます。 上記ウィンドウにてデバッグボタンを押下すると、「OUTPUT_ERROR」の最初の行(XXXXXXXXXX )で止まっています。 尚、同じ処理をValueではなくCopyにて実装したところ、Escキー連続押下しても、Copy処理が完了するまで割込み処理が走っていないようで、Copy終了後に「OUTPUT_ERROR:」以降の処理が走っているようでした。ただ、Valueよりも処理時間が格段に長くなってしまうため、こちらの案は出来る限り採用しない方向で検討しています。 実現したいことは、処理時間の短縮の為、Valueにて値を貼り付けコピーを実施しつつも、それが長時間に渡る場合はEscキー押下でキャンセル処理を実装することなのですが、Escキーを連続押下された場合も考慮して動作確認をしたところ、上記の現象が出てしまっており、解決の糸口が見つかっていません。 この場合、Escキーが連続で押された場合も正常にキャンセル処理を走らせるには、どのようにしたら実現できますでしょうか?よろしくお願い致します。

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

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

こんにちは。 まず、アプリケーションは、書かれていませんが、Excelということでしょうか? ふつうは、.Value = .Value で、そのようなインターラプトさせるコードにはしないものですし、Excelでなぜ、Function プロシージャなのか、よく分かりません。つまり、他のマクロから呼び出ししているということでしょうか? 基本的に Application.EnableCancelKey = xlErrorHandler と入れるなら、 Application.EnableCancelKey = xlInterrupt と戻さなくてもよいのかな?(場合によるようですが) それから、大量ということは、ループしているのでしょうか? もし、そうでしたら、DoEventsで割り込みさせたほうが無難だと思います。 EnableCancelKey を使う時は、処理条件が相手任せで、無限ループになる可能性がある場合などに施すのであって、注意して使うことが要求されます。これを使う場合は、イレギュラーなコードの方が多いです。質問内容では、隠れている所がよく分からないです。 そもそも、値コピーに時間が掛かるという部分に、解決の要素がないのか、現在の質問の中では分かりません。量的な問題の場合は、カウンターをつけて、1万回とか10万回とかループした時に、カウンターが回数を越えたということで、途中で止まるように作ります。また、別に、フラグで割り込みを入れるようにも作ります。 > OUTPUT_ERROR: については、問題はありませんが、 通常は、 OUTPUT_ERROR: If Err.Number = 18 Then   MsgBox "途中終了します。"   '別の処理があるなら、ここに入れます。 End If 'Application.EnableCancelKey = xlInterrupt というようなスタイルにしますね。

k-masa1
質問者

お礼

ご丁寧なご回答ありがとうございます。 結論から申しますと、今回のインターラプトさせる実装は不要となりました。 大変的確なアドバイスを頂きながら誠に申し訳ございません。今後の参考とさせて頂きます。 この度はありがとうございました。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> OUTPUT_ERROR: で何の処理をしてるのか? エラー処理自体が時間を要するなら、escキー押下でフラグ設定するだけにして 処理本体でフラグ判定して、処理分岐させるとか

k-masa1
質問者

補足

ご回答ありがとうございます。 OUTPUT_ERROR: では、Err.Numberを返り値として詰めるとか、 Application.Cursor = xlDefault としてマウスポインタを標準ポインタに戻すというような初期設定に戻す処理を行っているのみです。 そうですね、Escキーでエラーをキャッチするのではない実装は1つの手ですね。

関連するQ&A

  • Excel VBA Escキー押下をコードで表わすと…

    Excel VBA Escキー押下をコードで表わすと… Excel2003を使用しています。 ある列をダブルクリックすると、指定した範囲のセルを塗りつぶすイベントマクロを作成しました。 ダブルクリックで塗りつぶされた後は、セルが編集状態になっているので、Escキーを押して編集状態を解除していましたが、Escキーを押して編集状態を解除するところまでをコードに書いたらどうかと思い、塗りつぶしを指定しているコードの後に、『SendKeys "{ESC}"』と追加してみたのですが、追加する前と同じ状況で、編集状態のままでした。 Enterや↓キーを押した場合を試しに書いてみると、塗りつぶされた後、1つ下のセルに移動しました。 コードを追加した場所がいけないのか、それとも、使い方が間違っているのか…?? どなたかわかる方がいらっしゃいましたら、教えていただけないでしょうか。 よろしくお願いします。

  • フォルダ参照ダイアログAPIをVBAに組み込んだときのESCキー押下

    フォルダ参照ダイアログAPIをVBAに組み込み、フォルダ選択画面が表示されたとき、ダイアログ上の「OK」「キャンセル」以外に、キーボードの「ESC」キーを押下すると、VBAの「コードの実行を中止」ダイアログが表示されプログラムの実行が中断します。「ESC」キーを押下しても「キャンセル」と同等の処理で、「コードの実行を中止」ダイアログを表示しないようにできるでしょうか。お知恵をお貸しください。

  • SpinButton連続押下時のアクション

    SpinButtonのコンポーネントを作成しています。 このコンポーネントにボタンを連続押下した時に値を連続してカウントアップ/ダウンさせる処理を追加したいのですが、良い方法をご存知の方教えてください。 現在ボタン押下時に1つカウントアップ/ダウンさせるactionPerformedは設計済みです。

    • ベストアンサー
    • Java
  • エクセル・セルの値のみをコピーすることについて

    セルの値のみをコピーするには、「形式を選択して貼り付け」の「値」を選ぶことで可能なことはわかります。 しかし、値が貼りついた後にEnterキーを押すとその値がすべてをコピーしたように変わってしまいます。 例えば、元のセルに関数があればその関数もコピーされてしまいます。 Enterキーではなく、Escキーを押すと問題なく値のみが貼りつきます。 この現象を設定等を変えることによって、Enterキーを押しても値のみを貼りつけるようにすることは可能でしょうか? エクセル2000、2003、2007でも同様の現象がおきます。 よろしくお願いします。

  • word2007 でescキーが押された場合の処理を指定できませんか?

    Word VBAの初心者です。マクロの実行中にescキーが押された場合の処理を、こちらで指定することはできますか?Excelですと  Application.enabledcanelkey = xlErrorHandler でエラーを起こしてできるようなのですが。ワードですと、エラーを起こすような定数が見つかりません。

  • AutoCAD2007LTでESCキー操作(解除)をマウスで行うには?

    AutoCAD2007LT、超初心者です。 AutoCADではESCキーにてコマンドのキャンセル等が行えますが、 主にマウスで操作をため、キャンセルしたい場合、いちいち キーボードのESCキーを押下しなければなりません。 間違ったキーを押してしまう場合もあり困っています。 出来ればマウスだけで簡単にキャンセルコマンドを 発行?したいのですが、そういったことは可能でしょうか。 たまに右クリックメニューに含まれている場合もありますが、 出来ればワンクリックで行えるようにしたいです。 例えばツールバーへの登録等は行えませんか? 皆さんはどうされていますか? 何卒よろしくお願い申し上げます。

  • VBAで値だけコピー

    EXCEL VBAで別ファイルの値をコピーして貼り付けをしているのですが、セルの中の一部のみを貼り付けしたいと思いますが、 どのようにしたらいいのでしょうか? 関数では取り出すことができたのですが、できればVBAの中で処理できればと思っています。 =IFERROR(MID(Z2,FIND("6",Z2),FIND(" has",Z2)-FIND("6",Z2)),"") やりたいこと 1.左から見て6~空白までの値のみを貼り付けしたい 2.エラーの時は空白にしたい Sub SO_Copy() Dim ws As Worksheet Set ws = Worksheets("Sheet1") Dim FilePath, FileName As String 'C8&C9にファイルパス/ファイル名を入力 FilePath = ws.Range("C8").Value & "\" & ws.Range("C9").Value FileName = ws.Range("C9").Value Workbooks.Open FilePath 'Z2~コピーして、"メール送信.xlsm"のD11以降に値だけ貼り付け Range("Z2", Range("Z2").End(xlDown)).Copy Windows("メール送信.xlsm").Activate Range("D11").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Workbooks(FileName).Close End Sub

  • アプリ探してます! 連続コピー連続張り付けが出来る

    androidアプリで 連続コピー連続張り付けがスムーズに出来るものを探しています!! 見つけたものではClibor copy center free というものでしたが クリボーはPC版 copy center freeはiphone版でした 泣 現在PCでは あどくりっぷ というソフトを使っています こういった連続コピーしたものが蓄積されていき 蓄積したものを一気にコピー順に貼りつけていくというアンドロイドのアプリを 2時間探しましたが見つかりませんでした!! なるべく無料が良いですが有料でも良いです。 ほとんどのソフトがコピーしたものを貯めていくだけのアプリで、 その後の貼り付けの事を考えていません! 溜めたものを一気にメモ帳か、クラウド上に貼りつけるがしたいのです! 例えばアフィリエイトリンクを50商品分連続コピーしていき その50個のリンクを一気にメモ帳に貼りつけるかクラウド上に貼りつけるか クラウド上に文字列を保存すると言った事がしたいのです いちいちせっかく溜めたものを一つずつ貼りつけしていたのでは意味がありません! そういったアプリ教えてください!困っています

  • valueの値について教えてください!

    前提として疑問なのですがname属性の値を日本語にすると古いブラウザで 文字化けするなど環境により問題があるようなので英語にするのが無難と 言われておりますよね。 なんとなくそれは納得できるのですがセレクトボックスやラジオボタンの valueはなぜ英語または数字で指定されていることが多いのでしょうか? 初心者なものでまずは一度試してみようと思い英語でセレクトボックスのvalueを指定し 入力ページに以下のように配列を用意し(実際には47都道府県) $area_array = array(1 => '東京', 2 => '神奈川', 3 => '千葉'); foreach ($area_array as $key => $val) { echo "<option value=\"" . $key ."\">" . $val . "</option>\n"; } とすると <option value="1">東京</option> <option value="2">神奈川</option> <option value="3">千葉</option> となるのですがvalueが数字なのでこの状態で次の確認ページに進むと 何を選んだのかわかりません。 確認ページに if ($_SESSION['area'] == '1') { $_SESSION['area'] = '東京'; } と記述すればいいのですが47件もあるのでもっと簡略化 できないものかと思い調べてみたのですが有力な情報がみつからず質問 させて頂きました。 valueを日本語にすればそのままなので問題ないのですが英数字での場合 どのようにすれば実現できるのかを教えて頂きたいと思っております。 詳しい方おりましたら宜しくお願い致します。

    • ベストアンサー
    • PHP
  • VBAでESCキーを無効にしたいのですが、うまくいきません。

    EXCEL VBA でESCキーを無効にするために、 Application.EnableCancelKey = xlDisabled を使用していますが、 特定のフォルダ内のEXCELファイルを開いて、ある処理をして保存するといったプログラムでは、ESCキーを無効にすることができませんでした。 原因を探るために以下のテストプログラムを作成しましたが、実行中にESCキーを押すと(長押しすると確実に) 「実行時エラー'1004' openメソッドは失敗しました。'Workbooks'オブジェクト」 のメッセージが表示されて止まってしまいます。 どこに原因があるのでしょうか? よろしくお願いします。 以下、テストプログラム ////////// Private Sub CbStart_Click() Dim Fname As String Dim Fpath As String Application.ScreenUpdating = False Application.EnableCancelKey = xlDisabled Fpath = "d:\work\" Fname = Dir(Fpath & "*.xlsx") Do While Fname <> "" Workbooks.Open Fpath & Fname CloseWorkbook Fname Fname = Dir() Loop Application.ScreenUpdating = True End Sub 以上 //////////////////

専門家に質問してみよう