Excel 2003 にてマクロの実行中にESCキーを押されるとコードの実行が中断されるのを抑制したいのですができません。

シートに直接テキストボックスコントロールを貼り付けています。
そのテキストボックスにKeyDownイベントプロシージャを記述しています。
テキストボックスにIMEの全角文字を入力中(未確定状態)の時に、ESCキーを押すとコードの実行を中断しましたというダイアログが出てしまいます。

KeyDownイベントプロシージャの内容の有無にかかわらず(処理は無記入でも)、ESCキーを押すとダイアログが表示されてしまいますので、ESCキーを押してもダイアログが表示されず処理が中断されない方法はありませんでしょうか。

調べましたところ、
Application.EnableCancelKey = xlDisabled
にてESCキーを無効にする事ができるそうなのですが、BOOKを開いた時のイベントにて
上記コードを記載しているのですが、抑制はできません。

何かしら別の方法で対応などはできないものなのでしょうか。
よろしくご教示をお願い申し上げます。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

KeyDownイベントの内容がわからないので今ひとつ不安ですが、


以下で対応できるかもしれません。

'Sheetモジュール
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private flg As Boolean

Private Sub TextBox1_GotFocus()
  Application.EnableCancelKey = xlDisabled
  flg = False
  Do
    Sleep 1
    DoEvents
  Loop Until flg
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  '処理
End Sub

Private Sub TextBox1_LostFocus()
  flg = True
End Sub
    • good
    • 0
この回答へのお礼

ご連絡が遅くなりまして申し訳ありません。
確かに出来ました!!
ありがとうございます。

しかし何故問題が発生しないのか、今ひとつ理解できていません。
GotFocusに処理が留まり続けることで、Application.EnableCancelKey = xlDisabled が有効となり続けるという解釈でよいでしょうか。

何にせよ問題が解決しました。ご丁寧にご教示頂きましてありがとうございます。

お礼日時:2009/06/04 15:14

解決でなによりです。


>GotFocusに処理が留まり続けることで、Application.EnableCancelKey = xlDisabled が有効となり続けるという解釈でよいでしょうか。
概ねその通りです。
TextBox1がFocusを得たとき、TextBox1_GotFocusイベントが実行されます。
このイベントプロシージャが終了するまで EnableCancelKey = xlDisabled です。

Do
  Sleep 1
  DoEvents
Loop Until flg

Loop終了条件 flg = True ...つまり LostFocusイベントが発生するまで
このLoopが回り続けますから、ずっとEnableCancelKey = xlDisabled です。
Loopの中でDoEvents関数で他プロシージャが実行できるようにしてありますので
xlDisabled状態でKeyDownイベントが発生する事になります。

#ちなみに Sleep 1 はCPU使用率100%を回避する為。
    • good
    • 0
この回答へのお礼

ご丁寧にご教示頂きましてありがとうございます。
おかげさまで理解できました。

なるほど私が勘違いしていました。
まだまだ勉強が必要な様です。

どうもありがとうございました。

お礼日時:2009/06/04 22:33

こんにちは。



BOOKを開いた時のイベントにて記載するのではなく、
全て Sub, Function の先頭に記載してみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

試しに新規BOOKのsheet1にテキストボックスコントロールを貼り付けて以下のコードのみを記述し、テキストボックスに全角入力中にESCキーをおしてみたところ、コードの中断のダイアログボックスが表示されてしまいました。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Application.EnableCancelKey = xlDisabled
End Sub

その他のプロシージャを記述し、設定しなければいけないのでしょうか。

お礼日時:2009/05/21 20:39

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL-VBAでキー入力で処理を分岐させたいのですが・・・

長い処理を繰り返すプログラムを使っています。
ESCキーを押すと処理が止まりますが、どこで止まるか決まってないので困ります。
プログラムの実行中に、キー又はマウスの操作を変数に取り込み、処理を分岐し終了処理をさせたいのですが、その方法があったら、教えてください。

Aベストアンサー

これじゃあ、ダメかな?
ESCキーを押すと"ESCが押されました"というメッセージが表示される。

--------------------------------------------------
Sub a()
Dim i As Long

' エラー処理を登録
On Error GoTo ERR1
' ESCキーでエラー処理に進む
Application.EnableCancelKey = xlErrorHandler

For i = 1 To 60000
Cells(i, 1).Select
Next i

GoTo EXIT1

' エラー処理
ERR1:
MsgBox "ESCが押されました"

' 終了処理
EXIT1:
' セットしたプロパティを初期値に戻す
Application.EnableCancelKey = xlInterrupt
Application.StatusBar = False

End Sub
--------------------------------------------------

これを色々応用すれば、何とかESCキーで分岐は出来そうですが。

これじゃあ、ダメかな?
ESCキーを押すと"ESCが押されました"というメッセージが表示される。

--------------------------------------------------
Sub a()
Dim i As Long

' エラー処理を登録
On Error GoTo ERR1
' ESCキーでエラー処理に進む
Application.EnableCancelKey = xlErrorHandler

For i = 1 To 60000
Cells(i, 1).Select
Next i

GoTo EXIT1

' エラー処理
ERR1:
MsgBox "ESCが押されました"

' 終了処理
EXIT1:
...続きを読む

QEXCELマクロで上書きメッセージ無しで保存する方法

EXCELマクロで上書きメッセージ無しで保存する方法をお願いします
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
の様にするとすでにファイルがある場合上書きメッセージが出ます
メッセージを出さずに上書きするプログラミングを教えて下さい
宜しくお願いします

Aベストアンサー

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
Application.DisplayAlerts = True

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QエクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?

ワークシート関数で書けば
=IF(OR(F18=0,AND(F15>0,F16>0)),TRUE)です。
これをVBAで書こうとして

If Sheet1.Range("F18") = 0 Or Sheet1.Range("F15") > 0 And Sheet1.Range("F16") > 0 Then
MsgBox True
Else
MsgBox False
End If

とやってみたのですが、正しくないようです。
どのように書けばいいのでしょうか?

Aベストアンサー

>とやってみたのですが、正しくないようです。

式は正しいと思いますよ

ANDとORは、ANDが先に演算されます。/*と+-では、/*が先に演算されるようなものです。

でも、わかり易くするために、#1のかたのように括弧をつけるほうが良いですね。

QVBAのリストボックスで、横スクロールバーを表示するには?

お世話になります。
今、Excel_VBAで、あるデータをリスト表示にしているのですが、ながいデータになりますので水平スクロールバーをつけたいと思います。
標準のプロパティにはないので、"SendMessage"APIを使用し、コーティングをしているのですがうまくいきません。

[標準モジュール]
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA"(ByVal hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, lParam As Long) As Long

[フォーム/ボタンクリックイベント]
Private Sub Form_Load()
List1.AddItem "あああああああああああ"
List1.AddItem "いいいいいいいいいいい"
List1.AddItem "ううううううううううう"

lRtn = SendMessage(List1.hwnd,LB_SETHORIZONTALEXTENT, 240, 0)
            
End Sub

以上を実行すると、上記の"List1.hwnd"のhwndの部分で
エラーになってしまいます。

エラー内容は、「メソッドまたはデータメンバがみつかりません」です。
宜しくお願い致します。

お世話になります。
今、Excel_VBAで、あるデータをリスト表示にしているのですが、ながいデータになりますので水平スクロールバーをつけたいと思います。
標準のプロパティにはないので、"SendMessage"APIを使用し、コーティングをしているのですがうまくいきません。

[標準モジュール]
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA"(ByVal hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, lParam As Long) As Long

[フォーム/ボタンクリックイベント]
Private Sub...続きを読む

Aベストアンサー

回答ではないのですが。
VBAのリストボックスはハンドルを持たないので、List1.hWndと書いてもエラーになります。
参考にされたコードはVB6.0のものと思います。
VB6のリストボックスならばハンドルが取れるので、使えるのです。

私もVBAで横スクロールバーを出したいなっと思ったのですがなかなか面倒・・・というかやりかたを見つけ出せず、私の場合リストボックスは使わずにリストビューを使うのが通常になっています。
もし可能ならば、その線もご検討なさってはいかがでしょうか?
リストビューなら縦横自由にスクロールバーは出せるし、列の幅をユーザーが自由に動かせます。
スクロールするときにマウスホイールにも反応します。
回答でなくてすみません。

QExcel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい

ExcelでVBAを使いアプリをつくっています。
プログラムを実行させるボタンはもちろんつくれるのですが、
プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。

ボタンに登録できるのはひとつのプロシージャですよね。
とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?

Aベストアンサー

s_husky です。

状況が判明したので再回答!

Public StopNow As Boolean

Public Sub Test()
  Do Until StopNow
    Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 1) + 1
    Pause 10
  Loop
  If StopNow Then
    MsgBox "Test の実行をストップしました。"
  End If
End Sub

Public Sub Pause(ByVal PauseTime As Single)
  Dim Finish As Single
  
  Finish = Timer + PauseTime
  Do
    DoEvents
  Loop Until Timer > Finish
End Sub

Private Sub CommandButton2_Click()
  StopNow = True
End Sub

Private Sub CommandButton1_Click()
  Test
End Sub

起動したプロシージャを止める必要があるということはループ処理と理解。
ならば、ループの条件を操作すれば宜しいかと。
CommandButton1 で起動した Test は CommandButton1 で止めれます。

Application.OnTime TimeValue("16:30:00"), "Test"

で起動しようと同じ理屈。

Application.OnTime は、一種の起動ツール。
当然に停止機能もあるが、停止を制御するには上記のような仕掛けが必要と思います。

s_husky です。

状況が判明したので再回答!

Public StopNow As Boolean

Public Sub Test()
  Do Until StopNow
    Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 1) + 1
    Pause 10
  Loop
  If StopNow Then
    MsgBox "Test の実行をストップしました。"
  End If
End Sub

Public Sub Pause(ByVal PauseTime As Single)
  Dim Finish As Single
  
  Finish = Timer + PauseTime
  Do
    DoEvents
  Loop Until Timer > Finish
End Sub

P...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qユーザーフォームを「Esc」キーで消去できるようにしたい。

こんばんは。
エクセル2003で、VBAでユーザーフォームを挿入し、
show modalをfalseにし、
「マクロの実行」でエクセルの画面に戻った時に、
「Esc」キーでユーザーフォームを消去することは不可能でしょうか?
何かやり方があったら教えて欲しいです。
よろしくお願いします。

Aベストアンサー

こんばんは。

>「マクロの実行」でエクセルの画面に戻った時に、
UserForm がアクティブなのか、シートがアクティブか、どちらか分からないので、両方に取り付けてみました。

'UserForm モジュール

Private Sub UserForm_Initialize()
Dim ctrl As Control
 On Error Resume Next
 For Each ctrl In Me.Controls
  ctrl.TabStop = False
  ctrl.TakeFocusOnClick = False
 Next ctrl
 On Error GoTo 0
  Application.OnKey "{ESC}", "UserFormClose"
End Sub

Private Sub UserForm_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = 27 Then 'ESC
  Unload Me
 End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Application.OnKey "{ESC}" '設定取り消し
End Sub

'---------------------------------------
'標準モジュール

Sub UserFormClose()
 Unload UserForm1
End Sub

こんばんは。

>「マクロの実行」でエクセルの画面に戻った時に、
UserForm がアクティブなのか、シートがアクティブか、どちらか分からないので、両方に取り付けてみました。

'UserForm モジュール

Private Sub UserForm_Initialize()
Dim ctrl As Control
 On Error Resume Next
 For Each ctrl In Me.Controls
  ctrl.TabStop = False
  ctrl.TakeFocusOnClick = False
 Next ctrl
 On Error GoTo 0
  Application.OnKey "{ESC}", "UserFormClose"
End Sub

Private Sub UserForm...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報