[[20111227150239]] 『ユーザーフォームのオートフィル』(雪だるま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームのオートフィル』(雪だるま)

 何度もすみません…

 ユーザーフォームからデータシートへ入力するものをつくっているのですが、その中の
 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.