2025/02/21
【ExcelVBA】相関性を保ったまま重複のない番号を自動入力

【ExcelVBA】相関性を保ったまま重複のない番号を自動入力

「No」や「ID」の項目などで重複のない番号を自動入力する際に、以下のようにROW関数を活用して入力することがあります。

しかし、ROW関数を活用して入力していると、表を並べ替えた時に番号が更新されてしまい、番号と他の項目との相関性がなくなってしまいます。

ということで今回は、相関性を保ったまま重複のない番号を自動入力する仕組みの実現方法について解説します。
※こちらで開発したファイルは記事の最後にて配布しています。

ExcelVBAレベル確認

1. 開発準備

今回は、以下の表の「Name」の項目に値が入力されると同時に、「No」の項目に重複のない番号を入力するという仕組みを実現します。

そのように、特定のシートで特定のセルが編集された時に処理を自動で実行するには、「シートモジュール」の「イベントプロシージャ」を活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

選択すると、以下のエディタ画面(VBE)が表示されます。
また、該当するシートのシートモジュールが表示された状態になります。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、該当するシートのセルに値を入力すると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

「Worksheet」を選択すると、自動で「Worksheet_SelectionChange」というプロシージャが表示されます。
このプロシージャは、該当するシート上のいずれかのセルが選択されると同時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、セルに値を入力すると同時に処理が実行されるものになります。
そのため、右上のリストから「Change」を選択します。

表示された「Worksheet_Change」というプロシージャを活用します。
「Worksheet_SelectionChange」というプロシージャに関しては削除して問題ないです。

ExcelVBAレベル確認

2. コードの記述

以下のコードを記述します。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        If Cells(Target.Row, "B").Value = "" Then
            Cells(Target.Row, "B").Value = _
                WorksheetFunction.Max(Columns("B")) + 1
        End If
        
    End If
    
End Sub

では、コードについて解説していきます。

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが編集されたかどうかを確認しています。
こちらでは、Targetの行番号が3以上、尚且つ、列番号が3の時、要するに「Name」の項目が編集されたかどうかを判定しています。

この条件を満たした場合に、Ifの中の処理を実行します。

        If Cells(Target.Row, "B").Value = "" Then
            Cells(Target.Row, "B").Value = _
                WorksheetFunction.Max(Columns("B")) + 1
        End If

先ほどの条件を満たしたときに、編集されたセルと同じ行のB列、即ち「No」の項目が空かどうかを確認しています。
「No」の項目が空の場合に、その項目に、B列に入力されている数値の最大値に1を加えた数値を入力しています。


3. 完成

以上の内容で実現できます。

「Name」の項目に値を入力した時、尚且つ、その行の「No」の項目が空の場合に、今までの番号の最大値に1を加えた数値が自動で入力されます。

また、数式ではなく直接数値が入力されているため、並べ替えた際に他の項目との相関性がなくなってしまうことはありません。

▼サンプルファイル▼

2025/02/18
【Excel】自由入力もできるドロップダウンリスト

【Excel】自由入力もできるドロップダウンリスト

Excelで作成した表の特定の項目に関して、基本はリストから選択させたいけれど、稀に例外的な入力も必要な場合があります。
しかし、通常は例外的な入力をするとエラーになってしまいます。

こちらでは、リストの例外的な入力にも対応する方法について解説しています。

ExcelVBAレベル確認

記述方法

1. リストを設定する範囲を選択し、[データ]タブから[データの入力規則]を選択する

2. 設定画面の[入力値の種類]を[リスト]にし、[元の値]にリストの設定値を入力する

3. [エラーメッセージ]タブを開き、[無効なデータが入力されたらエラーメッセージを表示する]のチェックを外す

以上の設定で完了です。
これだけで、例外的な入力も可能になります。

ExcelVBAレベル確認

入力時に警告を表示する方法

「例外的な入力は可能にしたいけど警告は表示したい」
そのような場合は、先ほどの手順3の画面でチェックは外さずに[スタイル]を[注意]もしくは[情報]に変更します。

[タイトル]と[エラーメッセージ]のテキストボックスにて、警告画面に表示するテキストを指定することができます。

・注意:[いいえ]が選択されている状態で警告が表示される

・情報:[OK]が選択されている状態で警告が表示される


まとめ

データの入力規則を活用することで、

・基本はリストから選択
・例外的な入力の許可
・警告メッセージの表示

といった柔軟な設定ができます。
ぜひ試してみてください。

2025/02/14
【Excel】カテゴリー単位の連番を自動表示

【Excel】カテゴリー単位の連番を自動表示

以下の表では、性別ごとで異なる連番をIDとして設定しています。
男性は「M」から始まる連番で、女性は「F」から始まる連番になっています。

このようなカテゴリー(性別)単位の連番を入力する場合、毎回手入力するのは大変ですよね。
実は、数式を使うことで自動で入力することができます

こちらでは、上記の性別ごとの連番を例に解説していきます。


性別ごとに連番を付ける数式の作成方法

まずは、IDの項目に、男なら「M」、女なら「F」と表示する数式を入力します。
その数式は以下になります。

=IF(D3="男","M","F")
// セルD3が"男"なら"M"、それ以外は"F"と表示する

この数式をセルB3に入力し、表の最終行までコピーして正しく表示されることを確認します。

次に、「M」や「F」の後に連番を表示する数式を加えます。
その数式は以下になります。

=IF(D3="男","M","F")&COUNTIF($D$3:D3,D3)
// セルD3からD3の中でセルD3の値の数を加える
// 範囲の開始セルD3のみ「$」で固定し、コピーした際に範囲が拡張するように指定する

この数式をセルB3に入力し、表の最終行までコピーすることで、性別ごとの連番を表示することができます。

2025/02/11
【Excel】数式などでシートを切り替えずに別シートを参照!?

【Excel】数式などでシートを切り替えずに別シートを参照!?

数式を入力する際などに、別シートのセルを参照することはよくあります。
その際に、毎回シートを切り替えるのは面倒ですよね。

そんな時におすすめの機能を紹介していきます。


複数のウィンドウを開く

Excelには、同じファイルを複数のウィンドウで開く機能が用意されています。
その機能を活用することで、別シートを別ウィンドウとして常に表示することができるので、シートを切り替えることなく別シートを参照した数式を入力することができます。


手順と使い方

[表示]タブの中の[新しいウィンドウを開く]を選択することで、ウィンドウを分割して表示することができます。

同じウィンドウが表示されましたら、ウィンドウの位置を調整し、別々のシートを開きます。

このようにウィンドウを分割することで、数式を入力する際などに、シートを切り替えることなく別ウィンドウのシートを選択することで参照することができます。


補足

複数のウィンドウを開いている状態で、Excelファイルを保存すると、複数のウィンドウが開かれている状態で保存されます。
そのため、再度開き直した際にも複数のウィンドウが表示されてしまいます。

他のウィンドウが不要になった際は、どのウィンドウでも良いので1つのウィンドウを残した状態で閉じられると良いです。

また、新しいウィンドウに関しては、Excelのシートに設定した表示倍率がリセットされてしまうので注意してください。

2025/02/07
【ExcelVBA】表の絞り込みと並べ替えを一瞬でリセット

【ExcelVBA】表の絞り込みと並べ替えを一瞬でリセット

以下のように、並べ替えたり絞り込みしたりした表を毎回元の形に戻すのは手間になります。

そこで、こちらの記事では、並べ替えと絞り込みを一瞬でリセットする「リセット機能」の開発方法について解説します。

※こちらで開発したファイルは、記事の最後にて配布しています。


1. 開発準備

まず初めに、[開発]タブを選択し、[マクロ]を選択します。

表示された以下の画面にて、開発する機能の名前を入力し、[作成]を選択します。
こちらでは、「リセット」と入力しています。

次に表示される以下の画面の「Sub ○○」から「End Sub」の間にコードを記述します。


2. コードの記述

以下のコードを記述します。

Sub リセット()
    
    With ActiveSheet.ListObjects("従業員管理表")
        .AutoFilter.ShowAllData
        Dim keyR As Range
        Set keyR = .ListColumns("社員ID").DataBodyRange
        With .Sort
            .SortFields.Clear
            .SortFields.Add key:=keyR
            .Apply
        End With
    End With
    
End Sub

では、コードについて解説していきます。

    With ActiveSheet.ListObjects("従業員管理表")
        '省略
    End With

対象のテーブルを指定します。
今回の場合、操作を行う表を予めテーブルにしています。
そのテーブル名(従業員管理表)を指定します。

        .AutoFilter.ShowAllData

次に、対象のテーブルの絞り込みを解除しています。

        Dim keyR As Range
        Set keyR = .ListColumns("社員ID").DataBodyRange

次に、対象のテーブルの[社員ID]の範囲を変数(keyR)に割り当てています。

        With .Sort
            .SortFields.Clear
            .SortFields.Add key:=keyR
            .Apply
        End With

最後に、テーブルの既存の並べ替えの設定を解除し、テーブルの[社員ID]の範囲(keyR)を基準に並べ替える設定を適用しています。


3. ボタンの作成

コードが完成しましたら、実行用のボタンを用意します。
ボタンは、[開発]タブの中の[挿入]から作成することができます。


4. 完成

以上の手順で、機能が完成します。
リセット機能を実行することで、以下のように表の絞り込みが解除され、[社員ID]を基準に並べ替えられます。

▼サンプルファイル▼

2025/02/05
【Excel】ガントチャートの対象期間を自動色付け

【Excel】ガントチャートの対象期間を自動色付け

以下の表のように、開始日と終了日を指定するだけで、その期間を自動で色付けする方法について解説します。


条件付き書式の設定

指定した条件を満たしているセルを自動で色付けする場合、『条件付き書式』を活用します。

ステップ1: 色付け対象の範囲を選択

1. Excelシートで、色付けしたい項目の範囲を左上から右下に向かってドラッグして選択します。
こちらではセルE5を基準に全体を選択しています。

ステップ2: 条件付き書式を設定

1. [ホーム]タブの中の[条件付き書式]から[新しいルール]を選択します。

2. 設定画面で [数式を使用して、書式設定するセルを決定] を選択します。

ステップ3: 条件式を入力

1. 選択された範囲の基準となるセルが色付けされる条件式を入力します。
こちらではセルE5を基準とした条件式を入力します。

セルE5が色付けされる条件は以下になります。

「セルE5の日付が開始日以上かつ終了日以下」

セルE5の日付はDATE関数を用いて、以下のように表現することができます。

=DATE(D2,E2,E3)
// D2:年、E2:月、E3:日

その求めた日付が、開始日以上かつ終了日以下であることを確認する必要があるため、以下のような条件式になります。

=AND(DATE($D$2,E$2,E$3)>=$C5,DATE($D$2,E$2,E$3)<=$D5)
// 条件式に設定した数式は、他の選択範囲にも相対的に反映されるため、一部を「$」で固定する
// $D$2:年は固定のセル
// E$2,E$3:月と日は行のみ固定
// $C5, $D5:開始日と終了日は列のみ固定

この条件式を条件付き書式の設定画面に入力します。

ステップ4: 色を設定

1. [書式]を選択して、希望の色を指定します。
こちらでは、[塗りつぶし]タブから黄色を指定します。

2. 条件付き書式の設定画面を確定して閉じます。

ExcelVBAレベル確認

以上の手順で、以下のように対象の期間を自動で色付けすることができます。

2025/02/03
【Excel】表の全選択を瞬時に行う

【Excel】表の全選択を瞬時に行う

Excelの以下のような大きな表全体を選択する際に、ドラッグ操作で選択している方いませんか?
少しのコツを知るだけで、簡単に、しかも瞬時に表全体を選択できるようになります。

この記事では、空白行や空白列が含まれている表の場合でも一瞬で表全体を選択できる方法を解説します。


空白行(列)がない場合

表の中に空白行(列)がない場合は、以下の方法が最も効率的です。

1. 表の中にカーソルを移動

    2. Ctrlキー押しながらAを押す

    ※「1」で選択したセルを基準に表全体が選択されます。

    Ctrl+Aというショートカットだけで、上記のように一瞬で表全体を選択することができます。

    ExcelVBAレベル確認

    空白行(列)が含まれている場合

    表の中に空白行(列)が含まれていると、Ctrl+Aでは表の一部しか選択されないことがあります。

    このような場合は、以下の方法が効率的です。

    1. 表の開始のセル(一番左上)を選択

    2. Shiftキーを押しながら、表の最後のセル(一番右下)を選択

    この方法であれば、空白行(列)が含まれていたとしても、上記のように一瞬で表全体を選択することができます。

    2025/01/31
    【ExcelVBA】削除したデータを別シートに記録

    【ExcelVBA】削除したデータを別シートに記録

    以下の表の中の不要なデータ行のいずれかのセルを選択し、[選択行削除]ボタンを押すだけで、該当するデータを別シート(「削除済み」シート)の表の末尾に移動する機能の開発方法について解説してきます。

    ※こちらで開発したファイルは、記事の最後にて配布しています。


    手順1: 開発準備

    まず初めに、[開発]タブを選択し、[マクロ]を選択します。

    表示された以下の画面にて、開発する機能の名前を入力し、[作成]を選択します。
    こちらでは、「deleteData」と入力しています。

    次に表示される以下の画面の「Sub ○○」から「End Sub」の間にコードを記述します。


    手順2: コードの記述

    以下のコードを記述します。

    Sub deleteData()
        
        Dim ws1 As Worksheet, ws2 As Worksheet
        Set ws1 = Worksheets("商品一覧")
        Set ws2 = Worksheets("削除済み")
        
        Dim lastRow As Long
        lastRow = ws2.Cells(ws2.Rows.Count, "B").End(xlUp).Row + 1
        
        Dim rng As Range
        Set rng = ActiveCell
        
        If ActiveSheet.Name = ws1.Name And rng.Row >= 3 Then
            ws2.Rows(lastRow).Value = ws1.Rows(rng.Row).Value
            ws1.Rows(rng.Row).Delete
        End If
        
    End Sub

    では、コードについて解説していきます。

        Dim ws1 As Worksheet, ws2 As Worksheet
        Set ws1 = Worksheets("商品一覧")
        Set ws2 = Worksheets("削除済み")

    移動元、移動先のシート情報を変数「ws1、ws2」に割り当てています。

        Dim lastRow As Long
        lastRow = ws2.Cells(ws2.Rows.Count, "B").End(xlUp).Row + 1

    移動先のシート(「削除済み」シート)のデータを追加する行の行番号を取得し、変数「lastRow」に割り当てています。
    移動先のシート(「削除済み」シート)のB列の最終行のセルを基準に、「Ctrl+↑」で移動した先のセルの行番号に1を加えた番号を取得しています。

        Dim rng As Range
        Set rng = ActiveCell

    実行時に選択されているセル(複数選択の場合は選択基準のセル)の情報を、変数「rng」に割り当てています。

        If ActiveSheet.Name = ws1.Name And rng.Row >= 3 Then
            ws2.Rows(lastRow).Value = ws1.Rows(rng.Row).Value
            ws1.Rows(rng.Row).Delete
        End If

    実行時に選択されているシートが移動元のシート(「商品一覧」シート)であり、尚且つ、実行時に選択されているセルの行番号が3以上の場合にIfの中の処理を実行します。
    Ifの中の処理では、移動元のシート(「商品一覧」シート)の選択されている行全体の値を、移動先のシート(「削除済み」シート)の表の末尾(lastRow)に入力しています。
    入力後、移動元のシート(「商品一覧」シート)の選択されている行全体を削除しています。

    以上の内容で、実行時に選択されているセルのデータを「削除済み」シートに移動することができます。


    手順3: ボタンの作成

    コードが完成しましたら、「商品一覧」シートに実行用のボタンを用意します。

    ボタンは、[開発]タブの中の[挿入]から作成することができます。


    完成

    以上の手順で、機能が完成します。
    実行することで、以下のように、実行時に選択しているセルの行のデータを「削除済み」シートの表の末尾に移動することができます。

    ▼サンプルファイル▼

    2025/01/29
    【Excel】行(列)挿入時に上(左側)の書式が反映される問題

    【Excel】行(列)挿入時に上(左側)の書式が反映される問題

    以下の表の先頭行に行を挿入すると、見出しの書式が反映されてしまいます。

    そのため、毎回手動で書式を修正する必要があるとお悩みの方も多いのではないでしょうか。

    実は、手動で書式を直さなくても、挿入した位置の下の行(右側の列)の書式を簡単に反映させる方法があります。
    こちらの記事では、その方法について解説していきます。


    行(列)挿入時に下の行(右側の列)の書式を適用

    以下の手順で、簡単に挿入した位置の下の行(右側の列)の書式を反映させることができます。

    1. 通常通り、行(列)を挿入する

      2. 挿入した位置に表示される挿入オプションを選択

      3. 「下(右側)と同じ書式を適用」を選択

      これだけで、挿入した行(列)に下の行(右側の列)の書式が適用され、毎回手動で修正する手間を省くことができます。

      2025/01/27
      【Excel】指定期間の予定表を自動作成

      【Excel】指定期間の予定表を自動作成

      以下のように、期間を指定するだけで、自動で空の予定表が表示される仕組みの作成方法について解説していきます。


      1. SEQUENCE関数を使用して日付を表示

      まず、SEQUENCE関数を使って対象期間の日付を一覧表示します。
      SEQUENCE関数の使い方は、以下になります。

      =SEQUENCE([行], [列], [開始], [目盛り])
      // 指定した設定値で連続した数値を返す
      // [行]:表示する行数(省略時は「1」)
      // [列]:表示する列数(省略時は「1」)
      // [開始]:連番を開始する数値(省略時は「1」)
      // [目盛り]:連番の間隔(省略時は「1」)

      日付に関しても「シリアル値」という数値の扱いになるため、SEQUENCE関数を活用して連続した日付を表示することができます。
      開始日と終了日を指定して、その期間を表示する場合の数式は以下になります。

      =SEQUENCE(終了日-開始日+1,,開始日)
      // 終了日-開始日+1:表示する行数は表示する期間となり終了日と開始日の差に1を加えた日数になる
      // 開始日:開始日を基準に連番を表示する

      こちらの数式を、以下の表に当てはめます。

      当てはめた数式は以下になります。

      =SEQUENCE(B4-B3+1,,B3)
      // B4-B3+1:表示する行数(期間)
      // B3:連番の開始(開始日)

      このように、指定した期間の日付を一覧として表示することができます。


      2. 条件付き書式で自動的に罫線を表示

      次に、条件付き書式を使用して、日付が入力されているセルに自動的に罫線を設定します。

      まずは、設定する対象の範囲を選択します。
      以下の表の場合は、B列とC列の7行目以降が対象範囲となります。

      そのため、B列とC列全体を選択し、Ctrlキーを押しながら対象外の範囲(セルB1~C6)を選択し、対象外の範囲の選択を解除します。

      次に、[ホーム]タブから[条件付き書式]の[新しいルール]を選択します。

      表示された設定画面にて、[ルールの種類]を[数式を使用して、書式設定するセルを決定]を選択し、表示されたテキストボックスに以下の数式を入力します。

      =$B7<>""
      // 選択基準のセルB7に対しての罫線を表示する条件
      // 「セルB7が空でない場合」
      // 他の選択範囲には相対参照で反映(B列のみ「$」で固定)

      次に[書式]を選択し、[罫線]タブから[外枠]を指定します。

      以上の設定で確定することで、日付が入力されている行のB列とC列に罫線を自動で表示することができます。

      2025/01/24
      【Excel】ドロップダウンリストで複数選択可能にする

      【Excel】ドロップダウンリストで複数選択可能にする

      Excelでは現状、ドロップダウンリストから1つの項目しか選択できませんが、工夫することで複数選択が可能になります。
      本記事では、その設定方法について詳しく解説していきます。

      ExcelVBAレベル確認

      完成イメージ

      作成するドロップダウンリストのイメージは以下になります。

      ① 何も入力されていない時は1つの項目のみ表示される

      ② 1つの項目を選択した後にリストを展開すると2つ目の項目が表示される

      ③ 以降、最大で5つまで指定することができる

      ExcelVBAレベル確認

      手順1: 複数選択時の候補を準備する

      こちらでは、以下のセルB3からセルB11に、複数選択可能なドロップダウンリストを作成していきます。

      まずは、ドロップダウンリストの候補となる値をセルF2から横方向に並べます。
      ※必要に応じてセルの位置は変更してください。

      次に、B列のドロップダウンリストの候補に表示させる値をセルF3以降に表示させていきます。

      表示させる値は、B列のドロップダウンリストに入力した値によって変化させます。
      例えば、セルB3が空の場合は、セルF3からJ3に「1」、「2」、「3」、「4」、「5」と表示させます。
      次に、セルB3に「2」が入力された場合は、セルF3からJ3に「2,1」、「(空)」、「2,3」、「2,4」、「2,5」と表示させます。
      更に、セルB3に「2,4」が入力された場合は、セルF3からJ3に「2,4,1」、「(空)」、「2,4,3」、「(空)」、「2,4,5」と表示させます。

      このように、ドロップダウンリストから値が選択される度、ドロップダウンリストに表示させる値に選択していない値を追加して、複数選択を実現していきます。 その仕組みを実現する数式は、以下になります。

      =IFS($B3="",F$2,IFERROR(FIND(F$2,$B3),0),"",TRUE,$B3&","&F$2)
      // $B3="",F$2:セルB3が空の場合に通常の候補(F2)を返す(B列と2行目を「$」で固定)
      // IFERROR(FIND(F$2,$B3),0),"":セルB3にセルF2の値が含まれている場合に空("")を返す(2行目とB列と「$」で固定)
      // ※FIND関数で特定の文字が含まれているかどうかを確認、含まれている場合は、その文字が含まれている位置情報(先頭からの通し番号)を返し、含まれていない場合は、エラーを返す
      //  IFERROR関数で、FIND関数がエラーの時に「0」を返す
      //  条件式では「0」がFALSE(偽)、「0」以外の数値がTRUE「真」とされる
      // TRUE,$B3&","&F$2:それ以外の場合にセルB3とセルF2の値をカンマで結合して返す(B列と2行目を「$」で固定)

      この数式をセルF3に入力し、必要な範囲にコピーします。

      このようにして、各行に対する候補を表示することができました。
      試しに、B列に適当な値を入力することで、数式の結果が変化することが確認できます。


      手順2: データの入力規則を設定する

      最後に、数式で作成した候補をドロップダウンリストとして設定していきます。

      まずはドロップダウンリストを設定する範囲を選択し、[データ]タブの中の[データの入力規則]を選択します。

      表示される以下の設定画面にて、[入力値の種類]を[リスト]にし、[元の値]に以下の数式を入力します。

      =$F3:$J3
      // 行番号を相対的に変化させる必要があるため、行番号の「$」を外す

      以上の設定をして確定することで、複数選択を可能としたドロップダウンリストを作成することができます。

      2025/01/22
      【Excel】表の一番右側のデータを自動抽出

      【Excel】表の一番右側のデータを自動抽出

      以下の表は、各商品の価格をまとめた表になります。

      価格が改定される度、表の右側に改定後の価格を登録する想定になります。
      この表から、以下のように最新価格(表の一番右側の価格)を自動で抽出する数式の作成方法について解説していきます。

      ExcelVBAレベル確認

      手順1: 抽出方法

      こちらでは、VLOOKUP関数COUNTA関数を組み合わせて最新の価格を抽出していきます。
      まずは、VLOOKUP関数から順番に解説していきます。


      手順2: VLOOKUP関数の基本設定

      VLOOKUP関数の使い方は、以下になります。

      =VLOOKUP(検索値, 範囲, 列番号, [検索方法])
      // 指定した[範囲]から[検索値]で検索し、該当するデータの指定した[列番号]の位置にある項目値を返す
      // [検索値]で検索する項目は、指定した[範囲]の一番左側の項目である必要がある
      // [検索方法]で抽出する条件を指定する(TRUE:近似一致(省略時)、FALSE:完全一致)

      実際に活用して、最新の価格(4列目)を抽出する場合の数式は、以下になります。

      =VLOOKUP(B4,$B$13:$XFD$16,4,FALSE)
      // B4: 検索する商品名が入力されているセル
      // $B$13:$XFD$16: 商品別価格表の範囲(「$」で固定)
      // 4: 最新価格がある列番号(仮設定)
      // FALSE: 完全一致で検索

      最新価格の列の位置が固定の場合は、上記のような数式で、最新価格を抽出することができます。


      手順3: COUNTA関数の組み合わせ

      先ほどの数式のままですと、価格が追加された際に、最新価格を抽出することができなくなります。

      そのため、COUNTA関数を用いて、常に最新の価格が抽出されるように修正します。
      COUNTA関数の使い方は、以下になります。

      =COUNTA(値1, [値2], [値3], …)
      // 指定した[値]の中で空でない値の数を返す

      COUNTA関数を活用することで、動的な列番号を取得することができます。
      VLOOKUP関数で抽出する列番号とは、今回の表の場合、改定日が入力されている、もしくは今後入力される範囲(セルC12からセルXFD12)内で値が入力されているセルの数に1を加えた数になります。

      実際に列番号を抽出する場合の数式は、以下のようになります。

      =COUNTA(C12:XFD12)+1
      // C12:XFD12:改定日の範囲

      こちらの数式をVLOOKUP関数に組み合わせると、以下のようになります。

      =VLOOKUP(B4,$B$13:$XFD$16,COUNTA($C$12:$XFD$12)+1,FALSE)
      // COUNTA($C$12:$XFD$12)+1:列番号の取得(「$」で固定)

      このように、先頭の商品に関して、最新価格を抽出することができました。


      手順4: 数式のコピー

      最後に、先頭に入力した数式を下の行までコピーすることで、以下のように、各商品に対して、最新価格を自動で抽出することができます。

      関数を組み合わせることによって、実現できることが大幅に広がります。
      ぜひ試してみてください。