- ベストアンサー
Excel VBA tabキーでtextを移動
Excelシート上のテキストボックスやコンボボックスに入力後、TABキーで次のボックスに移動することを考えています。 keycode=9でTABキーを検出し textbox1.activate としてもtextbox1にカーソルが立ちません。 TABキーで移動して即入力できるようなプログラムはできないでしょうか?
- ken-nosuke
- お礼率78% (140/178)
- Visual Basic
- 回答数3
- ありがとう数2
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 > keycode=9でTABキーを検出し > textbox1.activate としてもtextbox1にカーソルが立ちません。 やり方としては合っていて、通常は正しく遷移しますから、 詳細に原因を探ってみた方が良さそうですが、 実行時エラーに[なる|ならない] とか、 textbox1.activate MsgBox textbox1.Name と並べて実行してみて、狙い通りのオブジェクトを捉えているか みたいに、参照が正しいか確認するとか、 実は、縦細長の"キャレット"が表示されているけれど、 期待している"カーソル"とは違う、という意味、 とか、 旧バージョン固有の(特定状況下の)現象、 とか、 各コントロールに変更を加えたプロパティ設定によって コントロールのフォーカスを無効にしている場合、 とか、 情報量的に、実物ブックを見れば判りそうでも、 ノーヒントで正解出せるほど易しい問題ではないように感じます。 > TABキーで移動して即入力できるようなプログラムはできないでしょうか? Excel VBAの範疇で言えば、UserFormを奨める方が (いづれにしても不足を補う工夫は必要ですが相対的に) 却って簡単になりそうですから、直球回答かな、とは思います。 でも、そういうことは期待してないみたいですね。 プログラムというのも、「Excel VBA以外」という解釈が自然かも知れませんが、 お応え出来ることも限られているので、 昔書いてたVBAから抜粋したものを紹介しておきます(こちらでは動作確認済)。 ひょっとしたら、この中に答えやヒントが見つかることもあるのかも、と。 以下、掲載するスクリプトの説明。 SetEvTxtSh1を実行して、Classのイベントを 起動、または再起動してください。 とりあえず、auto_openで起動する例を添えています。 ※ ThisWorkbook_OpenイベントからCallする必要がある場合は、 ontimeメソッド等でタイミングを遅らせてCallするように 注意して下さい。 Tabキー、Enterキー、↑キー、↓キー、等、 TextBox、ComboBox の UserForm上での TabStopコントロール間移動の挙動に 近付ける意図で書いてあります。 既に設定値のあるボックスに遷移する時は、 テキストを全選択した強調表示になるようにしています。 oleobject.activate を実行する時には、一旦、 Excelに制御を渡した方が動作が安定して、トラブルを減らせる というような仕様が、昔はあったような、、、。 試しにやってみたらマシな挙動にはなります。 (画面がチカチカするのは、どの方法でも避けようがないみたい) activecel.activate oleobject.activate みたいに素直に書くと、oleobjectに渡したキーストロークが シートにも渡って、セル選択が遷移してしまうので、 ontimeメソッドで待機(態と非同期に)してから。 実行させてます。(★ 1~★ 4が呼び出し順) シート上でグループ化されたボックスも対象にします。 遷移する順(TabIndex相当)については 指定が判りませんから仮に配置順です。 例えばこれを、 新規ブック、お使いのブック、双方動作させてみて、 どうなるか確かめるだけでも、 原因特定には繋がることもあるのかな、とは、思います。 ' ' 〓 Module1 〓 Option Explicit Public colClass As New Collection Public oOLE As OLEObject Public cnCls As Long ' ' // Private Sub Auto_Open() SetEvTxtSh1 End Sub ' ' // Public Sub SetEvTxtSh1() SetEvTxtBxes Sheets("Sheet1") ' 要◆シート指定 End Sub ' ' // Private Sub SetEvTxtBxes(wsh As Worksheet) Dim oShapeP As Shape Dim oShape As Shape Dim d If colClass.Count Then Exit Sub For Each oShapeP In Sheet1.Shapes On Error Resume Next d = oShapeP.GroupItems.Count On Error GoTo 0 If d Then For Each oShape In oShapeP.GroupItems If oShape.Type = msoOLEControlObject Then Set oOLE = oShape.DrawingObject If oOLE.progID = "Forms.TextBox.1" Or oOLE.progID = "Forms.ComboBox.1" Then cnCls = cnCls + 1 colClass.Add New Class1, CStr(cnCls) End If End If Next End If Next For Each oOLE In wsh.OLEObjects If oOLE.progID = "Forms.TextBox.1" Or oOLE.progID = "Forms.ComboBox.1" Then cnCls = cnCls + 1 colClass.Add New Class1, CStr(cnCls) End If Next End Sub Public Sub ActOLE(p) ' ★ 3 ActiveCell.Activate colClass(p).Activate End Sub ' ' 〓 〓 ' ' 〓〓〓 Class1 〓〓〓 Option Explicit Private WithEvents TextBox As MSForms.TextBox Private WithEvents ComboBox As MSForms.ComboBox Private myOLE As OLEObject Private nIndex As Long ' ' // Private Sub Class_Initialize() Set myOLE = oOLE Select Case oOLE.progID Case "Forms.TextBox.1": Set TextBox = myOLE.Object Case "Forms.ComboBox.1": Set ComboBox = myOLE.Object End Select nIndex = cnCls Debug.Print nIndex, myOLE.Name, myOLE.Index End Sub Private Sub Class_Terminate() Set myOLE = Nothing: Set TextBox = Nothing: Set ComboBox = Nothing End Sub Private Sub TextBox_Keydown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim nDir As Long Select Case KeyCode Case vbKeyTab, vbKeyReturn: If Shift Then nDir = -1 Else nDir = 1 Case vbKeyDown: nDir = 1 Case vbKeyUp: nDir = -1 End Select If nDir Then ActivateAsync (nDir) ' ★ 1 End Sub Private Sub ComboBox_Keydown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim nDir As Long Select Case KeyCode Case vbKeyTab, vbKeyReturn: If Shift Then nDir = -1 Else nDir = 1 End Select If nDir Then ActivateAsync (nDir) ' ★ 1 End Sub ' ' // Private Function ActivateAsync(nDir As Long) ' ★ 2 Application.OnTime Now, "'ActOLE """ & (nIndex + cnCls + nDir - 1) Mod cnCls + 1 & """'" End Function Public Function Activate() ' ★ 4 myOLE.Activate With myOLE.Object .SelStart = 0 .SelLength = 255 End With End Function ' ' 〓〓〓 〓〓〓
その他の回答 (2)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
No.2です。推敲漏れがあって、訂正です。 誤) For Each oShapeP In Sheet1.Shapes 正) For Each oShapeP In wsh.Shapes 尚、こちらから補足ですが、 No.2掲載のVBAを実行する場合には、事前の準備として、 シートモジュール等に書かれている既存の記述と、 処理が重複することのないよう、注意してください。 訂正、補足、以上です。失礼しました。
- imogasi
- ベストアンサー率27% (4737/17068)
Excelのシートこそ、入力を受け付けるもの・仕組みだ。 なんで、わざわざテキストボックスにデータを入れさせて、たぶんシートのセルに入れる(移す)のか。考え方が個人の趣向に走ってないか。 ユーザーフォームを使う例なら http://www.atmarkit.co.jp/ait/articles/1404/04/news037.html を勉強すること。 エクセルの機能に、データーフォーム https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=015897 のような仕組みもある。 入力規則の「リスト」利用もある。 これらを知っていて、こういう要求を出すのか? (これらものぞむならVBAコードでも指示できる)
関連するQ&A
- TABキーで、カーソル移動したテキストの値を選択状態にしたい
現在VBでプログラムを作っております。 TABキーにて、カーソルがテキストボックスに位置付く際、入力されている 値を選択状態にしたいのですけど、これって可能ですか? 現状、TABキーを押せば、テキストボックスにカーソルが移動しますが、 仮に(テキストボックスに)100と値が入っていた場合、カーソルは100の値 の先頭に位置付き、値の修正が必要となった場合、Deleteキー等で値を消し てから、再度入力となります。 これがわずらわしいので、カーソル移動したら、そのまま選択状態とし、 入力すれば、値が上書きされるようにしたいです。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- VBAのフォーム カーソル移動
VBAのフォームでテキストボックス(1)~テキストボックス(5) まで作ったとします。 カーソルの移動はtabindexの値を順番につければいいのですが、例えばENTERキーとTABキーを両方押したときは カーソルが一つ飛ぶ制御をしたいのですがどうすればいいでしょうか? つまり カーソルがテキストボックス(1)にいる状態でENTERキーとTABキーを同時に押せばカーソルがテキストボックス(3)に移動するようにしたいのですが、お願いします
- ベストアンサー
- Visual Basic
- indesign Tabキーについて
文中で入力のときTabキーを押すと一定の間隔でカーソルが移動し空白スペースを入力したのと同じように動くと思ったのですが、Indesignで文中にTabキーを入力すると、カーソルの間隔が一定ではなくバラバラに移動するのですがこれは一定にはできないのでしょうか?どうしてそのような動きをするのでしょうか?
- ベストアンサー
- CAD・DTP
- テキストボックスでMAX文字数を入れたらTABで飛びたい
テキストボックスで、2バイト入力されたらTABで次のテキストボックス に移動すると言うイベントを4つのテキストボックスのKeyUpイベント に記述しました。 サンプルとして一つ書きます。 Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) If Len(Text1.Text) = 2 Then SendKeys "{TAB}" KeyCode = 0 End If End Sub 上記のソースでプログラムを実行し、Text1に2バイト入力されると、 次のテキストボックス(Text2)に移動します。 更にText2,Text3に、2バイト入力しますと、カーソルがText4に来ます。 ここで、マウスでText1にカーソルを持っていき、値を変更すると、 Text2に移動するはずが、Text4にカーソルが移動します。 なぜでしょうか?? くだらない質問ですが、よろしくお願いします。
- ベストアンサー
- Visual Basic
- VBAでTabキーを移動させたい
Access上のフォームで、ある結果がテキストボックスに表示されたときのみ、AというコマンドにTabキーを自動的に移動させたいのですが、 1.イベントプロシージャはフォーカス取得後なのか、喪失時なのか 2.VBAはIf文でどうかけばよいのか うまくいかなくて困っています。ご回答お願いします。
- ベストアンサー
- オフィス系ソフト
- IE で、Tab キーの設定について
HOTMAIL のホームを開いて、自分のメールの名前のボックスを入力した後、Tab キーを押したら暗号のボックスにカーソルが移動することがあります。別のパソコンで試したら、ちゃんと一発でそのようにカーソルが移動してくれません。どういう設定をすれば一発で暗号のボックスにカーソルが移動しますか?
- ベストアンサー
- ブラウザ
- カーソルが自動的に移動する方法
HTML・JSPでHPを作っているのですが4つのテキストボックスがあるとします。そこには1文字しか入力できないようになっていて1文字入力すると自動的につぎのテキストボックスにカーソルを移動させたいのですがどうしたらいいのでしょう? イメージ的にはTABキーを押した感じなのですがそのTABを押さなくても入力した瞬間に次のテキストボックスに入力できるようにしたいのです。 よろしくお願いします。
- ベストアンサー
- JavaScript
- ExcelテキストボックスのTab順番を変更したい。
Excel2003を使用しています。 テキストボックスを複数作成しました。 そのテキストボックスに入力をどんどんしていきたいので、Tabキーを使用したいと思っています。 その際に次のボックスに移動する順番を指定したいのです。 現時点ではTabキーを押していくと、 名前ボックスに「テキスト1」「テキスト3」「テキスト4」「テキスト2」の様に表示され、 順番もバラバラになっています。 何か良い方法はありませんでしょうか。 宜しくお願い致します。
- 締切済み
- オフィス系ソフト
- Tabキーが!
たとえば、ソフトは何でもいいのですが、いくつかのテキストボックスがあるとします。 そして、そのテキストボックスにそれぞれデータを入れていくわけなんですが、 今まではTabキーを押すと次のテキストボックスにカーソルが移動していたのですが、いつからかTabキーを押すと、アクティブウィンドウが切り替わるようになってしまいました。 どうしたら、アクティブを変えるのではなく、次のテキストボックスにカーソルが移動するように出来るのでしょうか? Windows98SEを使用しています。
- ベストアンサー
- Windows 95・98
- エクセル2010のTABキー設定を変えたい
エクセル2010を使っています。 TABキーの設定が変えられるか知りたく質問します。 数か月前まではエクセル2003を使っていて、 全角数字入力→TABキー→右のセルに移動 をよく使っていました。 しかし、エクセル2010だと 全角数字入力→エンター→TABキー→右のセルに移動 と、エンターを押さないといけなくなってしまいました。 エクセル2003のようにTABキーを設定しなおすことはできるのでしょうか。 どなたか詳しい方がいましたら、ぜひとも教えていただけませんか。 よろしくお願い致します。
- ベストアンサー
- その他MS Office製品
お礼
ご指導ありがとうございます。 Excelシートのセルをそのまま使うことは良いかもしれません。 入力画面には、コンボボックスやオプションボタンがあるため全て移行できるか検討してみます。