痔になりやすい生活習慣とは?

Excel2003を使用しています。

テキストボックスを複数作成しました。
そのテキストボックスに入力をどんどんしていきたいので、Tabキーを使用したいと思っています。
その際に次のボックスに移動する順番を指定したいのです。

現時点ではTabキーを押していくと、
名前ボックスに「テキスト1」「テキスト3」「テキスト4」「テキスト2」の様に表示され、
順番もバラバラになっています。

何か良い方法はありませんでしょうか。
宜しくお願い致します。

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

A 回答 (8件)

またまた登場、myRangeです。



>このキーダウンイベントは、
>1つ1つ入力していくしか方法はありませんでしょうか?
>(現在はTextBox[3]の[]の部分を手作業で次々と増やしていってみています)

面倒でもその方法が現時点での質問者にとっては簡単確実な方法だと思われます。

参考までにいうとコピペしないでやる方法を2つほど挙げることができます。

(1)VBAでコードを自動生成する方法
(2)Classを作成し擬似的にTextBoxのコントロール配列を作成する方法
(因みに、どちらのコードも30行程度でできるでしょう)

これらの利点としては、TextBoxに増減があってもコードの変更の必要がないことです。
増減があったときは、1回実行すればOK。
例えば、TextBoxを50個追加したとすると、
50個追加した後で1回実行すれば、その50個もtabで飛ぶようになるというこです。

但し、(1)はちょっとした制限があるのでそれを解除する必要があります。

これらはコード的には短いものですが少々VBAの知識を要しますので、
変更があったときに対処できないできない(質問から判断)でしょうから
今の時点では地道にコピペを繰り返した方がベターだと考えます。
以上です。
 
    • good
    • 0

IF文を入れ忘れてました



Private Sub MoveTab(nTextBoxNo As Integer, ByVal KeyCode As MSForms.ReturnInteger)

Dim sTextBoxNo As String
Dim arryaTab As Variant

If KeyCode <> 9 Then ' TABキーのKeyCode
Exit Sub
End If

arryaTab = Array(4, 3, 1, 2)
'TextBox1 -> TextBox4
'TextBox2 -> TextBox3
'TextBox3 -> TextBox1
'TextBox4 -> TextBox2

sTextBoxNo = "TextBox" & arryaTab(nTextBoxNo - 1)

Sheets("Sheet1").OLEObjects(sTextBoxNo).Activate

End Sub
    • good
    • 0

コントロールとイベント関数は1対1なので、コントロールを追加したら、関数も自分で追加しないといけません



(VBのコントロール配列がVBAでも使えたらできるのですけどね)



横着関数を作ってみました
MoveTab()のarryaTabでTAB順を定義しますので、TAB順番の変更が楽にできます

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Call MoveTab(1, KeyCode)

End Sub

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Call MoveTab(2, KeyCode)

End Sub

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Call MoveTab(3, KeyCode)

End Sub

Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Call MoveTab(4, KeyCode)

End Sub

Private Sub MoveTab(nTextBoxNo As Integer, ByVal KeyCode As MSForms.ReturnInteger)

Dim sTextBoxNo As String
Dim arryaTab As Variant

arryaTab = Array(4, 3, 1, 2)
'TextBox1 -> TextBox4
'TextBox2 -> TextBox3
'TextBox3 -> TextBox1
'TextBox4 -> TextBox2

sTextBoxNo = "TextBox" & arryaTab(nTextBoxNo - 1)

Sheets("Sheet1").OLEObjects(sTextBoxNo).Activate

End Sub
    • good
    • 1

myRangeさん 感謝です(目から鱗)


オートシェイプのテキストボックスに気づきませんでした

オートシェイプのイベント制御はできそうですけど、難度が高いです
http://www.vbalab.net/vbaqa/data/excel/log/tree_ …

TextBoxコントロールに変更するか、オートシェイプのテキストボックスをタグ順になるように貼りなおす

かですね。。。
★混乱させてすみません

この回答への補足

nagare様
myRange様
本当にありがとうございました!!!
だいぶ理解が出来、Tabキーで移動する事ができました!

本当に申し訳ないんですが、
最後に1つだけ質問させて下さい。

このキーダウンイベントは、
1つ1つ入力していくしか方法はありませんでしょうか?
(現在はTextBox[3]の[]の部分を手作業で次々と増やしていってみています)

補足日時:2010/02/05 15:32
    • good
    • 0

回答者のnagareさんへ、、、



質問の文言に

>名前ボックスに「テキスト1」「テキスト3」、、、様に表示され

とありますから、質問者のいうテキストボックスは、
図形ツールバーからの「テキストボックス」ではないでしょうか。

●質問者のテキストボックスでは質問の件はできませんねので
どうしてもというなら、nagareさんのTextBoxを使ってください。

「コントロールツールボックス」ツールバーにあるTextBoxコントロールです。

以上です。
 
    • good
    • 0

VBA自体が動かないのでしょうか?



・マクロのセキュリティ レベル
 セキュリティ レベル を[中]にする必要があります
http://g.www.ms.akadns.net/japan/office/ork/2003 …

・コードの確認
 VBAのデザインモードで、Excel上のTextBox1をWクリックしてください
 VBAエディタがTextBox1_KeyDownを開けばOKです
 開かなければ、コピペする場所を間違えてます

★わからない用語を使っていましたらすみません
    • good
    • 0

Forms.TextBox.1の方でしたか(解答したのはUserFormでのやり方でした)



キーダウンイベントでやるしかないようです
こんな感じです

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = 9 Then ' TABキーのKeyCode
TextBox2.Activate
End If

End Sub

この回答への補足

何度もスミマセン。
しかも本当に初歩的な話になってしまうと思うのですが、、、

書いて下さったキーダウンイベントを実行してみたいのですが、
方法が分からなくて…
お時間のある時で良いので教えて頂けないでしょうか。

一応、書いて頂いた

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = 9 Then ' TABキーのKeyCode
TextBox2.Activate
End If

End Sub

をVBを開いて実行させたいSheetのコードにコピペしてみたのですが、
上書き保存して再度開いてみても変わりありませんでした。
やはり方法が間違っているのでしょうか。

宜しくお願い致します。

補足日時:2010/02/04 16:28
    • good
    • 0

TabIndexプロパティで設定します


設定値は0から順番に設定します
今回の場合だと
「テキスト1」←0
「テキスト2」←1
「テキスト3」←2
「テキスト4」←3
★TabStopプロパティがTrueであること

補足:TabIndexプロパティの値は必ず「ユニーク」になりますので、同じ値を設定すると、自動でずれますので注意してください

この回答への補足

早速のご回答ありがとうございました!
TabIndexとの事ですが、これはVBでという事でしょうか?
テキストボックスは普通にExcelの画面で作成しているのですが、
それでも設定できますかね??
初歩的な質問で申し訳ないのですがどうぞ宜しくお願い致します。

補足日時:2010/02/04 14:29
    • good
    • 1

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

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

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

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

Qエクセルで、任意のテキストボックス等にフォーカスを移したい

すいません、またまた質問です。

エクセルXPで、ユーザーフォーム上に
複数のテキストボックスやリストボックスを
置いて入力した値が任意のシートのセルに
入力されるというものを作っています。
(しかしながらVBAがほとんど見様見真似レベル
なのでかなり悪戦苦闘(~_~*))

そこで、ユーザーフォームにて例えばTEXTBOX1に
入力後、Enterで次のテキストボックス(又は
リストボックス)にフォーカスを移したいのですが、
その時に任意のテキストボックス等にフォーカスを
移すことは可能でしょうか。

番号順(なのかな?)に自動でフォーカスを
移動させることはできたのですが、任意の対象へ
移動させるやり方とかってあるのでしょうか。

例えばTEXTBOX1からRISTBOX5へ移すとか。

入力する順番に移動できたらユーザーフォーム上での
入力作業が非常に楽になると思って(^o^;)

どうぞよろしくお願いします。

Aベストアンサー

#2 tommy-pie83 さんのご回答で良いとおもいますが、
その作業は面倒なので、

VBE でフォームオブジェクトを表示した状態で、
[表示]-[タブオーダー]

で調整です。ちなみに、フォーカスを取得させない
コントロールなら、「TabStop」プロパティーを
False にします。

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QUserformの入力順序をタブオーダーでなく、VBAで指定したい。

ExcelVBAでUserformを作成しているのですが、入力順序をタブオーダーではなく、VBAの中で指定したいのです。
 なぜタブオーダーではダメかと言いますと、IF文などの条件分岐で、その都度、入力順序を変化させたいのです。
 
Userform1.TextBox1.TabIndex=0
Userform1.Show

 と書いたら指定できるかなと思ったのですが、うまくいきません。
入力順序を指定するのはTabIndexを使うのではないかと思うのですが、上記ではなぜうまくいかないのでしょうか。
 どのように書けばうまくいくのでしょうか。
 よろしくご指導願います。

 

Aベストアンサー

takaandhiroさん、こんばんは。

Private Sub TextBox1_Change()
if XX=1 then   
TextBox2.SetFocus
else
TextBox3.SetFocus
end if
End Sub

などのように、SetFocus で入力順序を変更できます。

QエクセルVBA ユーザーフォームのTextBoxを日付にしたい

いつもいつも 皆様からのお返事を心待ちにしておりますNannyです。

VBAのユーザーフォームでTextBoxを日付専用入力にしたいのです。

で、入力方法が 20050219 というような形で入力して、2005/02/19という形か、平成17年2月19日というような形に持って行って、セルに貼り付けしたいのです。

出来なさそうな予感満載なのですが、皆様お返事の程宜しくお願い致します。
(出来ないのであればあきらめられるので、出来るかどうかのお返事も期待しております。

宜しくお願い致します。

Aベストアンサー

下記はTextBox1に20050219としCommandButton1をクリックするとシート1のA1に2005/2/19と出力します。
Private Sub CommandButton1_Click()
Worksheets(1).Range("A1").Value = Format(TextBox1.Text, "0000""/""00""/""00")

End Sub

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

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

Aベストアンサー

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

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

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QVBA コンボボックスで選んだ値を取得するには

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

Aベストアンサー

原因については下記を参考にしてください。
http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg5.shtml

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む


人気Q&Aランキング