- 締切済み
リストボックスでデータを呼び出し→修正を反映させる方法を教えてください
マクロ初心者です。(エクセル2003使用_ユーザーフォーム) リストボックスで表示した行のデータをユーザーフォームに呼び出し、修正を加える方法を教えてください。 (Sheet1のデータ) 客先 管理番号 品名 注文数量 出荷数量 出荷日 完納状況 G社 1324 パソコン 30 20 K社 1554 プリンタ 250 70 8月9日 J社 7634 テレビ 40 25 K社 4653 パソコン 75 75 6月4日 完納 G社 6675 パソコン 170 60 G社 7789 プリンタ 200 120 表の行数は、日々変動し、出荷日や完納状況欄は、分かり次第記入や変更をするため、空白の箇所もあります。 (コマンドボタン1まで動く(日付が数字になってしまうが)コード) Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "50;50;50" .ColumnCount = 2 .RowSource = "Sheet1!A2:G" & Worksheets("Sheet1").Range("G" & Rows.Count).End(xlUp).Row End With End Sub →リストに表示されるが、本当は<管理番号>と<品名>を表示させたいです。(今は、客先と管理番号です) Private Sub CommandButton1_Click() TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 5) →日付が数字ででてしまいます。 TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 6) End Sub Private Sub CommandButton2_Click() TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 5) →動きません。 TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 6) →動きません。 End Sub 空白は、空白のまま表示させたり、修正したいと思っています。 (例 管理番号1554の日付を8月14日にのみ修正したい時、そこは修正し、完納欄は空白のまま表示され、空白の状態でコマンド2を押すことができてほしいということです) すみませんが、どなたかご回答よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
以下のような感じでいいのでは ・・・ Option Explicit Private Sub CommandButton1_Click() ' リストボックスで選択された行がある If ListBox1.ListIndex <> -1 Then ' 元のデータの日付の入力をチェック If Not IsEmpty(ListBox1.List(ListBox1.ListIndex, 5)) Then ' 日付型に変換して Formatで表示形式を整形 TextBox1.Value = Format(CDate(ListBox1.List(ListBox1.ListIndex, 5)), "m月d日") Else TextBox1.Value = "" End If TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 6) End If End Sub Private Sub CommandButton2_Click() ' 選択された行のチェック If ListBox1.ListIndex <> -1 Then Dim r As Range ' 元データの範囲を取得 Set r = Sheets("Sheet1").Range("A1").CurrentRegion.Offset(1) Set r = r.Resize(r.Rows.Count - 1) ' 日付型かどうかをチェック If IsDate(TextBox1.Value) Then ' 選択されたセルの更新 r(ListBox1.ListIndex + 1, 6) = TextBox1.Value End If r(ListBox1.ListIndex + 1, 7) = TextBox2.Value End If End Sub Private Sub UserForm_Initialize() Dim r As Range ' セルA1を基準にしたデータ範囲を取得 Set r = Sheets("Sheet1").Range("A1").CurrentRegion.Offset(1) ' 先頭の題目分を除外 Set r = r.Resize(r.Rows.Count - 1) With ListBox1 ' 列の表示幅の設定 .ColumnWidths = "0;50;50;" ' 何列あるのかを設定 .ColumnCount = 3 ' 元データの設定 .RowSource = r.Address(0, 0) End With End Sub といった具合で ・・・
- nag0720
- ベストアンサー率58% (1093/1860)
.RowSource = "Sheet1!A2:G" & Worksheets("Sheet1").Range("G" & Rows.Count).End(xlUp).Row これだと、示された例でいうと、始めの4件しかリストに表示されません。(最後の2件は表示されません) これが望み通りのリスト内容ならいいんですが・・・ もし、リストに全部表示したいなら、 .RowSource = "Sheet1!A2:G" & Worksheets("Sheet1").Range("B" & Rows.Count).End(xlUp).Row
- watabe007
- ベストアンサー率62% (476/760)
>本当は<管理番号>と<品名>を表示させたいです。(今は、客先と管理番号です) Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "50;50;50" '→ "0;50;50" 一列目の幅を0にする .ColumnCount = 2 '→3 .RowSource = "Sheet1!A2:G" & Worksheets("Sheet1").Range("G" & Rows.Count).End(xlUp).Row End With >日付が数字ででてしまいます。 Format関数で日付に変更してください >Private Sub CommandButton2_Click() >TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 5) →動きません。 セルの値を修正するのなら Range(該当セル).Value= TextBox1.Value となるのでは?
お礼
すごいです。完璧です!ありがとうございます。 自分でも理解できるように、これから勉強します。 本当にありがとうございます。