[[20181020114516]] 『ユーザーフォームを使った一覧表へのデータ入力に』(BeOS) ページの最後に飛ぶ

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

 

『ユーザーフォームを使った一覧表へのデータ入力について』(BeOS)

Excel初心者です。

ここをはじめとして、あちこちのサイトや書籍を見ながら
ここまで作ってみましたが、
ユーザーフォームを使って一覧表にデータを転記するところを
どうしたらよいか思いつきません。

For〜Nextを使うと(当たり前ですが)最初の入力データで埋まって
しまいました。('転記 の部分です)
空白の最下行を見つけながら行の変数を変えることも考えましたが
フォームの初期化が上手くいかないかもと思っています。

実現したいのは

ユーザーフォームから入力(1件目)
2件目以降のデータがあればフォームを初期化して、次の行に入力できるようにする。

ということなのですが、どのようにしたらよいでしょうか?

Private Sub UserForm_Initialize()

    Dim sh1 As Worksheet: Set sh1 = Worksheets("data_list")
    Dim eName As String
    Dim sh3 As Worksheet: Set sh3 = Worksheets("h_list")
    Dim lastRow As Integer
    Dim i As Integer

    ScreenUpdate = False

' 初期データ入力

        eName = sh1.Range("AC4").Value

        Me.TextBox6.Text = eName
        Me.TextBox7.Text = eName

        Worksheets("Start").Select

        lastRow = sh3.Cells(Rows.Count, 1).End(xlUp).Row

            For i = 3 To lastRow

                ComboBox1.AddItem sh3.Cells(i, 2).Value

            Next i

        lastRow = sh3.Cells(Rows.Count, 1).End(xlUp).Row

            For i = 3 To lastRow

                ComboBox2.AddItem sh3.Cells(i, 3).Value

            Next i

    ScreenUpdate = True

End Sub


Private Sub CommandButton3_Click()

Dim sh1 As Worksheet: Set sh1 = Worksheets("data_list")
Dim sh2 As Worksheet: Set sh2 = Worksheets("data")
Dim i As Integer
Dim ls As Integer
Dim lsz As Integer

    ScreenUpdate = False

    Application.DisplayAlerts = False

'Error処理
'会社名

 エラー処理の部分は省略します

'転記

        sh1.Unprotect

            For ls = 14 To 23 Step 3
            lsz = ls + 1

                sh1.Range("D" & ls).Value = ComboBox1.Value
                sh1.Range("I" & ls).Value = ComboBox2.Value
                If ChekcBox1 = True Then
                sh1.Range("L" & ls).Value = "50年"
                Else
                sh1.Range("L" & ls).Value = TextBox5.Value
                End If
                sh1.Range("N" & ls).Value = TextBox6.Value
                sh1.Range("R" & ls).Value = TextBox7.Value
                sh1.Range("V" & ls).Value = TextBox8.Value
                If OptionButton3 = True Then
                sh1.Range("X" & ls).Value = "後期型"
                Else
                sh1.Range("X" & ls).Value = "前期型"
                End If
                sh1.Range("Z" & lsz).Value = TextBox9.Value

            Next ls

            Application.DisplayAlerts = False

                    sh1.Protect

        Application.DisplayAlerts = True

    ScreenUpdate = True


< 使用 Excel:Excel2010、使用 OS:Windows7 >


とりあえず、見づらかった&好みでは無かったのでコードを整理してみました。

    Private Sub UserForm_Initialize()
    '//ユーザーフォームを読み込んだ時の処理

        Dim i As Integer
        'ScreenUpdate = False 完成&意味が分かるまで封印

        ' 初期データ入力
        With Worksheets("data_list")
            Me.TextBox6.Text = .Range("AC4").Value
            Me.TextBox7.Text = .Range("AC4").Value

            '↓こうすれば、「CommandButton3」をクリックするたびに保護解除&保護は必要ない(ハズ)
            .Unprotect
            .Protect UserInterfaceOnly:=True

        End With

        Worksheets("Start").Select '←何をしたいのか?

        With Worksheets("h_list")
            For i = 3 To .Cells(.Rows.Count, "A").End(xlUp).Row
                ComboBox1.AddItem .Cells(i, "B").Value
                ComboBox2.AddItem .Cells(i, "C").Value
            Next i
        End With

        ScreenUpdate = True
    End Sub

    Private Sub CommandButton3_Click()
    '// CommandButton3 をクリックしたときの処理

        Dim ls As Integer

        'ScreenUpdate = False 完成&意味が分かるまで封印

        'Error処理
            '〜処理〜
              '↑どんな時にエラーが出るのかは考えたほうがよい。
              '(回避できるはずのエラーであれば、エラー処理自体が要らないため)

        '転記
        For ls = 14 To 23 Step 3

            With Worksheets("data_list")
                .Range("D" & ls).Value = ComboBox1.Value
                .Range("I" & ls).Value = ComboBox2.Value

                .Range("N" & ls).Value = TextBox6.Value
                .Range("R" & ls).Value = TextBox7.Value
                .Range("V" & ls).Value = TextBox8.Value

                .Range("Z" & ls + 1).Value = TextBox9.Value

                '↓Trueであるかの真偽を判定していたけど、そもそもの返り値がBoolean型ですよね
                If ChekcBox1 Then
                    .Range("L" & ls).Value = "50年"
                Else
                    .Range("L" & ls).Value = TextBox5.Value
                End If

                '↓Trueであるかの真偽を判定していたけど、そもそもの返り値がBoolean型ですよね
                If OptionButton3 Then
                    .Range("X" & ls).Value = "後期型"
                Else
                    .Range("X" & ls).Value = "前期型"
                End If
            End With

        Next ls

        ScreenUpdate = True
    End Sub

そのうえで以下の意味がよくわかりません。
>For〜Nextを使うと(当たり前ですが)最初の入力データで埋まって
>しまいました。('転記 の部分です)
>空白の最下行を見つけながら行の変数を変えることも考えましたが
>フォームの初期化が上手くいかないかもと思っています。

もしかして、今のコードだと14行目から23行目まで3行おきに同じデータを出力するようになってますけど、
1件目 → 14行目に出力
2件目 → 17行目に出力
3行目 → 21行目に出力
みたいにしたかったってことですかね?

(もこな2) 2018/10/20(土) 14:34


転記レッスンでしたら一応UserFormは置いておいて。。。
UserFormで入力(作成)されるであろう仮データーをいくつか作り
思い通りに転記出来るか実験するのも解りやすくていいですよ。

(隠居じーさん) 2018/10/20(土) 15:01


とりあえず、推測どおりならこんなかんじもありですかね・・

    Private Sub CommandButton3_Click()
    '// CommandButton3 をクリックしたときの処理

        Dim i As Long

        '転記
        With Worksheets("data_list")

            'やっつけだが、こんな感じではどうでしょうか
            i = .Cells(.Rows.Count, "D").End(xlUp).Row
            If i < 14 Then
                i = 14
            End If
                i = i + 3
            End If

            .Range("D" & i).Value = ComboBox1.Value
            .Range("I" & i).Value = ComboBox2.Value

            .Range("N" & i).Value = TextBox6.Value
            .Range("R" & i).Value = TextBox7.Value
            .Range("V" & i).Value = TextBox8.Value

            .Range("Z" & i + 1).Value = TextBox9.Value

            .Range("L" & i).Value = Array(TextBox5.Value, "50年")(Abs(ChekcBox1))
            .Range("X" & i).Value = Array("前期型", "後期型")(Abs(OptionButton3))

        End With

        'オブジェクト名を工夫したり、コレクションにセットして
        'ループを回すという手もありあそうですがとりあえず・・
            ComboBox1.Value = ""
            ComboBox2.Value = ""
            TextBox5.Value = ""
            TextBox6.Value = ""
            TextBox7.Value = ""
            TextBox8.Value = ""
            TextBox9.Value = ""

            ChekcBox1 = False
            OptionButton3 = False
    End Sub

(もこな2) 2018/10/20(土) 15:21


ニックネームなし さま

隠居じーさん さま

もこな2 さま

貴重なご指摘ならびにアドバイスありがとうございます。
すべてを確認してる時間が今はありませんが、Google先生にお願いしながら
分からない部分の意味を調べているところです。

その上で、教えていただいたものを使って試してみたいと思います。

また悩みが出ましたら、ご助力をお願いしたいと思います。
とりあえずのお礼まで。

(BeOS) 2018/10/20(土) 16:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.