• ベストアンサー

エクセル vba userform について

現在USERFORMを使用してますが、つまずいています。 たとえば、TEXTBOX1がブランクならばコマンドボタンにフォーカス?をもっていきたいのです。 IF TEXTBOX1="" THEN コマンドボタン1.SETFOCUS ELSE TEXTBOX2.SETFOCUS END IF のような形にしてますが、うまくいきません コマンドボタンを押すとシートにそれぞれ反映されるように作成はできております。 余計なタブ操作をしたくありません。 よろしくお願いします

  • a32
  • お礼率6% (7/109)

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんな感じでしょうか? Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)      On Error GoTo ErrorHandler   Application.EnableEvents = False   If Me.TextBox1 = "" Then     Me.CommandButton1.SetFocus   Else     Me.TextBox2.SetFocus   End If    ErrorHandler:   Application.EnableEvents = True    End Sub

その他の回答 (1)

  • Dainty
  • ベストアンサー率45% (27/59)
回答No.2

どこに記述していますか? テキストボックスのイベントプロシージャに記述すれば動作すると思いますが。 例えば、 TextBox1_AfterUpdate() とか TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) とか。

関連するQ&A

  • Vba UserForm SetFocus

    ExcelのVbaでUserForm上に英単語のタイピング練習のソフトを作ろうとしていますが、うまくいきません。コントロールのイベントについての理解が不足しているのが分かりました。 ユーザフォーム上の複数のテキストボックス間のフォーカスの移動について教えて下さい。 UserForm1にテキストボックスを3つ、コマンドボタンを1つ配置しました。それぞれTextBox1、TextBox2、TextBox3、CommandButton1とします。 Private Sub CommandButton1_Click() TextBox3.SetFocus ・・・(1) End Sub Private Sub TextBox3_Enter() MsgBox "In TextBox3" TextBox2.SetFocus ・・・(2) End Sub 各TextBoxのTabStopプロパティは「True」、「TabIndex」は番号順になっています。 コマンドボタンのTabStopプロパティは「False」にしています。 フォームを表示し、コマンドボタンをクリックするとエラーが発生します。 (2)の実行の後(?)、(1)がエラー表示されます。 各イベントの発生のタイミング、連鎖、終了等の理解が不足していて、その理由がよく分かりません。どなたか教えていただけないでしょうか。よろしくお願いします。

  • エクセルのユーザーフォームについて

    パスワード入力用のしかけです。 ワークシートに配置したコマンドボタンを押してユーザーフォームを呼び出します。 Private Sub CommandButton1_Click() UserForm1.Show End Sub ユーザーフォームにはテキストボックスとコマンドボタンを配置しております。 テキストボックスのPasswordCharには * を設定しました。 Private Sub CommandButton1_Click() If StrConv(TextBox1.Text, vbLowerCase) = "abcd" Then MsgBox "OK!" Unload Me Else TextBox1.Text = "" TextBox1.SetFocus End If End Sub これで、ABCDまたはabcdと入力され、ユーザーフォーム上のコマンドボタンをクリックすれば、ユーザーフォームは消えます。 でも、いちいちマウスでクリックするのが面倒なのでEnterキー1回でユーザーフォームを消したいのです。 今でも、一度Enterキーを押すと、ボタンにフォーカスが移動するので、さらにEnterで消えますが、二度ではなくEnterキー1回でユーザーフォームを消すにはどうすればよいのでしょうか? ユーザーフォームは使ったことがないのでわかりません。 よろしくお願いします。

  • テキストボックス 空白確認

    エクセル VBAで コマンドボタンをクリックすると テキストボックスに空白があった場合 空白のテキストボックスにセットフォーカスしたいのですが 下記のように少ない場合は まだいいですが 多くなってきたとき見易さの面でも簡単にしたいのですが VBだとコントロール配列のインデックス値をループ処理 すればよいと思いますがVBAだとどのようにすればいいのでしょうか? Private Sub CommandButton3_Click() If TextBox2 = "" Then TextBox2.SetFocus ElseIf TextBox3 = "" Then TextBo3.SetFocus ElseIf TextBox4 = "" Then TextBox4.SetFocus ElseIf TextBox5 = "" Then TextBox5.SetFocus End If 御願いします。

  • エクセルVBAのユーザーフォームでのチェックボックス

    PCでエクセル2003です シートのC列に0か1を表示したいのです。 いまのままではTUREかFALSEになってしまいます。 また、コマンドボタンで行を上下させるとチェックボックスのレ点も反映させたいのです。 あと、ボタンを押すたびにシート上も行がアクティブ(選択状態→A列を選択)になるにはどうすればいいのでしょうか? 上下移動のコマンドボタンに 下の関数をつけたらエラーが出て出来ませんでした Cells(1, myRowN).Select あとTEXTBOX3にはA列の行番号付けてるのを取得してますが、アクセスのレコードの様に数字を入力するとその行に飛ぶことって可能でしょうか? 具体的な関数は Private Sub UserForm_Initialize() myRowN = Worksheets("元").Range("a65536").End(xlUp).Row Call ChangeMe(myRowN) End Sub Private Sub CommandButton4_Click() '下に移動 If myRowN <= 65535 Then myRowN = myRowN + 1 Call ChangeMe(myRowN) End If 'Cells(1, myRowN).Select TEXTBOX1.SetFocus End Sub Private Sub CommandButton3_Click() '上に移動 If myRowN >= 3 Then myRowN = myRowN - 1 Call ChangeMe(myRowN) End If 'Cells(1, myRowN).Select TEXTBOX1.SetFocus End Sub Private Sub ChangeMe(lngRowNum As Long) TEXTBOX1.ControlSource = "B" & myRowN TEXTBOX2.ControlSource = "C" & myRowN   CHECKBOX1.ControlSource = "D" & myRowN   TEXTBOX3.ControlSource = "A" & myRowN End Sub 非常に長々と申し訳ありません、フォーム等に詳しい方がいらっしゃればお教え願えないでしょうか?

  • Excel ユーザーフォーム呼び出し時エラー

    WindowsVista HomePremium Excel 2007 Microsoft Visual Basic 6.5 です。 Excelでユーザーフォーム(UserForm1)を作り、   Sub Auto_Open()     UserForm1.Show   End Sub で起動時に呼び出すようにしました。 確認のため、一度Excelを閉じ起動し直したところ正常に動作しました。 もう一度確認のため同じように再起動をすると、  実行時エラー '2110': コントロールが表示されていない、利用できない、またはフォーカスを持てないため、そのコントロールにフォーカスを移すことはできません。 と出て、それ以降何度やっても動作しなくなってしまいました。 解決法か原因がわかる方いらっしゃいましたら、ぜひご教授ください。よろしくおねがいします。 ユーザーフォーム関係のコードを以下に書いておきます。(内容は小遣い帳のようなものです。) ―――――――――――――――――――― Private Sub CommandButton1_Click() Dim NUM As Integer If TextBox1.Text = "" Then MsgBox "概要が記入されていません。" TextBox1.SetFocus GoTo 100 ElseIf TextBox2.Text = "" Then MsgBox "収支が記入されていません。" TextBox2.SetFocus GoTo 100 ElseIf ComboBox1.ListIndex = -1 Then MsgBox "収支の種類が選択されていません。" ComboBox1.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = TextBox1.Value If CheckBox1 = True Then TextBox2 = -TextBox2 End If If ComboBox1.ListIndex = 0 Or ComboBox1.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox1.ListIndex + 1) = TextBox2.Value Else ActiveCell.Offset(0, ComboBox1.ListIndex + 2) = TextBox2.Value End If TextBox1 = "" TextBox2 = "" CheckBox = Falses ComboBox1.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton2_Click() Dim NUM As Integer If TextBox3.Text = "" Then MsgBox "移動金額が記入されていません。" TextBox3.SetFocus GoTo 100 ElseIf ComboBox2.Text = "" Then MsgBox "移動元が選択されていません。" ComboBox2.SetFocus GoTo 100 ElseIf ComboBox3.ListIndex = -1 Then MsgBox "移動先が選択されていません。" ComboBox3.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = "移動" If ComboBox2.ListIndex = 0 Or ComboBox2.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox2.ListIndex + 1) = -TextBox3.Value Else ActiveCell.Offset(0, ComboBox2.ListIndex + 2) = -TextBox3.Value End If If ComboBox3.ListIndex = 0 Or ComboBox3.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox3.ListIndex + 1) = TextBox3.Value Else ActiveCell.Offset(0, ComboBox3.ListIndex + 2) = TextBox3.Value End If TextBox3 = "" ComboBox2.ListIndex = -1 ComboBox3.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton3_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub CommandButton4_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub UserForm_Initialize() myarray1 = Array("収支", "クレジット", "郵便局", "机", "500", "1") For i = 0 To 5 ComboBox1.AddItem myarray1(i) ComboBox2.AddItem myarray1(i) ComboBox3.AddItem myarray1(i) Next i TextBox1.SetFocus End Sub

  • VBAでのユーザーフォーム上でのタブオーダーの移動の方法

    やりたい事を以下に書きます。  ユーザーフォームで入力用のTEXTBOXがいくつかあり、TABINDEXが最初のTEXTBOXから順に入力していきます。  1つのTEXTBOXに入力完了後した場合、TABキーまたは、ENTERにより次のTEXTBOXにフォーカスが移動し、最後にコマンドボタンにを押すと入力が完了するというフォームを作っています。  ただし、最初のTEXTBOXに『99』を入力すると、途中のTEXTBOXへのフォーカスの移動はしないで最後のコマンドボタンにフォーカスが移動するようにしたいと考えています。 問題点を以下に書きます。  TEXTBOXの入力完了を現在、「AfterUpdate」イベントでつかまえて、TEXTBOXの値を取得し、その値が『99』だった場合、コマンドボタンにフォーカスを移動するようにコーディングしています。 こんな感じです。(かなり省略していますが、) Private Sub TextBox1_AfterUpdate() If TextBox1.Value = "99" Then CommandButton1.SetFocus Exit Sub End If End Sub この用にコーディングすると、TABINDEXが二つ後ろのTEXTBOXが入力待ち状態となってしまいます。 たとえば TEXTBOXが3つコマンドボタンが1つのフォームだと、 TEXTBOX1に『99』と入力し、上記のコーディングだと一度コマンドボタンにフォーカスが移動したあと、最後にTEXTBOX3にフォーカスが移動して入力待ち状態となる感じです。 色々試しましたが、解決方法が見つかりません。知っている方いましたら、教えてください。

  • エクセル VBA ID入力について

    TextBox2に数字をIDを入力して 名前をComboBox1.Text に表示させるようにしました。 しかし、数字入力すると認識される物もあるのですが 表示されない=数字の値は同じ数字 なぜなのでしょうか? Private Sub TextBox2_Change() Dim vRet As Variant vRet = Application.VLookup(TextBox2.Text, _ Sheets("マスタ").Range("A:B"), _ 2, _ False) If VarType(vRet) <> vbError Then ComboBox1.Text = vRet Else ComboBox1.Text = "<< 該当なし >>" End If End Sub Private Sub UserForm_Initialize() With TextBox2 .SetFocus .Text = "ID入力"  .SelLength = Len(.Text) End With 教えて下さい!Sheet2の数字の書式が問題なのでしょうか?

  • Excel VBA SetFocus

    環境:Excel 2002です UserForm1での質問です Flame5にTextBox14とTextBox15があります TextBox14とTextBox15のBeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)後 Flame2にあるTextBox1にSetFocusしたいのですがエラーが発生します 実行時エラー 2147467259(800004005) 異なるFlameにSetFocusする方法があるのでしょうか? Flame5の中でTextBox14及びTextBox15のSetFocusはできます TextBox14とのTextBox15のBeforeUpdateのプロシージャです Private Sub TextBox14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox14.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox14.Text) Me.TextBox15.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If Me.TextBox1.SetFocus End Sub Private Sub TextBox15_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox15.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox15.Text) Me.TextBox14.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If UserForm1.TextBox1.SetFocus End Sub ご支援願います

  • EXCEL2003 VBA リストボックス

    お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

  • Excel VBAでIF~Thenの入れ子がうまくできません。

    いつもお世話になってます。 IF~Then~EndIfにIFを入れていますがうまくいきません。よろしくお願いします。 Private Sub CommandButton10_Click() Dim i As Long Dim 最終行 As String Dim サーチ行 As Long Dim 行 As Long Dim 列 As Long If TextBox33.Value = "" Then MsgBox "使用量を入力してください。" Else If TextBox11 <> "" Then TextBox26 = TextBox33 * TextBox11 / 100 '成分1 End If If TextBox12 <> "" Then TextBox25 = TextBox33 * TextBox12 / 100 '成分2 End If Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls" Sheets("shinki").Activate 最終行 = (Range("B2").End(xlDown).Row) '商品名の行検索 サーチ行 = 0 For i = 2 To 最終行 If ComboBox3.Value = Range("B" & i) Then Workbooks("データ物質試薬管理.xls").Close savechanges:=False '保存しない Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls" Sheets("kongou").Select Range("A65536").End(xlUp).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm11.TextBox16.Value 'CAS Cells(行, 列 + 1) = UserForm11.TextBox21.Value '使用日 Cells(行, 列 + 2) = UserForm11.TextBox29.Value '使用者 Cells(行, 列 + 4) = UserForm11.TextBox26.Value '成分1使用量 Cells(行 + 2, 列) = UserForm11.TextBox18.Value 'CAS Cells(行 + 2, 列 + 1) = UserForm11.TextBox21.Value '使用日 Cells(行 + 2, 列 + 2) = UserForm11.TextBox29.Value '使用者 Cells(行 + 2, 列 + 4) = UserForm11.TextBox24.Value '成分3使用量 Cells(行 + 2, 列 + 5) = UserForm11.TextBox32.Value '種類 Cells(行 + 2, 列 + 6) = UserForm11.TextBox34.Value '単位 Cells(行 + 2, 列 + 7) = UserForm11.ComboBox3.Value '商品名 Workbooks("データ物質試薬管理.xls").Close savechanges:=True 'showhinに在庫管理する Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls" Sheets("showhin").Select Range("A65536").End(xlUp).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm11.TextBox2.Value '品名コード Cells(行, 列 + 1) = UserForm11.ComboBox3.Value '商品名 'Cells(行, 列 + 2) = UserForm9.TextBox3.Value '1本の量 'Cells(行, 列 + 3) = UserForm9.TextBox4.Value '本数 Cells(行, 列 + 4) = UserForm11.TextBox34.Value '単位 Cells(行, 列 + 5) = UserForm11.TextBox32.Value '種別 Cells(行, 列 + 6) = UserForm11.TextBox21.Value '使用日 Cells(行, 列 + 7) = UserForm11.TextBox29.Value '使用者名 Cells(行, 列 + 9) = UserForm11.TextBox33.Value '使用量 Workbooks("データ物質試薬管理.xls").Close savechanges:=True MsgBox "登録しました。" End If サーチ行 = i Exit For 'End If Next If サーチ行 = 0 Then MsgBox ComboBox3.Value & "商品は登録されておりません。" & Chr(10) & "「新規商品登録」ボタンから入力してください。" End If End If If TextBox21.Value = "" Then '使用量 MsgBox "使用日を入力してください。" End If ComboBox3.SetFocus End Sub

専門家に質問してみよう