[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームのオートフィル』(雪だるま)
何度もすみません…
ユーザーフォームからデータシートへ入力するものをつくっているのですが、その中の TextBox2でオートフィルのような機能が使えないかと思いまして…
例えば最初にTextBox2に「0001」(文字列型)と入力、その他の内容も入力、「登録」ボタン(コマンドボタン)で データシートに転記した時にユーザーフォームの内容をクリアしているのですが、その時に TextBox2に自動で「0002」と表示されるようにしたいです。
AutoFillメソッドで何とかできないかと思っているのですが、どのように使えばよいかわからなくて…
今のユーザーフォームの「登録」ボタンクリック時のコードは下記の通りです。
Private Sub CommandButton1_Click()
Dim lRow As String Dim ari As Long Dim nasi As Long Dim ctrl As Control
With Worksheets("マスター") lRow = .Range("B" & Rows.Count).End(xlUp).Row + 1
If OptionButton1.Value = True Then ari = 1 Else ari = 0 End If
If OptionButton2.Value = True Then nasi = 1 Else nasi = 0 End If
.Cells(lRow, "B").Value = TextBox1.Text .Cells(lRow, "C").Value = TextBox2.Text '←オートフィルを使いたい場所 .Cells(lRow, "D").Value = TextBox3.Text .Cells(lRow, "F").Value = ari .Cells(lRow, "G").Value = nasi .Cells(lRow, "H").Value = ComboBox1.Value .Cells(lRow, "I").Value = TextBox4.Text .Cells(lRow, "J").Value = TextBox5.Text .Cells(lRow, "K").Value = ComboBox2.Value .Cells(lRow, "L").Value = ComboBox3.Value .Cells(lRow, "M").Value = ComboBox4.Value .Cells(lRow, "N").Value = ComboBox5.Value .Cells(lRow, "O").Value = TextBox6.Text .Cells(lRow, "P").Value = ComboBox6.Value .Cells(lRow, "Q").Value = TextBox7.Text
lRow = lRow + 1
End With
'ユーザーフォームをクリア
For Each ctrl In Me.Controls If TypeName(ctrl) = "TextBox" Then _ ctrl.Value = vbNullString Next
For Each ctrl In Me.Controls If TypeName(ctrl) = "ComboBox" Then _ ctrl.Value = vbNullString Next
End Sub
よろしくお願いいたします。
コード全体は、思うところもあるけど、できるだけ、そのままに。 (最後のクリアだけ、2つのループを1つにしておいた)
Private Sub CommandButton1_Click()
Dim lRow As String Dim ari As Long Dim nasi As Long Dim ctrl As Control Dim sv2 As Long
With Worksheets("マスター") lRow = .Range("B" & Rows.Count).End(xlUp).Row + 1
If OptionButton1.Value = True Then ari = 1 Else ari = 0 End If
If OptionButton2.Value = True Then nasi = 1 Else nasi = 0 End If
.Cells(lRow, "B").Value = TextBox1.Text .Cells(lRow, "C").Value = TextBox2.Text '←オートフィルを使いたい場所 .Cells(lRow, "D").Value = TextBox3.Text .Cells(lRow, "F").Value = ari .Cells(lRow, "G").Value = nasi .Cells(lRow, "H").Value = ComboBox1.Value .Cells(lRow, "I").Value = TextBox4.Text .Cells(lRow, "J").Value = TextBox5.Text .Cells(lRow, "K").Value = ComboBox2.Value .Cells(lRow, "L").Value = ComboBox3.Value .Cells(lRow, "M").Value = ComboBox4.Value .Cells(lRow, "N").Value = ComboBox5.Value .Cells(lRow, "O").Value = TextBox6.Text .Cells(lRow, "P").Value = ComboBox6.Value .Cells(lRow, "Q").Value = TextBox7.Text
lRow = lRow + 1 '???? 必要? エラーにはならないけどString型の演算というのも??
End With
sv2 = Val(TextBox2.Value)
'ユーザーフォームをクリア
For Each ctrl In Me.Controls If TypeName(ctrl) = "TextBox" Or TypeName(ctrl) = "ComboBox" Then _ ctrl.Value = vbNullString Next
TextBox2.Value = Format(sv2 + 1, "0000")
End Sub
(ぶらっと)
ぶらっと様 ありがとうございます。
>lRow = lRow + 1 '???? 必要? エラーにはならないけどString型の演算というのも?? はい、私もなんだかおかしいなと思いながら書いてました… (前任の人が作った別のユーザーフォームがあって、それをベースに作っていたのですが) 一応
Dim lRow As Long
にして、lRow = lRow + 1 を消しました(問題なく動いてます)
教えていただいたコードで思った処理ができました。 ありがとうございました。
※差支えなければ「思うところ」をお教えいただけますでしょうか? 今後の参考にしたいので…
(雪だるま)
>※差支えなければ「思うところ」をお教えいただけますでしょうか?
いやぁ、あまり気にしないで。つい、口癖で(?) コメント済みのString型や、不要なコードが気になったということがメイン。 でも、せっかくだから感じたことを。
・仕様というか要件がわからないのでなんともいえないんだけど・・ TextBox2は、連番を自動表示するわけだけど 打ち直すこともできるんだよね。 もし、そうじゃないんだったらテキストボックスじゃなくラベルにするのかな? ・これも、コードということじゃなく仕様関係なんだけど、シートに書いた後、人間の操作だから 「しまった」ということはあるよね。訂正とか削除とか、そういったものも必要なのかなぁ・・とか。 ・2つあるオプションボタンって、別グループ?(つまり、それぞれ単独?) 2つしかないんだからそれぞれ単独ということはないよね。 そうすると、OptionButton1がTrueならOptionButton2はFalseに決まってるよね。(その逆も) コードとしては、ここの処理がちょっと気になった。
(ぶらっと)
さまつの話で申し訳有りませんが?
.Cells(lRow, "D").Value = TextBox3.Text .Cells(lRow, "F").Value = ari .Cells(lRow, "G").Value = nasi .Cells(lRow, "H").Value = ComboBox1.Value
此れは
.Cells(lRow, "D").Value = TextBox3.Text .Cells(lRow, "F").Value = -CLng(OptionButton1.Value) .Cells(lRow, "G").Value = -CLng(OptionButton2.Value) .Cells(lRow, "H").Value = ComboBox1.Value
此れで表せると思いますよ
(Bun)
ぶらっと様、BUN様ありがとうございます。
.Cells(lRow, "F").Value = -CLng(OptionButton1.Value) .Cells(lRow, "G").Value = -CLng(OptionButton2.Value)
こういう記述でできるんですね。 オプションボタンの扱い方がよく分かっていなくて苦心の記述でしたので助かりました。
>TextBox2は、連番を自動表示するわけだけど 打ち直すこともできるんだよね。 >もし、そうじゃないんだったらテキストボックスじゃなくラベルにするのかな? たまに連番にならないことがあるので、打ち直しができるようにテキストボックスにしています。
>訂正とか削除とか、そういったものも必要なのかなぁ・ 訂正・削除はベタ打ちでやっています。 元々のデータが項目が38ぐらいあって、今回ユーザーフォームで入力するのはその一部なんです。 (入荷マスターの入荷予定のみ。実際に入荷した後他の項目が埋まる) 他の項目が埋まった後だとユーザーフォームでの変更処理などは大変なので…
>2つしかないんだからそれぞれ単独ということはないよね。 >そうすると、OptionButton1がTrueならOptionButton2はFalseに決まってるよね。 はい、その通りです。 OptionButton1がTrueの時にF列に「1」、Falseの時は「0」、OptionButton2もG列に同様の入力をします。 OptionButton1と2とどちらかを選択する仕様ですが、BUN様のコードで解決いたしました。
★すみません、追加でお聞きしたいことがあります。
ユーザーフォームをクリア(登録ボタンクリック時)の時、TextBox5の内容だけはクリアせずに残したいのですが、 今考えている方法はテキストボックス全てに例えば"nyukaText1"のような名前を付け、TextBox5だけ他のとは違う名前にして
For Each Ctrl In Me.Controls If Ctrl.Name Like "nyuka*" Then Ctrl.Value = "" End If Next
このような方法しか考え付かないのですがもっとシンプルにできますか?
(雪だるま)
ぶらっとさんのコードでsv2って変数使ってTextBox2の値を入れなおして いますよね。 これも同じ手法で出来るのでは? クリア前に変数に格納、 コントロールの値をクリアした後、TextBox5に変数の値を代入。 (みやほりん)
みやほりん様
ありがとうございます。できました!
(雪だるま)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.