[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『一覧表の内容を変更するユーザーフォームを作りたい』(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.