質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

2931閲覧

タブキーを押した時にフォーカス部分を次に入力出来る部分にしたい

ma2hiro

総合スコア159

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/11/16 09:26

編集2020/11/17 01:48

お世話になっております。

今現在excel内のVBAで簡単な見積もりシステムを修正しています。
(作成した人は退職しております。)

それで
文字列を入力する所でTabキーを押すと文字列内に\tとタブが入ってしまい
使いづらいので 入力出来る次のフォーカス部分に移動させたいのですが
なんという語句でググれば出てくるのかご助力いただけないでしょうか?

無効にする方法は
https://www.officepro.jp/excelvbaform/form_textbox/index8.html

object.TabKeyBehavior = Boolean 編集領域の中で、タブ文字を許可するかどうかを設定します。

と分かったのですが次に入力できる部分にフォーカスしたいのです。

大変基本的な事で申し訳ないのですが
上記何か情報をお持ちな方はコメントいただけますと嬉しく思います。

【説明不足なので追記】
VBAのフォームで「MultiPage」で作成しているページにて
Ctrl+tab で 次の項目に移動させたいのです。
(例えばコントロールパネル>ネットワークとインターネット の
インターネットオプション で 上部の【全般】【セキュリティ】等を
Ctrl+Tab で移動するように実装したい。)

そのような挙動を実装するにはどのような語句でググれば良いのか
伺ってよろしいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2020/11/16 11:16

ユーザーフォーム上での話ですか。 シート上での話ですか。
ma2hiro

2020/11/16 23:52

hatena19さん 失礼しました。 ユーザーフォーム上の話です。
guest

回答5

0

イメージ説明

投稿2020/11/20 05:35

syousuke.33

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ma2hiro様 プロパティウインドでTabキー又はEnterキーを
押した時のフォーカスの順番設定の仕方は理解されたでしょうか
プロパティウインドでその他にいろいろ設定の仕方があります
今回はマクロでフォーカスの順番設定の仕方を・・ということ
ですが。ネットで調べてみましたがこれといった結果が得られ
ませんでした。私も独学の知識です いろいろテストしてみました
これでいいのかな?というマクロが出来ましたので。参考までに
添付いたします
はたして これで良いのか、ジャドウなのかは分かりませんがね!

プロパティウインドで設定変更出来るのに 何も時間かけてまで
初心者がマクロ組む必要があるのかな?と感じています
私は無料のメールマガジンで覚えました。
ここでの回答者様のソースコードは初心者さまには高度しすぎる
初心者の方はシートの動きや、セルの動き(移動)とソースコード
の動きとの関連が目で確認(可視化)できれば覚えやすいですよね!

 VBA
Sub Macro1()’標準モジュール
UserForm1.TextBox1.IMEMode = 1
UserForm1.Show
End Sub
’UserFormコード
Private Sub TextBox1_Change()

With UserForm1.TextBox4
.SetFocus
.TabIndex = 3
.IMEMode = 1
End With
End Sub
Private Sub TextBox2_Change()

With UserForm1.TextBox1
.SetFocus
.TabIndex = 0
.IMEMode = 1
End With
End Sub
Private Sub TextBox3_Change()

With UserForm1.TextBox2
.SetFocus
.TabIndex = 1
.IMEMode = 1
End With
End Sub
Private Sub TextBox4_Change()

With UserForm1.TextBox3 .SetFocus .TabIndex = 2 .IMEMode = 1

End With
End Sub
イメージ説明

投稿2020/11/20 05:34

syousuke.33

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ma2hiro

2020/11/20 05:38

syousuke.33様 コメントありがとうございます。 基本通りのやり方もしっかり学んだ方が良いですね…… 頑張ります。 コメントありがとうございました。
guest

0

ma2hiro様の意向に合うかどうか分かりませんが、画像添付します。
マルチページの移動は [Ctrl]+[PageUp]キーの代わりに直接 マルチページの
タイトルをクリックで画面が変わります。それからTextBox1(TabeIndex[0])の
入力が終わり[Enter]キーが押されたら次にフォーカスしたいTextbox3の場合TextBox3(TabeIndex[2])のTabeIndexの番号を[1]に変更すると、
TextBox1からTextBox3にフォーカスされます。いかがでしょうか。

イメージ説明

投稿2020/11/17 12:34

syousuke.33

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ma2hiro

2020/11/19 06:40

syousuke.33様 コメントありがとうございます。 ですが私が勉強不足なため仰っている事の理解が追いつきません…… ``` +タブ  Index 0 ``` とあり 次のタブには ``` +タブ  Index 1 ``` その次のタブには ``` +タブ  Index 2 ``` と昇順に採番されているのですが こちらをVBAで操作する方法が分かりません…… どういった語句でググれば良いのかお伺いしてよろしいでしょうか?
ma2hiro

2020/11/19 08:10

あ……普通に マルチページのタイトルをクリックで画面が変わる方法ではいかがか? という事だったのですね…… 要望としてマウスを使わずに移行したかったので方法を知りたく書き込みしました。 コメントありがとうございました。
guest

0

ベストアンサー

マルチページ(MultiPage1)の1ページ目にテキストボックス(TextBox1)があるのなら、KeyDownイベントに下記のように設定すればいいでしょう。すべてのテキストボックスにこのようにKeyDownイベントを設定します。(MultiPage1.Value=0 で1ページ目選択になります。)

vba

1Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 2 If Shift = 2 And KeyCode = vbKeyTab Then 3 KeyCode = 0 4 Me.MultiPage1.Value = 1 5 End If 6End Sub

マルチページにテキストボックスが多数あると同じコードを繰り返し記述することになるので、クラスモジュールを使ってイベントの共通化をすると、イベントを一か所に記述するだけですみます。

クラスモジュールを挿入して、オブジェクト名を、exTextBox にします。
そこに下記のコードを記述します。

vba

1Option Explicit 2Private WithEvents TB As MSForms.TextBox 3 4Public Sub SetCtrl(new_ctrl As MSForms.TextBox) 5 Set TB = new_ctrl 6End Sub 7 8Private Sub TB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 9 If Shift = 2 And KeyCode = vbKeyTab Then 'Ctrl+Tabキーのとき 10 KeyCode = 0 11 With TB.Parent.Parent 'テキストボックスの親(Page)の親(MultiPage) 12 If .Value = .Pages.Count - 1 Then '最終ページなら 13 .Value = 0 14 Else 15 .Value = .Value + 1 16 End If 17 End With 18 End If 19End Sub

ユーザーフォームのモジュール

vba

1Option Explicit 2 3Private TBCol As Collection 'exTextBoxクラス格納用コレクション 4 5Private Sub UserForm_Initialize() 6 Set TBCol = New Collection 7 8 Dim myCtrl As Control 9 Dim myObj As exTextBox 10 For Each myCtrl In Me.Controls 11 If TypeName(myCtrl) = "TextBox" And TypeName(myCtrl.Parent) = "Page" Then 12 Set myObj = New exTextBox 13 myObj.SetCtrl myCtrl 14 TBCol.Add myObj 15 End If 16 Next 17End Sub

以上です。

投稿2020/11/17 01:00

編集2020/11/17 13:48
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ma2hiro

2020/11/17 01:15

hatena19さん コメントありがとうございます。 自分の質問の仕方が不味いのを発見しました。 大変失礼しました。 VBAのフォームで「MultiPage」で作成しているページがあるのですが Ctrl+tab で 次の項目に移動させたいのです。 (例えばコントロールパネル>ネットワークとインターネット の  インターネットオプション で 上部の【全般】【セキュリティ】等を  Ctrl+Tab で移動するように実装したい。) そのような挙動を実装するにはどのような語句でググれば良いのか 伺ってよろしいでしょうか? この度は不十分な質問で大変失礼しましたが 上記ご助力いただけますと嬉しく思います。
ma2hiro

2020/11/17 04:13

hatena19さん コメント修正ありがとうございます。 ``` マルチページ(MultiPage1)の1ページ目にテキストボックス(TextBox1)があるのなら、 ``` とコメント頂けたので実装してみると (MultiPage1)の1ページ目に ``` Private Sub TextBox_x_mei_KeyDown( : ``` (MultiPage1)の2ページ目に ``` Private Sub TextBox_y_mei_KeyDown( : ``` (MultiPage1)の3ページ目に ``` Private Sub TextBox_z_mei_KeyDown( : ``` と指定すればそれっぽく動作しました。 ですが各MultiPage内に page1 TextBox_x_mei TextBox_x_tanni TextBox_x_tanka page2 TextBox_y_mei TextBox_y_tanni TextBox_y_tanka page3 TextBox_z_mei TextBox_z_tanni TextBox_z_tanka とありMultiPage内の全てに記載するのは手間がかかるので このMultiPage内は全てCtrl+Tabで動作するとするようには出来ないのでしょうか? グーグルで調査しても見つけられなかったためご助力頂きたくコメント失礼致します。 ご返答いただけますようお願いいたします。
hatena19

2020/11/17 04:36

設定で簡単にできればいいのですが、私も検索してみて見つからなかったのでこの提案をさせて頂きました。 クラスモジュールをイベントの共通化をすれば一か所の記述ですみます。難易度は高いですが、興味があれば「VBA クラスモジュール イベントの共通化」で検索すればコード例が見つかりますので、チャレンジしてみてください。
ma2hiro

2020/11/17 05:49

hatena19さま 度々ありがとうございます。 「VBA クラスモジュール イベントの共通化」で検索してみます。 本当にありがとうございました。 助かりました。皆様に助言出来るように学んでいきますっ
hatena19

2020/11/17 13:52

クラスモジュールのサンプルコードを回答に追加しましたのでご参照ください。
ma2hiro

2020/11/19 08:34

hatena19さん クラスモジュールのサンプルありがとうございます。 コードが理解出来るようしっかり学ぼうと思います。本当に助かりました。 ちなみになのですがhatena19様は独学でクラスモジュール等を学ばれたのでしょうか? オススメの書籍などございましたらお教え頂けますと嬉しく思います。 amazonで探してもココらへんの記述がありそうな書籍を見つけられなかったのです…… 度々申し訳ないのですが以上お問い合わせいたします。
ma2hiro

2020/11/19 09:22 編集

自分の知識が深められる書籍のオススメをお教えいただけないでしょうか?
hatena19

2020/11/20 00:57

私の場合はWEB上の解説サイトやサンプルコードをみて学習しました。 ただ、読むだけでは身につかないので、実際にコーディングしながら試行錯誤する中で徐々に理解が深まっていったという感じですね。
ma2hiro

2020/11/20 01:10

hatena19さん コメントありがとうございます。 Web上のサンプルコードや解説サイトで学習ですね…… 通勤時間内に書籍でもあれば勉強が捗ると思ったのですが そのような便利なものは無いのですね…… 私も実際にコーディングしながら技術を学んでいきます。 ありがとうございました。
guest

0

すいません。

Ctrl+PageUp,PageDown
で出来るのでとりあえずこちらで対処してもらいます……

でもMultiPageでCtrl+Tabの方がWindowsに則っている気がするので
手段をご存知な方はどういった語句でググれば良いのか
お教えいただけますようお願いいたします。

投稿2020/11/17 02:03

ma2hiro

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ma2hiro

2020/11/17 08:20 編集

VBA クラスモジュール イベントの共通化 でググった方法のメモをこちらに表記失礼します。 なんか https://binary-star.net/excel-vba-event-commonalizeによると ``` クラスモジュール「Class1」を、以下の内容にします。 ``` と表記してありクラスモジュールで出来るらしい…… でも実際に実装するのはUserForm7だけなんだよな……(+_+) だからUserForm7で”コードの表示”ってやる所に追加したい…… って ``` Option Explicit Private myCol As Collection 'コレクション生成 Private Sub UserForm_Initialize() Set myCol = New Collection Dim myCtrl As Control 'コントロール変数の宣言 Dim myObj As Class1 'インスタンス変数の宣言 For Each myCtrl In Me.Controls If TypeName(myCtrl) = "TextBox" Then Set myObj = New Class1 'インスタンス生成 myObj.SetCtrl myCtrl 'コントロールセット myCol.Add myObj 'コレクション追加 Set myObj = Nothing 'インスタンス破棄 End If Next End Sub UserForm1のコード内容は、共通化前の時より大きくかわります。 ``` とhttps://binary-star.net/excel-vba-event-commonalizeに表記あるので Class作ったあとUserForm7に実装してみます。
ma2hiro

2020/11/19 09:24

hatena19さんに 不要な情報を出してしまったのでメモすれっどに貼り付けます…… ちなみに私は >クラスモジュールを挿入して、オブジェクト名を、exTextBox にします。 のオブジェクト名どのように変更するのかが分からないレベルです…… VBAforApplications7.0を使用しています…… あ……そちらは表示>プロパティウィンドウで変更出来ました。 自分の知識が深められる書籍のオススメをお教えいただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問