Excel VBAで違うSubからtextbox_keypressをコールする方法について

このQ&Aのポイント
  • MSForms.ReturnIntegerのコードを使用して、Excel VBAで異なるSubからtextbox_keypressを呼び出す方法を調べています。しかし、vbKeyReturnを正しく渡せません。エラー「実行エラー91 - オブジェクト変数またはWithブロック変数が設定されていません」が表示されます。どなたか間違いを教えていただけませんか?
  • Excel VBAで異なるSubからtextbox_keypressを呼び出す方法について調べています。vbKeyReturnを受け渡す際にエラーが発生し、「実行エラー91 - オブジェクト変数またはWithブロック変数が設定されていません」と表示されます。正しい方法を教えていただけませんか?
  • Excel VBAで別のSubからtextbox_keypressを呼び出す方法に関して質問があります。vbKeyReturnを適切に渡す方法を探していますが、エラーが発生し、メッセージ「実行エラー91 - オブジェクト変数またはWithブロック変数が設定されていません」が表示されます。何が間違っているか教えていただけますか?
回答を見る
  • ベストアンサー

MSForms.ReturnInteger

Excel VBAで 違うSubから textbox_keypress をコールしたいのですが、 vbKeyReturnを受け渡せません。 ****************************************** Private Sub StartButton_Click() Dim KeyCode As MSForms.ReturnInteger If EngTypeStartButton.Caption = "" Then KeyCode.Value = vbKeyReturn <---ここでエラーになる。 Call TextBox_KeyDown(KeyCode, 0) End If End Sub ****************************************** 『実行エラー91 オブジェクト変数またはWithブロック変数が設定されていません』 と表示されます。 vbKeyReturnの代わりに13としても結果は同じです。 受け側のSubは以下のような始まりです。 Private Sub TextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) このSubは正常に動作しています。 どなたか私の間違いを教えていただけないでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
noname#144013
noname#144013
回答No.4

こんにちは。 当方も詳しいことは判りませんが、既に回答されているように、 『MSForms.ReturnInteger』に関しては、以下のような制限があるようです。 『MSForms.ReturnInteger』は、あくまでテキストボックス等のコントロールの 「KeyDown」とか「KeyPress 」等のキーイベント用のプロシージャの引数の型 にのみ適用されるものであり、そのオブジェクト自体を単独で、ユーザーが 操作できるものではないようです。 言い換えると、『MSForms.ReturnInteger』は、Excelアプリケーション側 のみが管理するオブジェクトのようです。 ただし、次のような使い方はできるようです。 '== [TextBox]のキー押下イベント処理 == Private Sub TextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)   Dim myKeyCode As MSForms.ReturnInteger '←ReturnIntegerオブジェクトの変数宣言   Set myKeyCode = KeyCode  '←ReturnIntegerオブジェクトの取得   Debug.Print "KeyCode="; myKeyCode.Value '←キーコードの表示   Debug.Print "Shift="; Shift   Set myKeyCode = Nothing   '←ReturnIntegerオブジェクトの解放 End Sub 従って、ご提示のような方法で、テキストボックスのキー押下イベントを 擬似的に発生させることはできないと思われます。 テキストボックスへEnterキーを送りたいのであれば、SendKeysステート メントを使用すれば可能だと思います。 SendKeysを使用して、ご提示のプロシージャを改造するとすれば、以下 のようになると思います。(※以下は一例です) '== [Start]ボタンのクリックイベント処理 == Private Sub StartButton_Click()   ''Dim KeyCode As MSForms.ReturnInteger '←使用しない   If EngTypeStartButton.Caption = "" Then     ''KeyCode.Value = vbKeyReturn      '←使用しない     ''Call TextBox_KeyDown(KeyCode, 0)   '←使用しない     TextBox.SetFocus   '←テキストボックスへフォーカスを移す     SendKeys "{ENTER}"  '←[Enter]キーを送る   End If End Sub 『TextBox_KeyDown』のイベントプロシージャ側は、変更せずにそのまま 使用できると思います。 以上です。

その他の回答 (3)

  • w_HIRO_w
  • ベストアンサー率47% (9/19)
回答No.3

簡単に言うと「MSForms.ReturnInteger型」は使用せず、単に「Integer型」を使用する方法を提示したつもりだったのですが、うまく伝わらず・・・すみません。 コメントにあった内容を利用して、案を以下に記載します。 Private Sub EngTypeStartButton_Click() '<<<<< 削除 ここから '  Dim KeyCode As MSForms.ReturnInteger <-----(1) '  Dim Key As Integer '  Key = vbKeyReturn '>>>>> 削除 ここまで   If EngTypeStartButton.Caption = txtStart Then     Call NextButton_Click <-----(3)これは正常に動作しています。     EngTypeStartButton.Caption = txtProcessing     EngTypeTextBox.SetFocus   Else '<<<<< 変更 ここから '    KeyCode.Value = vbKeyReturn <-----(2)(ERROR) '    Call EngTypeTextBox_KeyDown(KeyCode, 0)     Call sample(vbKeyReturn, 0) '>>>>> 変更 ここまで   End If End Sub Private Sub TextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '>>>>> 例 ここから   ※今までの内容をsample関数へコピー。   Call sample(KeyCode, Shift) '<<<<< 例 ここまで End Sub '>>>>> 新規 ここから Private Sub sample(ByVal inKeyCode As Integer, ByVal inShift As Integer)   ※ここの内容は、TextBox_KeyDown関数の内容をコピーして変数名を合わせてください。   If inKeyCode = vbKeyReturn Then     MsgBox "Return Key"   Else     If inShift = 0 Then       MsgBox "Not Return Key"     Else       MsgBox "Shift Key"     End If   End If End Sub '<<<<< 新規 ここまで

  • w_HIRO_w
  • ベストアンサー率47% (9/19)
回答No.2

> また、エラーがcallにくる前の行の keycode.value=vbKeyReturnで発生するのを回避する方法があればよいのですが。 integer型の変数では、駄目でした? Private Sub xxxxx   Dim 変数A as Integer   (省略)   変数A = vbKeyReturn   (省略) End Sub

cya26222
質問者

お礼

ありがとうございます。 以下の様に変更してみたのですが、同じ結果でした。 Private Sub EngTypeStartButton_Click() Dim KeyCode As MSForms.ReturnInteger <-----(1) Dim Key As Integer Key = vbKeyReturn If EngTypeStartButton.Caption = txtStart Then Call NextButton_Click <-----(3)これは正常に動作しています。 EngTypeStartButton.Caption = txtProcessing EngTypeTextBox.SetFocus Else KeyCode.Value = vbKeyReturn <-----(2)(ERROR) Call EngTypeTextBox_KeyDown(KeyCode, 0) End If End Sub (1)をIntegerにすると、起動する前にエラーになります。 (2)は起動後このSubのイベントが発生した時に最初に申し上げたエラーになります。 (3)正常に呼び出して実行しています。

  • w_HIRO_w
  • ベストアンサー率47% (9/19)
回答No.1

TextBox_KeyDown()はイベントなので、Call命令では呼び出しできないと思います。 ちょっと考え方を変えて、以下のようにしては如何でしょうか。 簡単に言うと「TextBox_KeyDown()」で記述している内容を外出しにして、「TextBox_KeyDown()」と「StartButton_Click()」からそれぞれ呼び出す。 Private Sub StartButton_Click()   Dim KeyCode As MSForms.ReturnInteger   If EngTypeStartButton.Caption = "" Then     KeyCode.Value = vbKeyReturn <---ここでエラーになる。     'Call TextBox_KeyDown(KeyCode, 0)     Call KeyDown_Event()   End If End Sub Private Sub TextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)   Call KeyDown_Event() End Sub Private Sub KeyDown_Event()   'ここに「TextBox_KeyDown()」で、記述していた内容を記述。 End Sub

cya26222
質問者

お礼

ありがとうございます。 そうしたいのですが、textbox_keydown()の中でreturnとshiftにより判断しているので、 keydown_event()とした時にやはりキー情報を受け渡さなければなりません。 そこで同じvkeycode.value=keycodeでエラーになってしまいます。 それとbutton_click()は他のsubからcallできるのでtextbox_keydown()もcallできるのではと思ってしまいました。 また、エラーがcallにくる前の行の keycode.value=vbKeyReturnで発生するのを回避する方法があればよいのですが。

関連するQ&A

  • エクセルBVAのフォーム式のKeyCode~の意味がわかりません

    エクセルBVAです Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyDown Then KeyCode = 0 End If End Sub ヘルプをみると キーを押したとき、およびキーを離したときに続いて発生します。KeyDown イベントはキーを押すと発生し、KeyUp イベントはキーを離すと発生します。 キーってenterのことですかね? なら、 If KeyCode = vbKeyDown Then KeyCode = 0 End If で、KeyCodeを0ににするってどういうことでしょうか?

  • TextBoxに連続で入力する方法

    Form1に、TextBox1とTextBox2を配置しています。 TextBox1にKey入力を受け、Enter Keyで取り込む動作を、連続して行うためのプログラムを作ってみましたが、何故かEnter Keyの後、カーソルがTextBox2に移動してしまいます。Enter Keyの後、TextBox1.SetFocusで、カーソルをTextBox1にしているのですが何故が解らず困っています。Enter Kyeの後、カーソルがTextBox1に戻るようにするには、どのようにすれば良いのか教えて下さい。 PC環境は、OS=Win10 Excel=2010 です。作ったプログラムは以下の通りです。よろしくお願いします。 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyReturn Then Sheets("Sheet1").Range("A1") = TextBox1.Value TextBox1 = "" TextBox1.SetFocus End If End Sub

  • エクセル VBA タブストップに対する質問2

    下記の「エクセル VBA タブストップに対する質問」に書き込みした者ですが、一難去ってまた一難です。又、暗雲が漂ってきました。 条件は下記といっしょで テキストボックスが1~5まであり、テキストボックス2~4まではデータが入っています。 全てのTabStopはTrue、TabIndexは順に1~5が入っています。 テキストボックス1に何もデータを入れないで、Enterが押された場合、 テキストボックス1をアクティブにしたいのですが、下記で質問した回答で動かしても、きちんと動いてくれません。 どうかご指導よろしくお願いいたします。 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then 'ENTER If TextBox1.Value = "" Then TextBox1.SetFocus End If End If End Sub このコードでテキストボックス1に何も入れずにEnterを押すとテキストボックス2がアクティブになってしまいます。

  • VBA ユーザーフォームの Keypreview について

    いつもお世話になっています。 VBAのユーザーフォーム上で、KeyDown イベントを使いたいのですが、下のコードが動きませんでした。 Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If e.KeyCode = Keys.z Then MsgBox "効いてるよ!" End If End Sub エラー表示も出ません。 ウェブで調べたところ、VBでは「KeyPreview」プロパティーを「true」にすれば解決するという記事をあちこちで見かけましたが、VBA(Excel2003)のユーザーフォームプロパティには、そのような項目が見当たりません。コード上で無理やり設定してみるとエラーになります。 どのようにすれば解決するでしょうか? お知恵をお貸し下さい。

  • エラー時カーソルを戻したいのですが?

    エクセルVBAに入出荷(在庫管理)を作成しているのですが テキスト1に品番を入力して品番が無かった場合 テキスト1などを空白にしてテキスト1にカーソルを 戻したいのですが下記のように書き込むとテキスト2に カーソルが行ってしまいます。どこを直せばいいでしょうか? Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim i As Integer If KeyCode = 13 Then For i = 4 To 400 If Sheets("倉庫在庫(記入用)").Cells(i, 1) = TextBox1 Then Label6 = Sheets("倉庫在庫(記入用)").Cells(i, 4) Label7 = Sheets("倉庫在庫(記入用)").Cells(i, 5) TextBox2.SetFocus Exit Sub End If Next i MsgBox "品番がありません!" TextBox1 = "" Label6 = "" Label7 = "" End If TextBox1.SetFocus End Sub

  • VBA 同様処理の簡素化?

    エクセル VBAで下記のようにテキストボックスの処理を 書き込みました。 Private Sub TextBox24_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub Private Sub TextBox25_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub テキストボックス24、25内の処理は同じなのですが テキストボックスが増えた場合、修正することも考えて 簡素化したいのですが、どのように行なえばいいでしょうか?

  • VBA書き込み数値の加算?

    エクセル2000のVBAにて下記のコードを書き込み コマンドボタン1にてエクセルに入力処理後 Label8数値の加算をエクセル関数SUNを使用して =SUM(E4:E1000)を行ったのですが、加算数値が0になってしまいます。 =E4+E5+E6・・・・だと加算した数値が表示されます。 (さすがにこれは避けたいです) 何か方法があると思いますが教えていただけますでしょうか? Dim i As Integer Dim k As Integer Private Sub CommandButton1_Click() With ActiveSheet For k = 4 To 1000 If .Cells(k, 1) = "" Then .Cells(k, 1) = TextBox1 .Cells(k, 2) = Label6 .Cells(k, 3) = Label7 .Cells(k, 4) = TextBox2 .Cells(k, 5) = Label8 TextBox1 = "" Label6 = "" TextBox2 = "" Label7 = "" Label8 = "" Exit Sub End If Next k End With End Sub Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then Label8 = Application.WorksheetFunction.Round(Val(Label7) * Val(TextBox2), 0) Label8 = Format(Label8, "#,##0") End If End Sub

  • 同じコマンドボタンからマウスカーソルがはなれたら

    フォーム上のコマンドボタンにマウスカーソルが触れたら色を付ける、 同じコマンドボタンからマウスカーソルがはなれたら 、また色を変える、 という動きをvbaで行いたいのですが、 Private Sub cmd_test_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 180, 200) End Sub で、マウスカーソルが触れたら色を付けることはできたのですが、 マウスカーソルがそのコマンドボタンから離れたら色を変えるという動きができません。 Private Sub cmd_test_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub をしても、マウスカーソルが離れても色が白になりませんでした。

  • EXCEL VBA フォームコード簡素化

    EXCEL VBAのフォームにテキストボックスを複数作成しております。 下記のように複数のテキストボックスで同じ処理を行うのですが コントロール→ループか何かで簡素化できないでしょうか? Private Sub TextBox17_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox17.Value = Format(TextBox17.Value, "0.00") End Sub Private Sub TextBox18_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox18.Value = Format(TextBox18.Value, "0.00") End Sub Private Sub TextBox19_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox19.Value = Format(TextBox19.Value, "0.00") End Sub Private Sub TextBox20_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox20.Value = Format(TextBox20.Value, "0.00") End Sub Private Sub TextBox21_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox21.Value = Format(TextBox21.Value, "0.00") End Sub Private Sub TextBox22_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox22.Value = Format(TextBox22.Value, "0.00") End Sub 以上お力添えお願いいたします。

  • エクセル vbaについて その2

    前回質問させていただき問題が解決しました。 さらにいろいろ付け加えたいので質問させていただきます。 前回のマクロです。 Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then n = TextBox1.Value For i = 1 To n Cells(10, "A") = i TextBox1.PrintObject = False 'テキストボックスは印刷しない Range("a1:j10").PrintOut '範囲は適当に修正のこと MsgBox i '確認用 Next i End If End Sub 今回作成したいものが、両面シールで通し番号を打ちますが、100枚あれば表面に1から50裏面に51から100としたいのです。 印刷枚数を指定して且つ裏印刷の時には、51からのようにしたいと思っております。 どの様に上記vbaに組み込めばよろしいでしょうか? よろしくお願いいたします。

専門家に質問してみよう