Excelのテキストボックスでうまく動作しない

このQ&Aのポイント
  • Excelのテキストボックスで数字を入力しても、フォーカスが移動しない問題が発生しています。
  • また、2桁の数字を入力する際にもフォーカスが移動してしまうという問題もあります。
  • 現在の設定が正しく動作しないため、最適な方法を教えてください。
回答を見る
  • ベストアンサー

excelのテキストボックスで、うまく動作しない

a列に行間隔不等で1~100の数字を記入してあります。 このセル番地を検索する為、テキストボックスで、以下の記述を試しましたが、うまくいきません。 1、lostfocusに設定すると、 テキストボックス入力後、エンターキーを押してもフォーカスが移動しない。 2、changeに設定すると、 2桁数字を入力できない。(1数字だけでフォーカスが移動してしまう) 設定の不備な点、 あるいは、規定の検索メニュウ使用以外で、 最適の方法を教えてください。 Private Sub TextBox1_Change() Dim dx dx = Application.WorksheetFunction.Asc(TextBox1.Value) With ActiveSheet.Range("a:a") Set c = .Find(dx, LookIn:=xlValues) If Not c Is Nothing Then c.Activate Else MsgBox "該当なし" End If End With TextBox1.Value = "" End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 1. のおっしゃっていることは、どういう意味なのかよくわかりませんが、 以下のような、Enterキーなどのコードをイベントにして起動するとよいと思います。 また、WorksheetFunctionを使うと、ここではありえないことですが、それでも、エラーがあると、エラートラップを付けない限りは、エラーを解除できませんので、できる限り、VBAの関数を使うようにしてください。 後、Findメソッドは、これに関わらず、なるべく複数のオプションは入れておく習慣をつけておいたほうが無難です。 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _    ByVal Shift As Integer)  Dim dx As String, c As Range  If KeyCode <> 13 Then Exit Sub 'Enter =13  dx = StrConv(TextBox1.Value, vbNarrow)  With ActiveSheet.Range("A:A")   Set c = .Find(dx, LookIn:=xlValues, LookAt:=xlWhole)   If Not c Is Nothing Then    c.Activate    Else    MsgBox "該当なし"   End If  End With  TextBox1.Value = "" End Sub

hakobulu
質問者

お礼

早々にご回答いただきまして、恐縮です。 思い通りに動作いたしました。 誠にありがとうございます。 ・KeyDownの動作 ・StrConv関数 ・Findで「LookAt:=xlWhole」を使う ・Dim dxだけでなく、「 As String」「 c As Range」と宣言するなど、 素人にとっては、非常に有り難い、密度の濃い内容でした。 細やかなお心遣い、感謝いたします。 「If KeyCode <> 13 Then Exit Sub」の意味だけが、 ちょっと調べてみたのですが、?でした。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >If KeyCode <> 13 Then Exit Sub キーボードから発生するコードを、制御コード」と呼ぶとは思いますが、  Enter キーは、コード   13  Tab キーは、コード     9  Back Space キーは、コード 8 など、キーの入力によって制御コードが、発生します。 それらの中のひとつです。 もし、ご自分で調べる場合は、 ● If KeyCode <> 13 Then Exit Sub VB Editor 画面の左端をクリックして、ブレークポイント(●)を置きます。 そうして、TextBox に、Enter を入れると、VB Editor 画面が現れます。 そこで、 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) ここの KeyCode のところにマウスポインタを置くと、 「KeyCode = 13 」 というポップアップが現れるはずです。 試してみてください。

hakobulu
質問者

お礼

重ね重ね、恐れ入ります。 大変勉強になりました。 また、何かの折にはよろしくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

#1 の Wendy02 です。 追伸: >1、lostfocusに設定すると、 やっと意味がわかりました。それは、コントロールツールのTextBox なのですね。TextBox は、都合、3つありますから、それが何を指すのか分からないことがあります。 私は、Userform の TextBox だと思ってしまいました。 ただ、#1 の回答で間違いがないかとは思います。

hakobulu
質問者

お礼

ありがとうございます。 間違いありませんでした。

関連するQ&A

  • エクセルマクロ_テキストボックスをシートに反映(その2)

    エクセルマクロ初心者です。(2003使用_ユーザーフォーム) 先ほどは大変お世話になりました。 複数行に応用させようとしたのですが、管理番号が余計に記載(テキストボックス(出荷日など)が空欄であっても、管理番号だけはとられてしまいます)されてしまいます。すみませんが、ご教授よろしくお願いいたします。 リストボックス1のデータは、Sheet1を表示しています。→管理番号はSheet2のA最終行に記載されます。 テキストボックス1(回答日)は、上記の管理番号記載のとなりに、 テキストボックス2(出荷日)は、テキストボックス1記載のとなりに、 ・・・とテキストボックス4(コメント)(これはK列)に1行で記載されます。 ↑ここまでは、教えていただいたので、完璧なのですが、 テキストボックス2~4までの内容を、あと複数行(4件)追加できるように試してみたのですが、空欄であっても管理番号だけは常に記載されてしまいます。 テキストボックス2と5に記載されている場合は、Sheet2に値を反映させるが、空欄の場合は、値を反映させないようにしたいのです。 (Sheet1=データベース) C5   D5 管理番号 品名 アカ12 りんご アオ56 みかん クロ34 なし クロ89 すいか アオ12 もも (Sheet2=入力シート) A(管理番号)    B(回答日)    C(出荷日)   D(数量)     K(コメント) アオ56        8月9日        8月10日      75     送り先の確認 アオ56                    8月11日      80 クロ34        9月4日        9月5日      80 (今回は、2行で作成した場合のマクロを記載しました) Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "0;0;50;50" .ColumnCount = 4 .RowSource = "Sheet1!A5:D" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row End With End Sub Private Sub CommandButton1_Click() If TextBox2.Value Then Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox1.Value) Then .Range("B" & lRow + 1).Value = TextBox1.Value End If If IsDate(TextBox2.Value) Then .Range("C" & lRow + 1).Value = TextBox2.Value End If If IsNumeric(TextBox3.Value) Then .Range("D" & lRow + 1).Value = TextBox3.Value End If .Range("K" & lRow + 1).Value = TextBox4.Value End With End If If TextBox5.Value Then Dim llRow As Long With Worksheets("Sheet2") llRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & llRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox5.Value) Then .Range("C" & llRow + 1).Value = TextBox5.Value End If If IsNumeric(TextBox6.Value) Then .Range("D" & llRow + 1).Value = TextBox6.Value End If .Range("K" & llRow + 1).Value = TextBox7.Value End With End If Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then myCtrl.Value = vbNullString End If Next End Sub (ユーザーフォーム) リストボックス1=Sheet1のデータを反映 テキストボックス1(回答日) テキストボックス2(出荷日),テキストボックス3(数量),テキストボックス4(コメント)←1件目 テキストボックス5(出荷日),テキストボックス6(数量),テキストボックス7(コメント)←2件目 ↑1件目のみでコマンドボタンを押した場合は、1件目のみの管理番号取得をしたいのです。が今は、2件目が空欄でも管理番号はとられてしまいます。 長くなってしまいすみません。 どなたかご回答いただければ幸いです。よろしくお願いいたします。

  • エクセルVBA テキストボックスへのセットフォーカスについて

    エクセルVBAでユーザーフォーム内に配置されたテキストボックス への数値の入力時に、指定範囲内になければメッセージボックスで 規格外であることを警告し、その規格外が入力されたテキストボックス を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが どうすればよいのでしょうか? 自分で考えた構文です。 Private Sub TextBox1_AfterUpdate() Dim A As Single A = TextBox1.Text If A < 1.99 Or A > 3.00 Then MsgBox "規格外!!"     TextBox1.Text = "" TextBox1.SetFoucus End If Exit Sub End Sub これですと、次のテキストボックスにフォーカスが移動してしまいます。 次のテキストボックスにフォーカスを移動させずに、規格内の値が 入力されるまでフォーカスを移動させない方法を教えて下さい。 お願い致します。

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • エクセルVBAでユーザーフォームのテキストボックス

    ユーザーフォーム上にテキストボックスを8個設置しました。 そこに数値が入力された場合は自動的にカンマ区切りが表示されるように以下のコードを書きました。 これで希望の動きはしてくれるのですが、このやりかたは正しいでしょうか? また、テキストボックスは8個あるので、それぞれに下記のように8通りコードをかかなければいけないのでしょうか?ご教示ください。 Private Sub TextBox1_Change()   If IsNumeric(TextBox1.Value) Then Application.EnableEvents=False     TextBox1.Text = Format(TextBox1.Value, "#,##0") Application.EnableEvents=True   End If End Sub 途中(2~7)略 Private Sub TextBox8_Change()   If IsNumeric(TextBox8.Value) Then Application.EnableEvents=False     TextBox8.Text = Format(TextBox8.Value, "#,##0") Application.EnableEvents=True   End If End Sub

  • Excel VBA テキストボックスを検索

    テキストボックス3に数値を入力し ExcelのA列にあるか検索をかける。 ある場合は、B列の同じ行に 「みーつけた!」と入力。 その設定で組んでみたのですが、 テキストボックス3にデータを6桁入力しようとすると 6桁目にオーバーフローエラーが出ます。 このプログラムの何処がおかしいのでしょうか? Private Sub TextBox3_Change() Dim Number As Integer If TextBox3.Value <> "" Then '空じゃない場合 Number = TextBox3.Value Call 検索(Number) MsgBox TextBox3.Value End If End Sub Sub 検索(ByVal Number As Variant) Dim FoundCell As Range Set FoundCell = Range("A:A").Cells.Find(What:=Number, lookat:=xlPart) If FoundCell Is Nothing Then Else FoundCell.Activate Range("O" & ActiveCell.Row).Value = "みーつけた!" End If End Sub

  • Excel オーダーフォームのテキストボックス入力について

    オーダーフォームを作成し、テキストボックスを2つ以上作成し、コマンドボタンを1つ作りました。 同じ行ですべてを入力できるようにしたいのですが、どうしたらよいでしょうか? テキストボックス1の値を入力するためのコマンドは、最下位の行を探してそこに入力するようなコマンドを作っているはずです…その横の列にテキストボックス2の値を入力し、その横の列にテキストボックス3の値を入力し…というようにしていきたいのです。 Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = TextBox1.Value End With TextBox1.Value = "" TextBox1.SetFocus End Sub

  • エクセルVBA テキストボックス

    いつもお世話になっております。 エクセルでVBAを使いユーザーフォームのテキストボックスで 文章入力をしようと思っているのですが、少しトラブルがありましたのでお教え願います。 エクセルシートの横がa~k、縦を9~34までのシートを結合して その中にテキストボックスで入力した文章を入れるように作っています。 MultiLineとEnterKeyBehaviorをTrueにして Private Sub CommandButton1_Click() Unload Me End Sub Private Sub TextBox1_Change() Sheets("sheet1").Range("a9") = UserForm1.TextBox1 End Sub Private Sub UserForm_Initialize() TextBox1.Value = Range("a9").Value End Sub Private Sub UserForm_Activate() With Me .Left = Application.Left .Top = Application.Top .Left = .Left + 350 .Top = .Top + 80 End With End Sub という状態になっているのですが、文章を入力して16行目で改行するとシートの方で「#VALUE!」と出てきてしまうので一旦ユーザーフォームを閉じてもう一度フォームを立ち上げると 「実行時エラー’-2147352571(80020005) Valueプロパティが設定できません。種類が一致しません。」 と出てきます。 デバッグすると  Private Sub CommandButton1_Click() → UserForm1.Show  End Sub と出てきます。 なにがおかしいのでしょうか? 今回初めてVBAを作っているので初歩的な間違いかもしれませんがよろしくお願いします

  • ユーザーフォームのテキストボックスでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 上から順番に入力した際、テキストボックス5に値を入たら、 listのシートから該当するもの(項目は20個)をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

  • エクセル ユーザーフォームテキストボックスについて

    テキストボックスからセルへの入力について教えていただきたいのですが、 ネットからサンプルを落として勉強しております。 以下のコードを下の画像のように見出しを3から7まで項目を増やしたい場合、 どの部分を書き換えたらいいのでしょうか? よろしくお願いいたします。 Private Sub CommandButton1_Click() Dim LASROW As Long Dim f As Long With Worksheets("Sheet1") 'A列の最終行を取得 LASROW = .Range("A" & CStr(Rows.Count)).End(xlUp).Row 'セルに書き込み For f = 0 To 2 .Range("A" & CStr(LASROW)).Offset(1, f).Value = Me.Controls("TextBox" & f + 1).Value Next End With 'TextBox1,2,3をクリア For f = 1 To 3 Me.Controls("TextBox" & f).Value = "" Next 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub

  • エクセル2003 ユーザーフォームにてフォーカスの有無の判断

    いつも勉強させていただいております。 今回、エクセルのユーザーフォームを用いて、入力画面を作成 しております。 で、日付を入力するテキストボックスが2箇所有り、 その入力をMSフォームカレンダーから入力させようと 考えております。 この日付を入力するテキストボックスは、それぞれ異なる 日を入力させたいのですが、カレンダーをクリック したときに、フォーカスの在る方に入力する形を考えています。 でご質問なのですが、 「フォーカスの在るほうに」 と言う分岐コードの書き方がわかりません。 宜しくお願いいたします。 Private Sub Calendar1_Click() 'if textbox3にフォーカスが在るならば<<書き方がわかりません TextBox3.Value = Calendar1.Value end if 'if textbox4にフォーカスが在るならば<<書き方がわかりません TextBox4.Value = Calendar1.Value end if End Sub こう言う書き方は出来ないものでしょうか?

専門家に質問してみよう