[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『UserForm2で検索してリストボックスに表示、UserForm1に表示させて修正・変更登録』(もか)
はじめまして。いつも拝見し勉強させてもらっています。
初めて質問しています。
ネットを見ながらひろってくっつけて、途中まで動くコードがあるのですが、この先手詰まり状態でとても困っています。
やりたいことは、検索→変更(修正)→保存です。
変更(修正)のため、UserForm2のTextBox2つで各項目検索し、ListBox1に表示されます。(部分一致検索で2項目)
該当のものをダブルクリックし、該当行すべてUserForm1に表示されます。
変更箇所を修正したら、検索した該当行ごと保存したいです。
検索→UserForm1に表示までできます。が、その先が動きません。
イメージはできているのですが、形にできず、焦っています。
どうかご教示ください。
UserForm1に入力して登録すると、"データ"シートの最下行へ登録されていきます。
UserForm2は名前と住所でそれぞれTextBoxを分けて部分一致検索しています。
●UserForm2のコード
Private Sub CommandButton1_Click()
Dim lastRow As Long Dim myData, myData2(), myno Dim i As Long, j As Long, cn As Long
If TextBox1.Value = "" And TextBox2.Value = "" Then End
'検索するデータを配列 myData に格納。
With Worksheets("データ") myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
End With
'配列 myData の中で検索で一致したデータを配列 myData2 に格納。
ReDim myData2(1 To lastRow, 1 To 13)
For i = LBound(myData) To UBound(myData)
If myData(i, 3) Like "*" & TextBox1.Value & "*" And myData(i, 5) Like "*" & TextBox2.Value & "*" Then cn = cn + 1 myData2(cn, 1) = myData(i, 1) myData2(cn, 2) = myData(i, 2) myData2(cn, 3) = myData(i, 3) myData2(cn, 4) = myData(i, 4) myData2(cn, 5) = myData(i, 5) myData2(cn, 6) = myData(i, 6) myData2(cn, 7) = myData(i, 7) myData2(cn, 8) = myData(i, 8) myData2(cn, 9) = myData(i, 9) myData2(cn, 10) = myData(i, 10) myData2(cn, 11) = myData(i, 11) myData2(cn, 12) = myData(i, 12) myData2(cn, 13) = myData(i, 13)
End If
Next i '検索で一致したデータをリストボックスに表示。 With ListBox1 .List = myData2
End With
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
With Me.ListBox1
UserForm1.TextBox1.Text = .List(.ListIndex, 0) UserForm1.TextBox2.Text = .List(.ListIndex, 1) UserForm1.TextBox3.Text = .List(.ListIndex, 2) UserForm1.TextBox4.Text = .List(.ListIndex, 3) UserForm1.TextBox5.Text = .List(.ListIndex, 4) UserForm1.TextBox6.Text = .List(.ListIndex, 5) UserForm1.ComboBox1.Text = .List(.ListIndex, 6) UserForm1.ComboBox2.Text = .List(.ListIndex, 7) UserForm1.ComboBox3.Text = .List(.ListIndex, 8) UserForm1.ComboBox4.Text = .List(.ListIndex, 9) UserForm1.TextBox7.Text = .List(.ListIndex, 10) UserForm1.TextBox8.Text = .List(.ListIndex, 11) UserForm1.TextBox9.Text = .List(.ListIndex, 12)
UserForm1.TextBox2 = Format(.List(.ListIndex, 1), "h:mm")
UserForm1.Show
End With
End Sub
○UserForm1のコード
Private Sub CommandButton1_Click()
Dim i As Long
Dim strmsg As String
strmsg = "登録してよろしいですか?"
Application.ScreenUpdating = False
If TextBox1.Text = "" Then MsgBox "日付を、" & vbCrLf & "「yyyy/mm/dd」の形式で入力ください。", Title:="未入力です" Exit Sub End If
If Len(TextBox1.Text) <> 10 Then MsgBox "日付を「 yyyy/mm/dd 」 の形式で入力下さい", Title:="入力形式エラー" Exit Sub End If
If TextBox2.Text = "" Then MsgBox "時間を入力ください。", Title:="未入力です" Exit Sub End If
If TextBox3.Text = "" Then MsgBox "名前を入力ください。", Title:="未入力です" Exit Sub End If
'〒は空欄でも○
If TextBox5.Text = "" Then MsgBox "住所を入力ください。!", Title:="未入力です" Exit Sub End If
If TextBox6.Text = "" Then MsgBox "電話番号を入力ください。", Title:="未入力です" Exit Sub End If
If ComboBox1.Text = "" Then MsgBox "種類を選択ください。", Title:="未入力です" Exit Sub End If
If ComboBox2.Text = "" Then MsgBox "区分を選択ください。", Title:="未入力です" Exit Sub End If
If ComboBox3.Text = "" Then MsgBox "担当者を選択ください。", Title:="未入力です" Exit Sub End If
If ComboBox4.Text = "" Then MsgBox "担当部署を選択ください。", Title:="未入力です" Exit Sub End If
If TextBox7.Text = "" Then MsgBox "議事録が選ばれていません。" & vbCrLf & "参照ボタンよりファイルを選択ください。", Title:="未選択です" Exit Sub End If
If TextBox8.Text = "" Then MsgBox "写真が選ばれていません。" & vbCrLf & "参照ボタンよりフォルダを選択ください。", Title:="未選択です" Exit Sub End If
'備考は空欄でも○
If MsgBox(strmsg, vbOKCancel + vbQuestion, "登録ボタン") = vbCancel Then MsgBox "キャンセルされました。"
Exit Sub
Else
End If
MsgBox "登録しました!", Title:="登録ボタン"
i = Range("A" & Rows.Count).End(xlUp).Offset(1).Row UpDate i
End Sub
Private Sub CommandButton6_Click()
UpDate i
End Sub
Private Sub UpDate(i As Long)
With Rows(i) .Range("A1").Value = TextBox1.Text .Range("B1").Value = TextBox2.Text .Range("C1").Value = TextBox3.Text .Range("D1").Value = TextBox4.Text .Range("E1").Value = TextBox5.Text .Range("F1").Value = TextBox6.Text .Range("G1").Value = ComboBox1.Text .Range("H1").Value = ComboBox2.Text .Range("I1").Value = ComboBox3.Text .Range("J1").Value = ComboBox4.Text .Range("K1").Value = TextBox7.Text .Range("L1").Value = TextBox8.Text .Range("M1").Value = TextBox9.Text End With
Unload Me
TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" ComboBox1.Text = "" ComboBox2.Text = "" ComboBox3.Text = "" ComboBox4.Text = "" TextBox7.Text = "" TextBox8.Text = "" TextBox9.Text = ""
Application.ScreenUpdating = True
End Sub
以上です。
ネットから引用しているものばかりで、統一性のないと思われるかと思いますが、なにとぞご協力のほどよろしくお願いいたします。
< 使用 Excel:Excel2013、使用 OS:unknown >
>>検索→UserForm1に表示までできます。が、その先が動きません。
そうの先、正しいかどうかは別にして動きますよ。
>>UserForm1に入力して登録すると、"データ"シートの最下行へ登録されていきます。
そうですね。
i = Range("A" & Rows.Count).End(xlUp).Offset(1).Row UpDate i
i に 最終行の次の行をいれていますので末尾追加になりますね。 ある意味、コード通りに動いています。
読みこんだデータに対して更新をかけたいということですか?
いくつか方法があるかと思いますが、簡単なのは、
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value
これを 13列ではなく 14列の取り込みにして、取り込んだ後、配列内の14列目に 1〜の連番(行番号)を振っておく。
ReDim myData2(1 To lastRow, 1 To 13)
ここも 14列にしておく。(ListBox1 の ColumnCount は、増やさなくてもいいです)
そうすると、ダブルクリックされた行の 14列目、.List(.ListIndex, 13) が 行番号ですから これを i にいれて UpDate 処理を行えばよろしいかと。
★それと、この処理をする際には、必ず データ シートが表示されている保証があるならいいのですけど UserForm2 では シート修飾をしているわけですが、UserForm1 では、いっさい シート修飾がなされていないので 処理時点のアクティブシートに書きこんでいますよ。
(β) 2016/08/30(火) 13:28
→そうですね。UF2で検索してUF1に表示させるやつは、更新するときに使用します。
UserForm1 では、いっさい シート修飾がなされていないので処理時点のアクティブシートに書きこんでいますよ。
→ご指摘ありがとうございます。そこまでコードが進まないもので、気づきませんでした。
Private Sub CommandButton6_Click()
UpDate i
End Sub
のところで、変数が定義されていませんとエラーが出て止まってしまいます。
でも、先ほどまでのだと、型が一致しませんでした。
(もか) 2016/08/30(火) 14:18
この CommandButton6 は、何のためのボタンですか? エラーはわかりますよね? コンパイルエラーですが、
CommandButton1_Click では Dim i As Long という宣言があって、i に値を入れて(最終行の次の行番号ですけど) Update i としていますが、 CommandButton6_Click では、変数宣言もなければ、その変数に値もいれず Update i。
たとえ コンパイルエラーが解消されても、これでは具合悪いですね。
>>でも、先ほどまでのだと、型が一致しませんでした。
意味がわかりません。 先ほどまでの とは 何のことですか?
(β) 2016/08/30(火) 14:39
「先ほどまでの」とは、ご指摘いただいた13を14に、14列目に連番をとヒントをいただいたことをやったら、ということです。
同じところでエラーが発生するのですが、何か変更したり修正したとしても、別のエラーコードが出て、宣言していないからエラーするというのも、エラーになってからでないと気付けないくらいこんがらがってしまっています。
せっかく教えてくださっているのに、すみません・・・
(もか) 2016/08/30(火) 16:02
ということは CommandButton1 が末尾追加、CommandButton6が、その指定データの更新 ということですか? もし、そういうことであれば、それようにコード案をアップしますけど。
(β) 2016/08/30(火) 16:44
ありがたいお申し出、感謝します。
ぜひよろしくお願いいたします。
(もか) 2016/08/30(火) 17:01
アップされたチェックロジック等、これでいいのかなぁ、もう少し工夫もできるかなぁといったところは ありますが、できるだけ 現行のロジックのままにしてあります。
なお、UserForm1 に TextBox10 を追加し、デザインで Visible を False にしておいてください。
●UserForm1 モジュール
Private Sub CommandButton1_Click() '新規登録 Dim i As Long
If precheck("新規登録してよろしいですか?") Then i = Sheets("データ").Range("A" & Rows.Count).End(xlUp).Offset(1).Row UpDate i End If
End Sub
Private Sub CommandButton6_Click() '更新 Dim i As Long
If TextBox10.Text = "" Then MsgBox "更新処理はできません" Exit Sub End If
If precheck("更新してよろしいですか?") Then i = Val(TextBox10.Text) UpDate i End If
End Sub
Private Function precheck(msg As String) As Boolean
If TextBox1.Text = "" Then MsgBox "日付を、" & vbCrLf & "「yyyy/mm/dd」の形式で入力ください。", Title:="未入力です" Exit Function End If
If Len(TextBox1.Text) <> 10 Then MsgBox "日付を「 yyyy/mm/dd 」 の形式で入力下さい", Title:="入力形式エラー" Exit Function End If
If TextBox2.Text = "" Then MsgBox "時間を入力ください。", Title:="未入力です" Exit Function End If
If TextBox3.Text = "" Then MsgBox "名前を入力ください。", Title:="未入力です" Exit Function End If
'〒は空欄でも○
If TextBox5.Text = "" Then MsgBox "住所を入力ください。!", Title:="未入力です" Exit Function End If
If TextBox6.Text = "" Then MsgBox "電話番号を入力ください。", Title:="未入力です" Exit Function End If
If ComboBox1.Text = "" Then MsgBox "種類を選択ください。", Title:="未入力です" Exit Function End If
If ComboBox2.Text = "" Then MsgBox "区分を選択ください。", Title:="未入力です" Exit Function End If
If ComboBox3.Text = "" Then MsgBox "担当者を選択ください。", Title:="未入力です" Exit Function End If
If ComboBox4.Text = "" Then MsgBox "担当部署を選択ください。", Title:="未入力です" Exit Function End If
If TextBox7.Text = "" Then MsgBox "議事録が選ばれていません。" & vbCrLf & "参照ボタンよりファイルを選択ください。", Title:="未選択です" Exit Function End If
If TextBox8.Text = "" Then MsgBox "写真が選ばれていません。" & vbCrLf & "参照ボタンよりフォルダを選択ください。", Title:="未選択です" Exit Function End If
'備考は空欄でも○
If MsgBox(msg, vbOKCancel + vbQuestion, "登録ボタン") = vbCancel Then MsgBox "取り消しされました" Exit Function End If
precheck = True
End Function
Private Sub UpDate(i As Long)
With Sheets("データ").Rows(i) .Range("A1").Value = TextBox1.Text .Range("B1").Value = TextBox2.Text .Range("C1").Value = TextBox3.Text .Range("D1").Value = TextBox4.Text .Range("E1").Value = TextBox5.Text .Range("F1").Value = TextBox6.Text .Range("G1").Value = ComboBox1.Text .Range("H1").Value = ComboBox2.Text .Range("I1").Value = ComboBox3.Text .Range("J1").Value = ComboBox4.Text .Range("K1").Value = TextBox7.Text .Range("L1").Value = TextBox8.Text .Range("M1").Value = TextBox9.Text End With
MsgBox "登録/更新しました!", Title:="登録ボタン"
Unload Me
End Sub
●UserForm2モジュール
Private Sub CommandButton1_Click()
Dim lastRow As Long Dim myData, myData2(), myno Dim i As Long, j As Long, cn As Long
If TextBox1.Value = "" And TextBox2.Value = "" Then Exit Sub ' End
'検索するデータを配列 myData に格納。
With Worksheets("データ")
'★ここから変更 myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Resize(, 14).Value For i = 1 To UBound(myData) myData(i, 14) = i Next '★変更終わり
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
End With
'配列 myData の中で検索で一致したデータを配列 myData2 に格納。
ReDim myData2(1 To lastRow, 1 To 14) '★変更
For i = LBound(myData) To UBound(myData)
If myData(i, 3) Like "*" & TextBox1.Value & "*" And myData(i, 5) Like "*" & TextBox2.Value & "*" Then cn = cn + 1 myData2(cn, 1) = myData(i, 1) myData2(cn, 2) = myData(i, 2) myData2(cn, 3) = myData(i, 3) myData2(cn, 4) = myData(i, 4) myData2(cn, 5) = myData(i, 5) myData2(cn, 6) = myData(i, 6) myData2(cn, 7) = myData(i, 7) myData2(cn, 8) = myData(i, 8) myData2(cn, 9) = myData(i, 9) myData2(cn, 10) = myData(i, 10) myData2(cn, 11) = myData(i, 11) myData2(cn, 12) = myData(i, 12) myData2(cn, 13) = myData(i, 13) myData2(cn, 14) = myData(i, 14) '★追加 End If
Next i '検索で一致したデータをリストボックスに表示。 With ListBox1 .List = myData2 End With
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
With Me.ListBox1
UserForm1.TextBox1.Text = .List(.ListIndex, 0) UserForm1.TextBox2.Text = .List(.ListIndex, 1) UserForm1.TextBox3.Text = .List(.ListIndex, 2) UserForm1.TextBox4.Text = .List(.ListIndex, 3) UserForm1.TextBox5.Text = .List(.ListIndex, 4) UserForm1.TextBox6.Text = .List(.ListIndex, 5) UserForm1.ComboBox1.Text = .List(.ListIndex, 6) UserForm1.ComboBox2.Text = .List(.ListIndex, 7) UserForm1.ComboBox3.Text = .List(.ListIndex, 8) UserForm1.ComboBox4.Text = .List(.ListIndex, 9) UserForm1.TextBox7.Text = .List(.ListIndex, 10) UserForm1.TextBox8.Text = .List(.ListIndex, 11) UserForm1.TextBox9.Text = .List(.ListIndex, 12) UserForm1.TextBox2 = Format(.List(.ListIndex, 1), "h:mm") UserForm1.TextBox10.Text = .List(.ListIndex, 13) '★追加 UserForm1.Show
End With
End Sub
(β) 2016/08/30(火) 17:55
拝見し、コピーさせていただきました。
実行しましたら、見事動きました。
追加・変更いただいた箇所を確認し、今後につなげたいと思います。
本当にありがとうございました!
絶対完成させます!
(もか) 2016/08/31(水) 11:41
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.