- ベストアンサー
エクセルVBAのユーザーフォームでのチェックボックスの使い方と行の移動方法
- エクセルVBAのユーザーフォームで、チェックボックスを使ってC列に0か1を表示したい場合、TRUEかFALSEを表示する問題が発生します。
- さらに、行を上下移動させるとチェックボックスの状態も反映させたい場合、関数を使用して行の移動を行う必要があります。
- また、ボタンを押すたびに行をアクティブにする方法や、数字を入力して特定の行に移動する方法もあります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Wendy02です。 >'----------------------------------------------- >'これを付け加えてください。 の部分のTextBox3 のコードの訂正します。 一行、抜けていたことに気がつきました。それに、一応、フルレンジのエラー処理を加え工夫を加えてみました。 Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim OldRowN As Long On Error GoTo ErrHandler OldRowN = myRowN '表示の番号を確保 If KeyCode = 13 Then If IsNumeric(TextBox3.Text) Then myRowN = CLng(TextBox3.Text) If myRowN < 3 Then Err.Raise 1004 '3より少ない場合は、入力不可 mySheet.Cells(myRowN, 1).Select Call ChangeMe Else Err.Raise 1004 End If End If Exit Sub ErrHandler: KeyCode = 0 TextBox3.Text = Str(OldRowN) '入力を戻す Beep '間違ったときに合図 End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >少しわからないのが、チェックボックスのみ >mySheet.Range・・・を使うのですね? ここらは、あまり自信があるわけではないのですが、そのままUserForm上のチェックボックスから、拾い上げ、吐き出すという形にすると、どうしても、数値に変換させる手立てが見つかりません。 図式: CheckBox1 → On/Off 型( Boolean) →ワークシートのセル なんでも型 (Variant型) なんでも型だから、何でも、その形で受け止めてしまう、だから、On/Off になってしまいます。 >他にもコンボボックスも上記の様に表示するのでしょうか? したほうがよいと思います。他のテキストボックスなどと比べて、コンボホックスのControlSource は、必ず、そのソース元は、固定しておかないといけないですね。 もちろん、立ち上げは、「元」シートから行っているでしょうし、Modal モード(ShowModal プロパティ)は、True になっているでしょうから、問題はないとは思いますが、こちらで複数のブックをあけてやってみると、誤動作しますね。 >TextBox3にはA列の行番号付けてるのを取得してますが、 そういう意味だったのですか? 「行番号付けてる・・・」それは、必要ないですね。 >アクセスのレコードの様に数字を入力するとその行に飛ぶことって可能でしょうか? 以下で訂正と、誤って別のシートのデータを拾わないように、しました。 それでは、 'プロシージャは二つ変更します。 Private Sub UserForm_Initialize() Set mySheet = ThisWorkbook.Worksheets("元") myRowN = mySheet.Range("a65536").End(xlUp).Row Application.Goto mySheet.Cells(myRowN, 1) Call ChangeMe End Sub Private Sub ChangeMe() With Me .TextBox1.ControlSource = mySheet.Name & "!B" & myRowN .TextBox2.ControlSource = mySheet.Name & "!C" & myRowN .CheckBox1.Value = mySheet.Range("D" & myRowN).Value .TextBox3.Text = Str(myRowN) End With End Sub '----------------------------------------------- 'これを付け加えてください。 Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then If IsNumeric(TextBox3.Text) Then myRowN = CLng(TextBox3.Text) mySheet.Cells(myRowN, 1).Select Else KeyCode = 0 TextBox3.Value = myRowN End If End If End Sub 'TextBox3_Change イベントを使わない理由は、2桁になった時に、バックスペースで変更すると、1桁に飛んでしまうからです。数字を入れて、Enter で飛びます。ただし、ナイナス値を入れたり、65356以上を入れたら、エラーが発生しますので、心配でしたら、 On Error Resume Next 'マクロ On Error Goto 0 ではさむとよいです。 私個人としては、うまくいっているように思いました。例えば、二つのブックを開いておいて、別のブックから、このUserFormを立ち上げても、そこにシートの最後尾にジャンプします。 後、今、お作りなっているもので、分からないことがあったら、スペースの許す限り、この後にまとめてしまっていいです。私は、前々回から、naopon2000さんのご質問は読んでいますので、だいたいの感じは分かります。
補足
どうもありがとうございました! なんとなく意味もわかりうまく動きました!!! 最後になりますが、 CommandButton4_Click()で下の行に移動して新しい行番号をセル入力していましたが、 下に番号がない(新規で空白)ものはコマンド4を押しても下に行かないようにしたいのです。その代わりに 新しくコマンド5を作りそれを押した時点で新しく行が作られるようにしたいのですが、うまくいきません。 コマンド4に and以降を追加したのですが、普通に下にいってしまいます。↓ If myRowN <= 65535 And IsNumeric(mySheet.Cells(myRowN + 1, 1).Value) Then myRowN = myRowN + 1 Call ChangeMe End If 下のコードはコマンド5に入れました(下のはうまく動きます) Private Sub CommandButton5_Click() '新規レコード Me.レコード.Value = Me.レコード.Value + 1 myRowN = mySheet.Range("a65536").End(xlUp).Row + 1 mySheet.Cells(myRowN, 1).Value = myRowN Call ChangeMe mySheet.Cells(myRowN, 1).Select End Sub すいませんが、IsNumeric(mySheet.Cells(myRowN + 1, 1).Value)の使い方が悪いと思います アクティブセルの下の行が空白なら下に行かないようにしたのです。どうか宜しくお願い致します。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 少し、気になった点から; まず、これは暗黙のルールですが、TEXTBOX1, TEXTBOX2,TEXTBOX3 というのは、UserForm上などのコントロールでしたら、キャメル型で書くようにお願いします。例: TextBox1 この場合は、Me キーワードをつけたほうがよいです。コードが読めません。例:Me.TextBox1.ControlSource サブルーチンで、 × Call ChangeMe(myRowN) これは動くのでしょうか?ByRef 型になっていますが、内容的には、ByVal でないといけないような気がします。ですから、Call なしにするか、ByVal にしないといけないように思います。 ChangeMe(myRowN) ' 引数の名称と、内部のコードの変数とは合っていません。 ×lngRowNum ↓ myRowN ↓ Private Sub ChangeMe(myRowN As Long) = "B" & myRowN このような記述は、シート名をつけたほうがよいです。 = "元!B" & myRowN となります。 >シートのC列に0か1を表示したいのです。 >いまのままではTUREかFALSEになってしまいます。 コードをみると、D列になっているようですが? チェックボックスのオンオフで、0か1にしたいということでしょうか? 私なりに、コードを直してみました。若干、飲み込めていない部分もあるかもしれません。 '---------------------------------------------------------- 'Option Explicit 'モジュールレベルの変数 Private myRowN As Long Private mySheet As Worksheet Private Sub UserForm_Initialize() Set mySheet = Worksheets("元") myRowN = mySheet.Range("a65536").End(xlUp).Row Call ChangeMe End Sub Private Sub CommandButton4_Click() '下に移動 If myRowN <= 65535 Then myRowN = myRowN + 1 Call ChangeMe End If mySheet.Cells(myRowN, 1).Select TextBox1.SetFocus End Sub Private Sub CommandButton3_Click() '上に移動 If myRowN >= 3 Then myRowN = myRowN - 1 Call ChangeMe End If mySheet.Cells(myRowN, 1).Select TextBox1.SetFocus End Sub Private Sub ChangeMe() With Me .TextBox1.ControlSource = mySheet.Name & "!B" & myRowN .TextBox2.ControlSource = mySheet.Name & "!C" & myRowN .CheckBox1.Value = mySheet.Range("D" & myRowN).Value .TextBox3.ControlSource = mySheet.Name & "!A" & myRowN End With End Sub Private Sub CheckBox1_Click() 'チェックボックスのオンオフで数値を入れる With mySheet.Range("D" & myRowN) If CheckBox1.Value Then .Value = 1 Else .Value = 0 End If End With End Sub '----------------------------------------------------------
補足
大変参考になりました!!! TextBox1と使うのですね。気を付けます チェックボックスはD列です。間違えました 少しわからないのが、チェックボックスのみ mySheet.Range・・・を使うのですね? 他にもコンボボックスも上記の様に表示するのでしょうか? あとTextBox3にはA列の行番号付けてるのを取得してますが、アクセスのレコードの様に数字を入力するとその行に飛ぶことって可能でしょうか?
補足
なんとお礼を言っていいか...大変うれしく頼もしく感じます。 速くWendy02さんのようにわかるようになりたいです! 自分なりにネットでもいろいろ調べながらや、 仕事の合間での作業なので時間がかかって^^ 先にお礼かたがた、ありがとうございます。 質問内容が多くなってかなり端的に質問致しましたが、 ユーザーフォームを使ってエクセルシートにデータを入力したかったのです。 そこにコンボ、テキスト、チェックを使いながら入力したかったのです。 書き込み頂いたコードをじっくり調べてみます。 解りましたらまた、ご連絡させて頂きます。