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ベストアンサー

メニューから「データ」、「入力規則」、「設定」で「入力値の種類」を「リスト」を選択します。
そうすると「元の値」という表示がでますので、そこで前もって作っておいたリストの範囲を指定します。
多くないのでしたら、そのままそこにカンマで区切って入力しても出来ます。

QEscキーを押すと、中断する時としない時がある

エクセルVBAです

VBAでループしているときに、Escキーを押すと、中断する時としない時があるのですが
しない時はなぜしないのでしょうか?

Aベストアンサー

AELAFAYQDIZ さん
こんにちは。

確かに中断のキーが効く場合と効かない場合がありますね。
私もはっきりしていません。
単純には「キーボードを受け付けない状態の処理をしている」とのことだと思います。
よって「何故効かないのか」では無く「効く」ようにできないかをを考えたほうが良いかも知れません。

1.ループ命令の中の「DoEvents」を追加する。
  DoEventsを入れることにより、キーボード入力を受け付けるようになります。
   Sub TEST()
    Do
     DoEvents
    Loop
   End Sub

2.中断の方法を選ぶ
 中断には3種類あるかと思います。
  ・Escキーによる中断
  ・Ctrl + Break キー による中断
  ・VBEの中断ボタン による中断

 「Escキー」より「Ctrl + Break キー」の方が一般的で中断が効きやすいと思います。

以上、色々と試してみて下さい。

Qエクセルでプルダウンメニューの作り方

  エクセルの画面で、よく三角形を逆さまにした形をクリックするといくつかメニューが出てき、どれかを選べるようになっていますが、その作り方を教えてください。
 会社で人事を担当していますが、三角形(プルダウンボタン)をクリックすると社員氏名一覧が表示され、そこから選択できるようにしたいのです。
 しばらく自力でいろいろやってみましたが、さっぱり見当がつかず、どうやればいいのか分かりませんでした。よろしくお願いします。

Aベストアンサー

こんばんは!
当方使用のExcel2003での一例です!

↓の画像のようにSheet2に名簿表を作成しておきます。
画像ではSheet2のA2セル以降を範囲指定 → 名前ボックスに仮に「名簿」と入力しOK
これで範囲指定したセルが「名簿」と名前定義されましたので、

Sheet1のリスト表示させたいセルを範囲指定 → メニュー → データ → 入力規則
→ リスト → 「元の値」の欄に
=名簿
としてOK

これでSheet1のセルをアクティブにすると右側に下向き▼が表示されますので、そこをクリック!
これで希望に近い形にならないでしょうか?
Excel2007の場合は↓のURLが参考になるかもしれません。

http://www.eurus.dti.ne.jp/~yoneyama/Excel2007/excel2007-ny_kis2.html

尚、同一Sheetに「名簿表」を作成する場合は名前定義する必要はなくて
「元の値」の右側の四角をクリックし、リスト表示したいセルをそのまま範囲指定すればOKです。

以上、お役に立てば良いのですが・・・m(_ _)m

こんばんは!
当方使用のExcel2003での一例です!

↓の画像のようにSheet2に名簿表を作成しておきます。
画像ではSheet2のA2セル以降を範囲指定 → 名前ボックスに仮に「名簿」と入力しOK
これで範囲指定したセルが「名簿」と名前定義されましたので、

Sheet1のリスト表示させたいセルを範囲指定 → メニュー → データ → 入力規則
→ リスト → 「元の値」の欄に
=名簿
としてOK

これでSheet1のセルをアクティブにすると右側に下向き▼が表示されますので、そこをクリック!
これで希望に近い形にならない...続きを読む

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

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

Aベストアンサー

こんにちは、KenKen_SP です。

> eDi89Uy6さん...

??このように表示されてるのですか^^;

> ダイアログ上の「OK」「キャンセル」以外に、キーボードの「ESC」キーを
> 押下すると、VBAの「コードの実行を中止」ダイアログが表示されプログラム
> の実行が中断します。

ご提示頂いたコードはキャンセル時に初期フォルダのパスをそのまま返すみたい
ですね。 つまり、ShowFolders 関数の呼び出し方次第なのですが、面倒な仕組
です。関数の仕様としてキャンセル時に初期フォルダを返すのって、余り宜しく
ない気がします。

また、CallBack を使っているのに、前回選択のフォルダを記憶してません...

これを修正するのはちょっと面倒なので、私が使っているものを Excel VBA
用に簡略化したものを提示します。ご参考下さい。

ユーザー定義関数 BrowseForFolder で、次の機能を関数化してあります。

 1. フォルダ参照ダイアログを表示
 2. 前回の選択フォルダを記憶(Excel2000以上で機能します)
 3. ユーザーが選択したフォルダの「¥マークで終わるパス」を返す(重要)

この関数は3つ引数を受付ますが、どれも省略可能です。それぞれの意味は、

第1引数:[strCaption] 省略可 ダイアログに表示する文字列
第2引数:[strRootPath] 省略可 初期表示のフォルダ(ルートパス)
     -->初期値「デスクトップ(仮想)」です
第3引数:[blnFixRoot] 省略可 第2引数で指定した初期フォルダより上位
     のディレクトリーに移動可能にするかどうかを True / False で設定

     例)strPath = BrowseForFolder(,"D:\",True)
       --> D:\ が初期フォルダとして表示され、デスクトップまで OK
     例)strPath = BrowseForFolder(,"D:\",False)
       --> D:\ が初期フォルダとして表示され、それより上位は無理

となってます。

キャンセル時の戻り値は「 長さ0の文字列 = vbNullString 」です。

【以下ソースコード】より下の部分を標準モジュールにコピペ
して下さい。ご質問の趣旨であるキャンセル時の処理ですが、ソース一番下に
Sub Sample() に書いておきました。

’【以下ソースコード】---------------------------------------------------

Option Explicit

' フォルダ参照ダイアログ

Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" ( _
  lpBrowseInfo As BROWSEINFO _
) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" ( _
  ByVal pidl As Long, _
  ByVal pszPath As String _
) As Long
Private Declare Function ILCreateFromPathA Lib "shell32.dll" Alias "#189" ( _
  ByVal pszPath As String _
) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long)
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
   ByVal hwnd As Long, _
   ByVal wMsg As Long, _
   ByVal wParam As Long, _
   ByRef lParam As Any) As Long

' BROWSEINFO構造体
Private Type BROWSEINFO
  hwndOwner   As Long  ' オーナーウインドウのハンドル
  pidlRoot    As Long  ' ルートフォルダ定数
  pszDisplayName As String ' 選択フォルダ名
  lpszTitle   As String ' ダイアログ表示メッセージ
  ulFlags    As Long  ' オプション
  lpfn      As Long  ' CallBack関数アドレス
  lParam     As String ' CallBack関数パラメータ
  iImage     As Long
End Type

Private Const CSIDL_DESKTOP = &H0
Private Const BIF_RETURNONLYFSDIRS = &H1
Private Const WM_USER = &H400
Private Const BFFM_SETSELECTIONA = (WM_USER + 102)
Private Const BFFM_INITIALIZED = 1

Private Const MAX_PATH = 260

' フォルダ参照ダイアログを開いて¥記号で終わるパスを返す
Public Function BrowseForFolder( _
  Optional strCaption As String = "フォルダを指定して下さい", _
  Optional strRootPath As String, _
  Optional blnFixRoot As Boolean) As String

  Dim udtBROWSEINFO As BROWSEINFO
  Dim lngRet    As Long
  Dim strPath    As String
  Static strPrevDir As String

  ' BROWSEINFO構造体を用意
  With udtBROWSEINFO
    .hwndOwner = 0&
    .pidlRoot = CSIDL_DESKTOP
    If strRootPath <> vbNullString Then
      If blnFixRoot Then
        .pidlRoot = ILCreateFromPathA(strRootPath)
      End If
      If Len(strPrevDir) Then
        strPrevDir = strRootPath
      End If
    End If
    .lpszTitle = strCaption
    .ulFlags = BIF_RETURNONLYFSDIRS
    ' Excel97 では AddressOf 演算子が使えないので
    ' 条件付きコンパイルする
    #If VBA6 Then
      .lpfn = GetPointer(AddressOf BrowseCallbackProc)
      If Len(strPrevDir) Then
        .lParam = strPrevDir
      End If
    #End If
  End With
  ' フォルダの参照ダイアログ呼び出し
  lngRet = SHBrowseForFolder(udtBROWSEINFO)
  If lngRet > 0 Then
    strPath = String$(MAX_PATH, vbNullChar)
    Call SHGetPathFromIDList(lngRet, strPath)
    Call CoTaskMemFree(lngRet)
    strPath = Left$(strPath, InStr(strPath, vbNullChar) - 1)
    ' 前回参照フォルダ記憶
    strPrevDir = strPath
    ' 戻り値(パスの終わりに¥を付与)
    If Right$(strPath, 1) <> "\" Then strPath = strPath & "\"
    BrowseForFolder = strPath
  End If

End Function

' CallBack プロシージャのアドレスを返す
Private Function GetPointer(lngAddressOf As Long) As Long
  GetPointer = lngAddressOf
End Function

' BrowseForFolder 関数 Callback プロシージャ
Private Function BrowseCallbackProc( _
  ByVal hwnd As Long, ByVal uMsg As Long, _
  ByVal lParam As Long, ByVal lpData As Long) As Long
  If uMsg = BFFM_INITIALIZED Then
    SendMessage hwnd, BFFM_SETSELECTIONA, 1, ByVal lpData
  End If
End Function


’【以下使い方のサンプルコード】

Sub Sample()

  Dim strPath As String
  
  strPath = BrowseForFolder()   ’<--基本的にはこれだけ
  If strPath = vbNullString Then  ’<--長さ0の文字列ならキャンセル
    MsgBox "キャンセル"
    Exit Sub           ’<--キャンセル時は終了
  End If
  
  ’<--以降の処理を書く-->
  ’取り合えずパスを表示してみる
  MsgBox strPath
  ' 選択されたフォルダにある Sample.xls を開いてみる
  Workbooks.Open Filename:=strPath & "Sample.xls"

End Sub

こんにちは、KenKen_SP です。

> eDi89Uy6さん...

??このように表示されてるのですか^^;

> ダイアログ上の「OK」「キャンセル」以外に、キーボードの「ESC」キーを
> 押下すると、VBAの「コードの実行を中止」ダイアログが表示されプログラム
> の実行が中断します。

ご提示頂いたコードはキャンセル時に初期フォルダのパスをそのまま返すみたい
ですね。 つまり、ShowFolders 関数の呼び出し方次第なのですが、面倒な仕組
です。関数の仕様としてキャンセル時に初期フォルダを返すのって、余り...続きを読む

Qエクセル(Excel) 納品書の作り方【画像修正版

昨日http://oshiete.goo.ne.jp/qa/7348426.htmlで質問させていただき、詳しくご回答いただき少し進んだのですが、状況が変わったので改めて質問させていただきます。

■エクセル(Excel)で納品書の作成をしています。
シート1に納品書、シート2に商品マスタ(一覧)を作っていて、シート2の一覧を反映させて
納品書に番号を打ち込むだけで、商品名・単価までが出るシステムを作りたいのですが、
昨日のご回答の中の「VLOOKUP」?を入れて、自分なりにマス目の数字を変えてやってみたのですが
反映されずN/?のようなエラーになってしまいます。

※画像が見にくかったのでシート<CENTER></CENTER>だけにしました。

1、上記のように、シート2との関連付けの係数を、写真の場合の数字で教えてください。

2、合計と、合計から20%を引いた数値を割り出す関数も、写真の数字で御願いします。

宜しくご教授お願い致します。

Aベストアンサー

こんばんは!
前回投稿した者です。

当方もかなり古い(人間も古い!なぁ~んちゃって!)Excel2003を使用しています。
↓の画像のようにSheet2にデータを作成しておきます。

#N/A というエラーは、「検索値」がない!ということですので
お示しの画像のB列にSheet2のA列にないデータを入力するとそういったエラーが表示されます。

画像のセル配置ですと
C4セルに
=IF($B4="","",VLOOKUP($B4,Sheet2!$A:$C,COLUMN(B1),0))
(「$」マークの位置に気を付けてください)
という数式を入れD4セルまでオートフィルでコピー!
そのまま最後の24行目までコピーしておきます。

F4セルには
=IF(COUNTBLANK(B4:E4),"",D4*E4)
という数式を入れ、F24までオートフィルでコピー!

これでB列に商品番号を入力すればSheet2のデータが反映され、
E列に数量を入力でF列に金額が表示されると思います。

最後に合計金額のF26セルは
=IF(COUNT(F4:F24),SUM(F4:F24),"")
手数料のF27セルは
=IF(F26="","",F26*0.2)

これで何とか形にならないでしょうか?

※ 振込金額の欄は不明ですので手を付けていません。

参考になりますかね?m(_ _)m

こんばんは!
前回投稿した者です。

当方もかなり古い(人間も古い!なぁ~んちゃって!)Excel2003を使用しています。
↓の画像のようにSheet2にデータを作成しておきます。

#N/A というエラーは、「検索値」がない!ということですので
お示しの画像のB列にSheet2のA列にないデータを入力するとそういったエラーが表示されます。

画像のセル配置ですと
C4セルに
=IF($B4="","",VLOOKUP($B4,Sheet2!$A:$C,COLUMN(B1),0))
(「$」マークの位置に気を付けてください)
という数式を入れD4セルまでオートフィルで...続きを読む

Qテキストボックスの入力抑制

使用言語はVB.NETです。

フォームAのテキストボックスAに文字を入力し確定すると、
フォームBが起動、フォームBのテキストボックスには、
テキストボックスAで入力した内容が表示されており、それを
変更することはできない。
ただし、テキストボックスAに何も入力せずに起動した場合、
テキストボックスBの内容は書き換え可能、というようなものを
作りたいと思っています。

また、テキストボックスBを入力不可にするには、Enabled=False
以外の方法で行いたいのです。
例えば、テキストボックスAで1と入れた場合、テキストボックスBの
初期表示1をBSで消しても、違う値をいれても、常に1に表示が戻される、
というようなものにしたいのですが…。

上記のようなものを作るには、どのように処理を作っていけば
良いのでしょうか?
サンプル的なコードを教えていただけるとありがたいです。
よろしくお願いします。

Aベストアンサー

こんにちは。

テキストボックスを入力不可にする方法として、Enabled=False以外ではReadOnlyプロパティをTrueにする方法があります。

フォームAのテキストボックスAのValidatedイベントに

Form2.TextBox1.Text = Me.TextBox1.Text
If Me.TextBox1.Text = "" Then
Form2.TextBox1.ReadOnly = True
Form2.TextBox1.BackColor = Color.White
Else
Form2.TextBox1.ReadOnly = False
End If
Form2.Show()

と入れます。

どうでしょうか。

Qエクセル(Excel) 納品書の作り方【改めて】

昨日http://oshiete.goo.ne.jp/qa/7348426.htmlで質問させていただき、詳しくご回答いただき少し進んだのですが、状況が変わったので改めて質問させていただきます。

■エクセル(Excel)で納品書の作成をしています。
シート1に納品書、シート2に商品マスタ(一覧)を作っていて、シート2の一覧を反映させて
納品書に番号を打ち込むだけで、商品名・単価までが出るシステムを作りたいのですが、
昨日のご回答の中の「VLOOKUP」?を入れて、自分なりにマス目の数字を変えてやってみたのですが
反映されずN/?のようなエラーになってしまいます。

※画像が貼り付けてあります。商品名は1番以外伏せさせていただいています。
くっつけてありますが、左側がシート1・右側がシート2です。

1、上記のように、シート2との関連付けの係数を、写真の場合の数字で教えてください。

2、合計と、合計から20%を引いた数値を割り出す関数も、写真の数字で御願いします。

宜しくご教授お願い致します。

Aベストアンサー

画像がいまいちよく見えないのですが、納品書の項目は左から、No、商品番号、商品名、単価、数量、金額でいいのでしょうか(名前は多少違っていても意味があっていればもんだいないです)

でしたら、
C1セルに=IF(ISBLANK(B2),"",VLOOKUP(B2,Sheet2!$A$2:$C$200,2,FALSE))
D1セルに=IF(ISBLANK(B2),"",VLOOKUP(B2,Sheet2!$A$2:$C$200,3,FALSE))
E1セルは空白で
F1セルに=IF(D2="","",D2*E2)
といれて、C1からF1までをコピーしてその下の行にタテに貼り付ければ出来ますよ。
おそらくエラーが出たのは、コピーしたときにVLOOKUP関数の最初のセルの指定がずれてしまっているのでは無いかと思いますよ。     

Q印刷ダイアログの印刷ボタンを押す方法?

VBでChromeを制御して、表示した画面を印刷するアプリを作成しています。[Ctrl]+[Shift]+[P]キー入力で表示されるWindowsの印刷ダイアログ上の[印刷]ボタンを押す方法をご教示して頂きたくお願いします。

環境はつぎのとおりです。
o OS:Windows 7 Pro. 64bit SP1
o VB:VB 2010 Express
o Chrome:Ver.49.0.2623.87 m

ダイアログで設定する内容は、デフォルトのままでよいので[印刷]ボタンを押すだけです。
よろしくお願いします。

Aベストアンサー

sendkeyで操作なさっているのだと想像しましたが、制御するのは同様の方法しかないのではと思います。

手元にChromeが無いので確認できてはいませんが、デフォルトでショートカットが設定されていればそれを、設定がなくても多くのブラウザではダイアログ表示時点でそのまま「印刷」がデフォルトになっていると想像しますので、リターンキーで印刷されませんか?

手元にあるブラウザで試してみたところ
 IEはショートカットAlt+Pでもリターンキーでも印刷される
 Fxはショートカットは無し、リターンキーで印刷される
という状況でした。

ご参考まで。

Qエクセル2007でプルダウンで選んだものに反応

Excel2007でプルダウンで選んだものに反応して隣のセルが自動入力される方法(エクセル2007)
A1をプルダウンで「猫」「犬」から選べるようにし、「猫」を選んだ場合B1に自動に「111」が、「犬」を選んだ場合B1に自動に「222」と入力されるようにしたいです。
ご教授の程、宜しくお願いします。

Aベストアンサー

VLOOKUP関数での方法です。
(1)別シートに入力文字列と対応コード表を作成。(仮にSheet2のA:B列範囲で順不同)
(2)B1に=IF(COUNTIF(Sheet2!A:A,A1),VLOOKUP(A1,Sheet2!A:B,2FALSE),"")を設定
   入力文字列が存在しない場合は空白としています。

Qテキストボックス内でキー入力

例えば、テキストボックス内でF1を押した時に
あるプログラムを走らせたいのですが、
F1を押したかどうかは、どうやって判定すれば良いのでしょうか?

Aベストアンサー

こんにちは。

以下の2つのイベントの内のどちらかひとつ、を使います。

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyF1 Then
    MsgBox "F1キー"
  End If
End Sub
'
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyF1 Then
    MsgBox "F1キー"
  End If
End Sub

参考に。
VBE画面から、F2キー、で、オブジェクトブラウザを開き、
KeyCodeを検索すれば、MSForms.ReturnIntegerの一覧が見られます。
(MSFormsのコントロールを使った後でないと表示されませんが)


以上です。


人気Q&Aランキング

おすすめ情報