[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『一覧表の内容を変更するユーザーフォームを作りたい』(VBA初心者)
初投稿です。
以下のような表があるとします。
A B C 1 番号 件名 日付 2 1 A 1/31 3 2 B 2/5 4
件名・日付セルへの入力はユーザーフォームを使用しており、
最終行を取得し、一番上の空白セルに入力されるようにしています。
番号列の値は元々入力されてあります。
また、番号列(例:A2セル)をダブルクリックするとユーザーフォームが
開かれ、番号セルに対応した件名と日付が自動でテキストボックスに
入力される、というユーザーフォームを作成しました。
ここで質問なのですが、件名や日付に誤りがあった場合再度番号セルを
ダブルクリックし、ユーザーフォームの内容を変更して反映すると、
当然ですが4行目に反映されます。
選択した番号セルの件名・日付を変更するにはどのようなVBAを組めば
よろしいでしょうか。
< 使用 Excel:Office365、使用 OS:Windows10 >
色々方法は有ると思いますが基本的には 一意なキーを持たせて、←無ければあえて、作り込みます^^; ↑の場合でしたら、番号か、番号+日付等 そのキーを使い合致する行の情報を書き換えます。 該当キーが無ければ新規情報として末尾に追加。。。が定番かも リストボックスに表示させて選択と両道にすれば便利ですよ。 m(_ _)m (隠居Z) 2022/01/13(木) 16:12
(隠居Z) 2022/01/13(木) 16:17
>番号セルに対応した件名と日付が自動でテキストボックスに >入力される、というユーザーフォームを作成しました。 そのコードを提示してみてください。 改編する必要があるかもしれません。
(nm) 2022/01/13(木) 17:14
【シートモジュール(Sheet2)】
Option Explicit Public 行 As Long '------------------------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("A2:A1000")) Is Nothing Then Cancel = True If Cells(Target.Row, "B").Value = "" Then 行 = Cells(Rows.Count, "B").End(xlUp).Row + 1 Else 行 = Target.Row End If UserForm1.Show vbModeless End If End Sub
【ユーザーフォームモジュール(UserForm1)】
Option Explicit '------------------------------------------------ Private Sub UserForm_Initialize() Me.TextBox1.Value = Sheet2.Cells(Sheet2.行, "B").Value Me.TextBox2.Value = Sheet2.Cells(Sheet2.行, "C").Value End Sub '------------------------------------------------ Private Sub CommandButton1_Click() Sheet2.Cells(Sheet2.行, "B").Value = Me.TextBox1.Value Sheet2.Cells(Sheet2.行, "C").Value = Me.TextBox2.Value Unload Me End Sub
他にもキャッチボールの途中になってしまっているトピックがあるとおもいますので、新しい質問をするのも結構ですが、それぞれきちんと対応しておくとよいようにおもいます。
(もこな2) 2022/01/15(土) 10:23
(もこな2) 2022/01/15(土) 13:11
シートのモジュール>>
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True If Target.Count > 1 Then Exit Sub If Target.Column > 1 Then Exit Sub With Me.UsedRange If Intersect(.Cells, Target) Is Nothing Then Set Target = .Rows(.Rows.Count + 1).Cells Else Set Target = Intersect(Target.EntireRow, .Cells).Cells End If End With
With UserForm1 .TextBox1.Text = Target(1).Value .TextBox2.Text = Target(2).Value .TextBox3.Text = Target(3).Value .Tag = Target.Address(External:=True) .Show End With End Sub
ユーザーフォームのモジュール>>
Option Explicit
Private Sub CommandButton1_Click()
With Application.Range(Me.Tag) .Cells(1).Value = Me.TextBox1.Text .Cells(2).Value = Me.TextBox2.Text .Cells(3).Value = Me.TextBox3.Text End With
Unload Me End Sub
ユーザーフォームにTagプロパティという、文字列を格納できるプロパティがあるので、
そこに対象のセルアドレスを記録しておいて、
変数のように使ったらいかがでしょうか?
(まっつわん) 2022/01/15(土) 16:42
>番号セルに対応した件名と日付が自動でテキストボックスに >入力される、というユーザーフォームを作成しました。 番号セルに対応した件名と日付をテキストボックスに入力するのではないのですか。 (・・・) 2022/01/15(土) 20:22
(1)問答無用で↓をしてしまうのはマズくないのでしょうか?
Cancel = True
(2)BeforeDoubleClickイベントの場合、通常はTargetが複数セルになり得ることがないから↓は要らないような気がするのですが、結合セル対策でしょうか?
If Target.Count > 1 Then Exit Sub If Target.Column > 1 Then Exit Sub
(もこな2) 2022/01/16(日) 09:34
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.