[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームを使った一覧表へのデータ入力について』(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
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
もしかして、今のコードだと14行目から23行目まで3行おきに同じデータを出力するようになってますけど、
1件目 → 14行目に出力
2件目 → 17行目に出力
3行目 → 21行目に出力
みたいにしたかったってことですかね?
(もこな2) 2018/10/20(土) 14:34
(隠居じーさん) 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.