ユーザーフォームについてやりたいこととしては①ユーザーフォームのマスタナンバー欄に数字を入力することによって”マスタデータ”シートの名前や住所などを表示させたい。②変更がなければ登録ボタンより”登録”シートに転記させ、変更があればテキストボックスに入力したうえで転記させたい。sub データの取得() lRow = Cells(Rows.Count, \u0026quot;A\u0026quot;).End(xlUp).Row + 1 '登録シートA列の再最終行を取得 Dim x As Long x = TextBox1.Value 'テキストボックス1を検索値としてテキストボックス2に値を返す。 TextBox2.Value = Application.WorksheetFunction.VLookup(x, Worksheets(\u0026quot;マスタデータ\u0026quot;).Rows(\u0026quot;A:E\u0026quot;), 2, False)End Sub①は色々調べて上のコードにしたんですがうまくできませんでした。②はまったくわかりませんでした。

1件の回答

回答を書く

1031066

2026-02-15 05:25

+ フォロー

シートレイアウトはあくまでイメージで、部分的でよいので①、②の処理を行うコード(というか考え方)が知りたい、ということだと理解しました。

\u0026gt; ①ユーザーフォームのマスタナンバー欄に数字を入力することによって

まず \u0026quot;Sub データの取得()\u0026quot; で始まるようなプロシージャではなく、以下のようなマスタナンバーを入力したという「イベント」で自動的に実行されるものにします。

Private Sub txtマスタNo_AfterUpdate()

テキストボックスの名前は適当です。イベントも AfterUpdate の他にいろいろあります(個人的には Exit をよく使います)が、ひとまず引数がなくてシンプルな AfterUpdate とします。

\u0026gt; ”マスタデータ”シートの名前や住所などを表示させたい。

VLOOKUP でもよいですが、取得項目数分繰り返すのもうっとうしいので、MATCH を使うことにします。これでマスタデータの行番号が取得できるので、あとは順に対応するテキストボックスに取り込みます。

\u0026gt; ②変更がなければ登録ボタンより”登録”シートに転記させ、変更があればテキストボックスに入力したうえで転記させたい

変更の有無は関係無いでしょう。要するに「名簿登録」を押したら「登録」シートに転記、ですよね。
まずは「登録」シートの転記先の行番号を取得するのに、シートを明示的に指定します。

lRow = Worksheets(\u0026quot;登録\u0026quot;).Cells(Rows.Count, \u0026quot;A\u0026quot;).End(xlUp).Row + 1

あとはユーザーフォームの表示と逆に、同じ行のセルに順に書き出すだけです。
ということで以下のような感じ。「マスタデータ」も「登録」も図と同じレイアウトだとします。

Enum Koumoku
    マスタNo = 1
    名前
    住所
    金融機関
    口座番号
End Enum
Private WsMaster As Worksheet, WsRegist As Worksheet

Private Sub btn名簿登録_Click() '②
    With WsRegist
        Dim lRow As Long
        lRow = .Cells(Rows.Count, \u0026quot;A\u0026quot;).End(xlUp).Row + 1
        .Cells(lRow, Koumoku.マスタNo).Value = Me.txtマスタNo.Value
        .Cells(lRow, Koumoku.名前).Value = Me.txt名前.Value
        .Cells(lRow, Koumoku.住所).Value = Me.txt住所.Value
        .Cells(lRow, Koumoku.金融機関).Value = Me.txt金融機関.Value
        .Cells(lRow, Koumoku.口座番号).Value = Me.txt口座番号.Value
    End With
End Sub

Private Sub txtマスタNo_AfterUpdate()   '①
    With WsMaster
        Dim rMaster As Variant
        rMaster = Application.Match(CLng(Me.txtマスタNo.Value), .Columns(\u0026quot;A\u0026quot;), 0)
        If IsError(rMaster) Then
            MsgBox \u0026quot;No Data.\u0026quot;, vbExclamation
            Exit Sub
        End If
        Me.txt名前.Value = .Cells(rMaster, Koumoku.名前).Value
        Me.txt住所.Value = .Cells(rMaster, Koumoku.住所).Value
        Me.txt金融機関.Value = .Cells(rMaster, Koumoku.金融機関).Value
        Me.txt口座番号.Value = .Cells(rMaster, Koumoku.口座番号).Value
    End With
End Sub

Private Sub UserForm_Initialize()
    Set WsMaster = Worksheets(\u0026quot;マスタデータ\u0026quot;)
    Set WsRegist = Worksheets(\u0026quot;登録\u0026quot;)
End Sub

UserForm_Initialize の処理や Enum などは必須ではありませんが、他の処理や可読性を考慮したつもりです。テキストボタンなどの名前は適当ですが、分かりやすいかと思います。

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有