Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11188 / 13644 ツリー ←次へ | 前へ→

【17412】ユーザーフォームの件 さる 04/8/28(土) 23:17 質問[未読]
【17415】Re:ユーザーフォームの件 こもれび 04/8/29(日) 0:35 回答[未読]
【17442】Re:ユーザーフォームの件 さる 04/8/29(日) 23:04 質問[未読]
【17443】Re:ユーザーフォームの件 こもれび 04/8/29(日) 23:43 回答[未読]
【17449】Re:ユーザーフォームの件 さる 04/8/30(月) 1:17 質問[未読]
【17450】Re:ユーザーフォームの件 こもれび 04/8/30(月) 1:46 回答[未読]
【17451】追伸 こもれび 04/8/30(月) 1:54 回答[未読]
【17465】Re:ユーザーフォームの件 さる 04/8/30(月) 15:09 質問[未読]
【17469】Re:ユーザーフォームの件 こもれび 04/8/30(月) 17:38 発言[未読]
【17470】Re:ユーザーフォームの件 さる 04/8/30(月) 19:49 質問[未読]
【17471】Re:ユーザーフォームの件 さる 04/8/30(月) 19:59 発言[未読]
【17472】Re:ユーザーフォームの件 さる 04/8/31(火) 1:28 質問[未読]
【17473】Re:ユーザーフォームの件 こもれび 04/8/31(火) 7:06 回答[未読]
【17535】Re:ユーザーフォームの件 さる 04/9/1(水) 20:30 質問[未読]
【17541】Re:ユーザーフォームの件 こもれび 04/9/2(木) 0:47 回答[未読]
【17580】Re:ユーザーフォームの件 さる 04/9/2(木) 17:06 お礼[未読]

【17412】ユーザーフォームの件
質問  さる E-MAIL  - 04/8/28(土) 23:17 -

引用なし
パスワード
   ユーザーフォームの中にTextBoxをデータ入力していますが
途中で漢字変換のときにEnterキーを2回押してしまって途中のままで
シート1にデータを追加してしまった。
TextBox全部入力するまでにシート1へ追加できないような命令文とか
ありますか?
いい方法がありましたら教えて下さい。

【17415】Re:ユーザーフォームの件
回答  こもれび  - 04/8/29(日) 0:35 -

引用なし
パスワード
   コマンドボタンを配して、それがクリックされたらシート1に
追加されるというのはいかがでしょうか?

>TextBox全部入力するまでにシート1へ追加できないような命令文とか
>ありますか?

文字数が決まっているのであれば、len関数でチェックするとか
ユーザーさんが入力時に入力文字数がわかったほうがよいというのでありまし
たら、formatで書式を設定しておくとか
空白入力をチェックしたいのであればIsNullを使用するとか

  res = MsgBox("入力文字列は正しいですか?", vbYesNo + vbInformation, "Check")
  Select Case res
   Case 6
    Sheet1.Cells(1, 1) = UserForm1.TextBox1.Value
   
   Case 7
    Cancel = True
    UserForm1.TextBox1.SetFocus
    
  End Select

【17442】Re:ユーザーフォームの件
質問  さる E-MAIL  - 04/8/29(日) 23:04 -

引用なし
パスワード
   ▼こもれび さん:
>コマンドボタンを配して、それがクリックされたらシート1に
>追加されるというのはいかがでしょうか?

ありがとうございます。
でも1個だけでは他のTextboxも間違えて追加してしまう。
textboxは72個ありますので、全部入力するまでEnterキーを押してもシート1へ追加しないようにしたいがやはりコマンドボタンを配していけばいいと思う。
TextBox72個入力して「入力完了ボタン」を押してシート1へ追加して終了なります。

いい方法がありますか?

【17443】Re:ユーザーフォームの件
回答  こもれび  - 04/8/29(日) 23:43 -

引用なし
パスワード
   こもれびです

>textboxは72個ありますので、全部入力するまでEnterキーを押してもシート1へ追加しないようにしたいがやはりコマンドボタンを配していけばいいと思う。
>TextBox72個入力して「入力完了ボタン」を押してシート1へ追加して終了なります。

うわぁ、72個!

それでは、次のコードはいかがでしょうか

○ 標準モジュール

  public TextData(71) as String ' テキストボックスデータ用1次元配列

○ フォームのモジュール

Private Sub TextBox1_AfterUpdate()
  TextData(0) = UserForm2.TextBox1.Text ' 配列にデータを入力
End Sub

ちょっと手間ですが、72個のテキストボックス全部にAfterUpdateイベント
プロシージャを書きます。
その際に、配列の番号は順番どおりに記述してください。

Private Sub TextBox1_AfterUpdate()
  TextData(0) = UserForm2.TextBox1.Text ' 配列にデータを入力
End Sub

Private Sub TextBox2_AfterUpdate()
  TextData(1) = UserForm2.TextBox1.Text ' 配列にデータを入力
End Sub

Private Sub TextBox3_AfterUpdate()
  TextData(2) = UserForm2.TextBox1.Text ' 配列にデータを入力
End Sub

全部入力し終えましたら

Private Sub CommandButton1_Click()
  dim i as Integer

  For i = 0 to 71
   Cells(i+1, 1) = TextData(i)
  next i

End Sub

これですと、コマンドボタンの数は1個で済みなおかつテキストボックス全部
に入力されるまでシートにデータが入らなくなります。
上のコードはあくまで例で、実際に使用される際はセルの位置を変更してください。

【17449】Re:ユーザーフォームの件
質問  さる E-MAIL  - 04/8/30(月) 1:17 -

引用なし
パスワード
   ▼こもれび さん:
丁寧に答えてくれてありがとうございます。
もうひとつ質問があります。すみません。

TextBox全部64個+オプションボタン(○男性○女性)男性だったら1女性ならば2を値をシート1へはいります。

オプションボタンの場合はどうやってコードを入れますか?
配列は4列目です。
1=男性
2=女性
右辺から左辺に変えるように
数値です。

> フォームのモジュール

Private Sub TextBox1_AfterUpdate()
  TextData(0) = UserForm1.TextBox1.Text ' 氏名
End Sub
Private Sub TextBox2_AfterUpdate()
  TextData(2) = UserForm1.TextBox2.Text ' 年齢
End Sub
Private Sub TextBox3_AfterUpdate()
  TextData(1) = UserForm1.TextBox3.Text ' 社員番号
End Sub
Private Sub TextBox4_AfterUpdate()
  TextData(3) = UserForm1.TextBox4.Text ' ID
End Sub
Private Sub TextBox5_AfterUpdate()
  TextData(5) = UserForm1.TextBox5.Text ' A-1
End Sub
Private Sub TextBox6_AfterUpdate()
  TextData(6) = UserForm1.TextBox6.Text ' A-2
End Sub
Private Sub TextBox7_AfterUpdate()
  TextData(7) = UserForm1.TextBox7.Text ' A-3
End Sub
Private Sub TextBox8_AfterUpdate()
  TextData(8) = UserForm1.TextBox8.Text ' A-4
End Sub
Private Sub TextBox9_AfterUpdate()
  TextData(9) = UserForm1.TextBox9.Text ' A-5
End Sub
Private Sub TextBox10_AfterUpdate()
  TextData(10) = UserForm1.TextBox10.Text ' A-6
End Sub
Private Sub TextBox11_AfterUpdate()
  TextData(11) = UserForm1.TextBox11.Text ' A-7
End Sub
Private Sub TextBox12_AfterUpdate()
  TextData(12) = UserForm1.TextBox12.Text ' A-8
End Sub
Private Sub TextBox13_AfterUpdate()
  TextData(13) = UserForm1.TextBox13.Text ' A-9
End Sub
Private Sub TextBox14_AfterUpdate()
  TextData(13) = UserForm1.TextBox14.Text ' A-10
End Sub
Private Sub TextBox15_AfterUpdate()
  TextData(14) = UserForm1.TextBox15.Text ' A-11
End Sub
Private Sub TextBox16_AfterUpdate()
  TextData(15) = UserForm1.TextBox16.Text ' A-12
End Sub
Private Sub TextBox17_AfterUpdate()
  TextData(16) = UserForm1.TextBox17.Text ' A-13
End Sub
Private Sub TextBox18_AfterUpdate()
  TextData(17) = UserForm1.TextBox18.Text ' A-14
End Sub
Private Sub TextBox19_AfterUpdate()
  TextData(18) = UserForm1.TextBox19.Text ' A-15
End Sub
Private Sub TextBox20_AfterUpdate()
  TextData(19) = UserForm1.TextBox20.Text ' A-16
End Sub
Private Sub TextBox21_AfterUpdate()
  TextData(20) = UserForm1.TextBox21.Text ' A-17
End Sub
Private Sub TextBox22_AfterUpdate()
  TextData(21) = UserForm1.TextBox22.Text ' B-1
End Sub
Private Sub TextBox23_AfterUpdate()
  TextData(22) = UserForm1.TextBox23.Text ' B-2
End Sub
Private Sub TextBox24_AfterUpdate()
  TextData(23) = UserForm1.TextBox24.Text ' B-3
End Sub
Private Sub TextBox25_AfterUpdate()
  TextData(24) = UserForm1.TextBox25.Text ' B-4
End Sub
Private Sub TextBox26_AfterUpdate()
  TextData(25) = UserForm1.TextBox26.Text ' B-5
End Sub
Private Sub TextBox27_AfterUpdate()
  TextData(26) = UserForm1.TextBox27.Text ' B-6
End Sub
Private Sub TextBox28_AfterUpdate()
  TextData(27) = UserForm1.TextBox28.Text ' B-7
End Sub
Private Sub TextBox29_AfterUpdate()
  TextData(28) = UserForm1.TextBox29.Text ' B-8
End Sub
Private Sub TextBox30_AfterUpdate()
  TextData(29) = UserForm1.TextBox30.Text ' B-9
End Sub
Private Sub TextBox31_AfterUpdate()
  TextData(30) = UserForm1.TextBox31.Text ' B-10
End Sub
Private Sub TextBox32_AfterUpdate()
  TextData(31) = UserForm1.TextBox32.Text ' B-11
End Sub
Private Sub TextBox33_AfterUpdate()
  TextData(32) = UserForm1.TextBox33.Text ' B-12
End Sub
Private Sub TextBox34_AfterUpdate()
  TextData(33) = UserForm1.TextBox34.Text ' B-13
End Sub
Private Sub TextBox35_AfterUpdate()
  TextData(34) = UserForm1.TextBox35.Text ' B-14
End Sub
Private Sub TextBox36_AfterUpdate()
  TextData(35) = UserForm1.TextBox12.Text ' B-15
End Sub
Private Sub TextBox37_AfterUpdate()
  TextData(36) = UserForm1.TextBox37.Text ' B-16
End Sub
Private Sub TextBox38_AfterUpdate()
  TextData(37) = UserForm1.TextBox38.Text ' B-17
End Sub
Private Sub TextBox39_AfterUpdate()
  TextData(38) = UserForm1.TextBox39.Text ' B-18
End Sub
Private Sub TextBox40_AfterUpdate()
  TextData(39) = UserForm1.TextBox40.Text ' B-19
End Sub
Private Sub TextBox41_AfterUpdate()
  TextData(40) = UserForm1.TextBox41.Text ' B-20
End Sub
Private Sub TextBox42_AfterUpdate()
  TextData(41) = UserForm1.TextBox42.Text ' B-21
End Sub
Private Sub TextBox43_AfterUpdate()
  TextData(42) = UserForm1.TextBox43.Text ' B-22
End Sub
Private Sub TextBox44_AfterUpdate()
  TextData(43) = UserForm1.TextBox44.Text ' B-23
End Sub
Private Sub TextBox45_AfterUpdate()
  TextData(44) = UserForm1.TextBox45.Text ' B-24
End Sub
Private Sub TextBox46_AfterUpdate()
  TextData(45) = UserForm1.TextBox46.Text ' B-25
End Sub
Private Sub TextBox47_AfterUpdate()
  TextData(46) = UserForm1.TextBox47.Text ' B-26
End Sub
Private Sub TextBox48_AfterUpdate()
  TextData(47) = UserForm1.TextBox48.Text ' B-27
End Sub
Private Sub TextBox49_AfterUpdate()
  TextData(48) = UserForm1.TextBox49.Text ' B-28
End Sub
Private Sub TextBox50_AfterUpdate()
  TextData(49) = UserForm1.TextBox50.Text ' B-29
End Sub
Private Sub TextBox51_AfterUpdate()
  TextData(50) = UserForm1.TextBox51.Text ' C-1
End Sub
Private Sub TextBox52_AfterUpdate()
  TextData(51) = UserForm1.TextBox52.Text ' C-2
End Sub
Private Sub TextBox53_AfterUpdate()
  TextData(52) = UserForm1.TextBox53.Text ' C-3
End Sub
Private Sub TextBox54_AfterUpdate()
  TextData(53) = UserForm1.TextBox54.Text ' C-4
End Sub
Private Sub TextBox55_AfterUpdate()
  TextData(54) = UserForm1.TextBox55.Text ' C-5
End Sub
Private Sub TextBox56_AfterUpdate()
  TextData(55) = UserForm1.TextBox56.Text ' C-6
End Sub
Private Sub TextBox57_AfterUpdate()
  TextData(56) = UserForm1.TextBox57.Text ' C-7
End Sub
Private Sub TextBox58_AfterUpdate()
  TextData(57) = UserForm1.TextBox58.Text ' C-8
End Sub
Private Sub TextBox59_AfterUpdate()
  TextData(58) = UserForm1.TextBox59.Text ' C-9
End Sub
Private Sub TextBox60_AfterUpdate()
  TextData(59) = UserForm1.TextBox60.Text ' D-1
End Sub
Private Sub TextBox61_AfterUpdate()
  TextData(60) = UserForm1.TextBox61.Text ' D-2
End Sub
Private Sub CommandButton1_Click() '入力完了ボタン
  Dim i As Integer

  For i = 0 To 62
   Cells(i + 1, 1) = TextData(i)
  Next i

End Sub>

【17450】Re:ユーザーフォームの件
回答  こもれび  - 04/8/30(月) 1:46 -

引用なし
パスワード
   こもれびです

ユーザーフォームに「フレーム」を1つ配置してください。
その中にオプションボタンを2つ配置します。

そして、コードを記述します。
※ 下記のコードでは、オプションボタン1を男性と仮定しています。

○ 標準モジュールの変数宣言

  dim FMChk as integer

○ フォームのモジュール

Private Sub CommandButton1_Click()
  MsgBox FMChk
End Sub

Private Sub OptionButton1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  FMChk = 1
  
End Sub

Private Sub OptionButton2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  FMChk = 2
End Sub

Private Sub UserForm_Initialize()
  UserForm4.OptionButton1.Value = 1
End Sub

【17451】追伸
回答  こもれび  - 04/8/30(月) 1:54 -

引用なし
パスワード
   こもれびです

ごめんなさい、確認用のコードをそのまま貼り付けてしまいました。

> 配列は4列目です。
「D1」にデータを入れるということでよいのでしょうか?

・男性/女性のデータのセルへの入力

  cells(1,4) = FMChk

【17465】Re:ユーザーフォームの件
質問  さる E-MAIL  - 04/8/30(月) 15:09 -

引用なし
パスワード
   ▼こもれび さん:
分かりやすく説明させて本当にありがとうございました。

もうひとつ質問がありますが、すみません。
textboxとオプションボタンは異常なく作動出来ましたけど
(Textbox1〜64とオプションボタンをデータ入力した後、下の行へ新規データ
追加できないけど最終行に追加できるようにコードがありますか?

もし空欄があれば行を削除して最終行に追加します。
一行目はタイトル(項目)だから2行目から追加します。

どうか教えてくださるようにお願いします。

【17469】Re:ユーザーフォームの件
発言  こもれび  - 04/8/30(月) 17:38 -

引用なし
パスワード
   こもれびです

>(Textbox1〜64とオプションボタンをデータ入力した後、下の行へ新規データ
>追加できないけど最終行に追加できるようにコードがありますか?
>
>もし空欄があれば行を削除して最終行に追加します。
>一行目はタイトル(項目)だから2行目から追加します。

現在カーソルが「A65」にあると仮定して、カーソルを例えば「A67」に移動する
と解釈してよいのでしょうか?

この場合は
     Range("A67").Select
若しくは
     Range(Cells(67, 1), Cells(67, 1)).Select
と記述します。
( 実際の動作は、元のカーソル位置がどこであれ「A67」に移動します )

【17470】Re:ユーザーフォームの件
質問  さる E-MAIL  - 04/8/30(月) 19:49 -

引用なし
パスワード
   ▼こもれび さん:

申し訳はありませんでした。説明不足ですみませんでした。

>>(Textbox1〜64とオプションボタン)をデータ入力した後、
最終行に追加できるようにコードがありますか?
>>
>>もし空欄があれば行を削除して最終行に追加します。
>>一行目はタイトル(項目)だから2行目から追加します。
1〜64は列項目ですから
行項目は個人別で氏名を表示します。
1   234567891011121314151617~64
S.S   33312313 2 3 3 3 1 2 3 3〜
S.A  33321224 4 4 4 2 3 3 3 5〜
       .
       .
    下の行へ追加していきます。
>現在カーソルが「A65」にあると仮定して、カーソルを例えば「A67」に移動する
>と解釈してよいのでしょうか?
>
>この場合は
>     Range("A67").Select
>若しくは
>     Range(Cells(67, 1), Cells(67, 1)).Select
>と記述します。
>( 実際の動作は、元のカーソル位置がどこであれ「A67」に移動します )

説明不足で申し訳はありません。
全て入力してシート1の2行目へデータを表示します。
まだ入力してシート1の3行目へデータを表示します。
繰り返していきます。
最終行を探してセルをデータに入れる方法です。

【17471】Re:ユーザーフォームの件
発言  さる E-MAIL  - 04/8/30(月) 19:59 -

引用なし
パスワード
   ▼こもれび さん:
説明では理解できないでしょうかな?
私が作ったBookを圧縮してこもれびさんまでにメールを送ってもいいですか?

見て分かると思うのでよろしくお願いします。

【17472】Re:ユーザーフォームの件
質問  さる E-MAIL  - 04/8/31(火) 1:28 -

引用なし
パスワード
   ▼こもれび さん:
textbox1でEnterキーを押したら次のtextbox2へ移動できますか?

EnterKeyBehavior プロパティ

テキスト ボックス (TextBox) コントロールにフォーカスがあるときに、Enter キーを押した場合の動作を設定します。

構文

object.EnterKeyBehavior [= Boolean]

EnterKeyBehavior プロパティの構文は、次の指定項目から構成されます。

True = Enter キーを押すと新しい行が作成されます。
False =  Enter キーを押すとタブ オーダーの次のオブジェクトにフォーカスが移ります (既定値)

それを試したらエラーないけど移動できなかった。どこか間違えていますか?
教えて下さい。

If UserForm1.TextBox1.EnterKeyBehavior = False Then TextBox2

    

【17473】Re:ユーザーフォームの件
回答  こもれび  - 04/8/31(火) 7:06 -

引用なし
パスワード
   こもれびです

>If UserForm1.TextBox1.EnterKeyBehavior = False Then TextBox2

全く不要ですよ。

textboxのEnterKeyBehaviorプロパティは元々(つまり既定値)False
になっており、通常コードのなかで設定することはありません。

それよりも、順次移動したいテキストボックスの「TabIndex」
プロパティはどうなっていますか?
フォームのデザイン画面でテキストボックスを選択した状態で
プロパティウィンドウのTabIndexを確認してください。
入力するテキストボックスの順番に、TabIndexプロパティが
0,1,2,3,4,5・・・・・となっていればEnterキーの操作で次の
テキストボックスにフォーカスが移動します。

それと、先の課題の
「1行目のデータ入力完了」で2行目に…
「2行目のデータ入力完了」で3行目に…
(以降データ数分同じ動作)
は、要するに
各行のデータ入力が完了した時点ではカーソルが
64列目の1行目にあって、これを1列目の2行目に移動したい
ということですね?

これは、先の投稿で書きましたカーソルの移動方法の数字を
変えればよいのです。
(コードの違いは移動先の数字の違いのみ)

よって、上に書きました「1列目の2行目」への移動は
     Range("A2").Select
若しくは
     Range(Cells(2, 1), Cells(2, 1)).Select
と記述します。

但し、今回はプログラムによる繰り返しとなりそうですから、
2つ目の
     Range(Cells(2, 1), Cells(2, 1)).Select
を使用し、行が変化しますから上の「2」を変数とします。

【17535】Re:ユーザーフォームの件
質問  さる E-MAIL  - 04/9/1(水) 20:30 -

引用なし
パスワード
   ▼こもれび さん:
ありがとうございました。おかげで成功いたしました。

もうひとつ質問がありますがうるさくて申し訳はありません。

TextBox1〜62入力完了して「入力完了」ボタン(CommandButton1_Click() )を
クリックし、シート1をデータに貼り付けします。
次のデータを移るためにTextBox1へアクティブしたい。|(カーソル)は
TextBox1の中で表示したい。(ユーザーフォームはこのままです。)
方法はありますか?教えて下さい。

今までは完了ボタンを押したらカーソルが消えた。マウスでTextBox1のところへクリックして、再表示になっています。マウスを使わないようにしたいです。

【17541】Re:ユーザーフォームの件
回答  こもれび  - 04/9/2(木) 0:47 -

引用なし
パスワード
   こもれびです

コマンドボタンのイベントプロシージャ内の最後に

  me!TextBox1.SetFocus

と記述すればOK

【17580】Re:ユーザーフォームの件
お礼  さる E-MAIL  - 04/9/2(木) 17:06 -

引用なし
パスワード
   ▼こもれび さん:
>こもれびです
>
>コマンドボタンのイベントプロシージャ内の最後に
>
>  me!TextBox1.SetFocus
>
>と記述すればOK

本当だ!楽になりました。いろいろな質問させて
丁寧に答えてくれて本当にありがとうございました。

11188 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free