[[20220113154448]] 『一覧表の内容を変更するユーザーフォームを作りた』(VBA初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『一覧表の内容を変更するユーザーフォームを作りたい』(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

<>>リストボックスに表示させて選択と両道にすれば便利ですよ。

余計なお世話だったかもですね。。。
済みません。^^;
m(__)m

(隠居Z) 2022/01/13(木) 16:17


 >番号セルに対応した件名と日付が自動でテキストボックスに 
 >入力される、というユーザーフォームを作成しました。
 そのコードを提示してみてください。
 改編する必要があるかもしれません。

(nm) 2022/01/13(木) 17:14


[[20220114202007]] 『別シートへ転記した列の値を削除したい』(VBA勉強中)
γさんから↑で【標準モジュール】に広域変数を用意しておく案がありましたが、シートモジュールに設置しても大丈夫っぽいですね。(ただし、モジュールを指定する必要がある)

【シートモジュール(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.