2024/12/23
【Excel】重複を考慮した上位3件を抽出

【Excel】重複を考慮した上位3件を抽出

以下の画像の左側の「氏名と点数をまとめた表」から、右側の「上位3件を抽出した表」を数式で作成する方法について解説していきます。

また、今回の方法では、重複した点数が存在する場合、同順位と判断して抽出する仕組みになっています。

ExcelVBAレベル確認

重複を除いた上位3件の点数を抽出する

まずは、重複を除いた上位3件の点数を抽出していきます。
そのためには、以下の3つの関数を活用します。

・UNIQUE関数:重複を除外する
・SORT関数:点数を並べ替える
・TAKE関数:指定した件数のみを表から抽出する

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

=UNIQUE(配列, [列の比較], [回数指定])
// 指定した配列から重複を除いた表を返す
// 配列:対象のデータの範囲
// [列の比較]:データが列方向の場合(TRUE)、行方向の場合(FALSE[省略時])
// [回数指定]:重複していないデータのみを抽出する場合(TRUE)、重複を除いた全件を抽出する場合(FALSE[省略時])
=SORT(配列, [並べ替えインデックス], [並べ替え順序], [並べ替え基準])
// 指定した配列を指定した順序に並べ替えた表を返す
// 配列:対象の表
// [並べ替えインデックス]:対象の表の中の、対象の列(行)の、表の先頭からの列(行)番号 ※省略時は先頭列(行)
// [並べ替え順序]:1→昇順、-1→降順 ※省略時は昇順
// [並べ替え基準]:TRUE→列で並べ替え、FALSE→行で並べ替え ※省略時は行で並べ替え
=TAKE(配列, 行数, [列数])
// 指定した配列から指定した行数(列数)を抽出する
// 配列:対象の表
// 行数:抽出する行数(正の数:上から抽出、負の数:下から抽出)
// [列数]:抽出する列数(正の数:上から抽出、負の数:下から抽出)
// ※[列数]は省略可能、省略時は全ての列を抽出

これらの関数を組み合わせた上位3件の点数を抽出する数式は、以下になります。

=TAKE(SORT(UNIQUE(C3:C12),,-1),3)
// UNIQUE関数で重複を除いてからSORT関数で降順にし、TAKE関数で上位3件を抽出する

上位3件の点数と一致する氏名を抽出する

次に、上位3件の点数と一致する氏名を抽出していきます。
そのためには、以下の2つの関数を活用します。

・FILTER関数:指定した条件を満たすデータのみを抽出する
・TRANSPOSE関数:表を転置する(行と列を入れ替える)

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

=FILTER(配列, 含む, [空の場合])
// 指定した配列から指定した条件を満たすデータのみを抽出する
// 配列:絞り込み対象の表
// 含む:絞り込み条件
// [空の場合]:条件を満たす対象のデータが見つからない時に表示する内容(省略時はエラーが表示される)
=TRANSPOSE(配列)
// 配列の行列を入れ替えた配列を返す
// 配列:転置対象の表

これらの関数を組み合わせた1位の氏名を抽出する数式は、以下になります。

=TRANSPOSE(FILTER($B$3:$B$12,$C$3:$C$12=F3))
// FILTER関数で指定した点数のデータを抽出してから、TRANSPOSE関数で横向きに転置する
// セルF3以外の参照範囲は固定のため「$」で絶対参照にする

後は、入力した数式を3位までコピーすることで、以下のように、氏名を抽出することができます。

2024/12/20
【ExcelVBA】簡単なマウス操作のみで販売数を入力

【ExcelVBA】簡単なマウス操作のみで販売数を入力

野外イベントなどで販売数を管理しながら受付業務を行う際、商品が購入される度、販売数の数値を直接入力するのは大変です。
そのため、こちらでは、特定の商品の販売数のセルをダブルクリックするだけで、その販売数に1を加えることができる機能を開発していきます。
また、何かしらの原因でデータが紛失しないように、販売数を加算する度、自動で保存される機能も加えていきます。

こちらでは、以下の商品ごとの販売数を管理した表を活用して開発していきます。

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


開発準備

「特定のセルをダブルクリックすると同時に、何かしら処理を実行する」という仕組みは、該当するシートモジュールイベントプロシージャを活用することで実現できます。

シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

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

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

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

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

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

ExcelVBAレベル確認

コードの記述

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

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.Column = 3 And _
        Target.Row >= 3 And _
        Target.Row <= 20 Then
        
        Cancel = True
        Target.Value = Target.Value + 1
        ThisWorkbook.Save
        
    End If
    
End Sub

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

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.Column = 3 And _
        Target.Row >= 3 And _
        Target.Row <= 20 Then

        '省略

    End If
    
End Sub

「Worksheet_BeforeDoubleClick」というプロシージャの引数の「Target」に、ダブルクリックされたセルの情報が渡されるため、そのセルの情報から、表の対象の範囲内がダブルクリックされたのかどうかを確認しています。
こちらでは、「3列目、尚且つ、3~20行目の間のセル」と販売数のセルの範囲内がダブルクリックされたかどうかを確認しています。

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

        Cancel = True
        Target.Value = Target.Value + 1
        ThisWorkbook.Save

セルをダブルクリックすると、通常、セルが編集モードになるのですが、引数の「Cancel」をTrueにすることで、編集モードにならなくなります。
その後、ダブルクリックされたセルの値に1を加えて、ブックを保存しています。

以上の内容で実現できます。
販売数のセルをダブルクリックすることで、ダブルクリックされたセルの値に1を加えて、ブックが保存されます。

▼サンプルファイル▼

2024/12/18
【Excel】数式1つ・関数1つで集計表を作成!?

【Excel】数式1つ・関数1つで集計表を作成!?

以下の左側の表から右側の集計表を作成するには、今までは、SUMIFS関数ピボットテーブルなどを活用する必要がありました。

しかし、2024年に登場した「GROUPBY関数」「PIVOTBY関数」を活用することで、1つの数式、尚且つ、1つの関数のみで集計表を作成することができるようになりました。
それぞれの関数について、簡単に解説していきます。


GROUPBY関数とは

GROUPBY関数では、特定の項目をグループ化した集計表を作成することができます。
グループ単位で、合計や平均、最大値などといった集計を行うことができます。

以下の数式は、担当と商品ごとの売上と利益の合計を求めたものになります。

=GROUPBY(B2:C16,D2:E16,SUM)

※罫線は別途設定しています。

このように、GROUPBY関数では、指定した条件で集計した結果を列方向に展開することができます。
詳しい使い方については、以下の記事(動画)にて解説しています。

>GROUPBY関数の使い方


PIVOTBY関数とは

PIVOTBY関数では、特定の項目をグループ化したマトリックス形式の集計表を作成することができます。
グループ単位で、合計や平均、最大値などといった集計を行うことができます。

以下の数式は、日付と担当ごとの各商品の売上の合計を求めたものになります。

=PIVOTBY(A2:B16,C2:C16,D2:D16,SUM)

※罫線は別途設定しています。

このように、PIVOTBY関数では、GROUPBY関数とは異なり、指定した条件で集計した結果をマトリックス形式で展開することができます。
そのため、ピボットテーブルのような集計表を作成する際は、PIVOTBY関数を活用するのが良いです。
詳しい使い方については、以下の記事(動画)にて解説しています。

>PIVOTBY関数の使い方

2024/12/16
【Excel】数式で年齢を求める方法【2選】

【Excel】数式で年齢を求める方法【2選】

数式を活用して、生年月日から年齢を求める方法について2通りで解説していきます。


方法1:YEARFRAC関数を活用

1つ目の方法では、『YEARFRAC関数』を活用します。
この関数では、指定した期間の年数を求めることができます。
この関数の使い方は、以下になります。

=YEARFRAC(開始日, 終了日, [基準])
// 指定した開始日と終了日の差を指定した[基準]で求める
// ▼[基準]▼
// 0または省略:30日/360日(NASD方式)
// 1:実際の日数/実際の日数
// 2:実際の日数/360日
// 3:実際の日数/365日
// 4:30日/360日(ヨーロッパ方式)

今回は年齢を求めたいため、引数[基準]には「1」を指定します。
年齢を求める場合は、生年月日と本日の日付の差を求める必要があります。
本日の日付は、TODAY関数で取得できるため、以下のような数式で年齢を求めることができます。

// =YEARFRAC(C3,TODAY(),1)
// 最終行までコピー

ただ、上記のように、年齢に小数が含まれてしまう可能性があります。
そのため、INT関数やROUNDDOWN関数などと組み合わせて、小数点以下を切り捨てる必要があります。
こちらでは、INT関数を活用して、以下のように小数点以下を切り捨てます。

=INT(YEARFRAC(C3,TODAY(),1))
// 最終行までコピー

方法2:DATEDIF関数を活用

2つ目の方法では、『DATEDIF関数』を活用します。
この関数では、指定した期間の差を求めることができます。
この関数の使い方は、以下になります。

=DATEDIF(開始日, 終了日, 単位)
// 指定した「開始日」と「終了日」の差を、指定した「単位」で求める
// ▼単位(一部)▼
// "Y":年数
// "M":月数
// "D":日数

今回は年齢を求めたいため、引数[単位]には「”Y”」を指定します。

年齢を求める場合は、先ほどと同様に、生年月日と本日の日付の差を求める必要があります。
本日の日付は、TODAY関数で取得できるため、以下のような数式で年齢を求めることができます。

=DATEDIF(C3,TODAY(),"Y")
// 最終行までコピー
2024/12/13
【ExcelVBA】データを入力する度に自動で並べ替え

【ExcelVBA】データを入力する度に自動で並べ替え

以下の表では、氏名を入力した後にクラスを入力するだけで、自動で該当するクラスの位置に移動するようになっています。

このような、特定の項目に値を入力すると同時に、その項目を基準に自動で並べ替えするという機能の開発方法について解説していきます。
※こちらで開発したファイルは記事の最後にて配布しています。

ExcelVBAレベル確認

開発準備

「特定のセルに値を入力すると同時に、何かしら処理を実行する」という仕組みは、該当するシートモジュールイベントプロシージャを活用することで実現できます。

シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

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

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

次に、隣のリストから「Change」を選択します。

「Change」を選択すると表示される「Worksheet_Change」というプロシージャ内にコードを記述します。
他のプロシージャに関して、使用していない場合は削除して問題ないです。


コードの記述

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim rng As Range
    For Each rng In Target
        If rng.Column = 2 Then
            Range("B2").Sort _
                Key1:=Range("B2"), _
                Order1:=xlAscending, _
                Header:=xlYes
        End If
    Next rng
    
End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)

「Worksheet_Change」というプロシージャは、該当するシートのセルが編集されると同時に実行されます。
その際、編集されたセルの情報が引数の「Target」に渡されます。
引数の「Target」を活用して、今回の場合は、クラスの項目(列)が編集されたかどうかを判断し、編集された場合に、その項目(列)を基準に昇順に並べ替えを行います。

    Dim rng As Range
    For Each rng In Target
        If rng.Column = 2 Then
            '省略
        End If
    Next rng

今回の場合、同時に編集されたセルは1つであることが多いかと思いますが、複数セルが同時に編集することもあります。(コピー&ペーストやCtrlキーを押しながらの同時入力など)
複数セルを同時に編集した場合は、引数の「Target」に複数セルの情報が渡されます。
そのため、複数セルの同時入力を考慮し、「Target」のセルの情報をFor Eachで1つずつを変数「rng」に渡して確認しています。

次に、変数「rng」の列番号が2、即ち、B列のクラスの項目の位置であることを確認しています。B列の場合のみに次の処理を実行します。
※必要に応じて「行番号が3以上の場合」などといった条件を加えても良いです。

            Range("B2").Sort _
                Key1:=Range("B2"), _
                Order1:=xlAscending, _
                Header:=xlYes

こちらで、セルB2が含まれる表に対し、「Sort」で並べ替えを行っています。
「Key1:= Range(“B2”)」でセルB2の属する列を並べ替えの基準の列として指定し、「Order1:=xlAscending」で昇順を指定、「Header:=xlYes」で項目名を含む範囲ということを指定しています。

以上の内容で実現できます。
クラスの項目に値を入力すると同時に、自動で並べ替えられます。

▼サンプルファイル▼

2024/12/11
【Excel】データ数に応じて自動で連番を振る方法

【Excel】データ数に応じて自動で連番を振る方法

以下の表のように、特定の項目に値を入力すると同時に連番が表示される仕組みの作成方法について解説していきます。

今回解説する方法なら、数式を1か所に入力するだけで、以降は自動的に連番が更新されます。面倒なコピー作業は不要になります。


自動で連番を振る方法

自動で連番を振るために、今回は『SEQUENCE関数』『COUNTA関数』を活用します。

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

=SEQUENCE(行, 列, 開始, 目盛り)
// 数式を入力したセルを起点として指定した連番を表示する
// 行:連番を表示する行範囲(省略時は1)
// 列:連番を表示する列範囲(省略時は1)
// 開始:連番の開始数値(省略時は1)
// 目盛り:連番の間隔(省略時は1)

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

=COUNTA(値1, [値2], [値3], …)
// 指定したセル内で空でないセルの数を返す
// 値:対象のセル(2以降は省略可能)

これらの関数を組み合わせて実現していきます。

以下の表の場合、「氏名」の項目に必ず値が入力されているという前提で、「氏名」の数までの連番を表示させることで実現することができます。

具体的には、以下の数式をセルB3に入力することで実現できます。

=SEQUENCE(COUNTA(C:C)-1)
// COUNTA関数でC列の値が入力されているセルの数を取得し、2行目の見出し分の1を引くことで、氏名の数を求める

このように、氏名の数に対応した連番を表示することができます。

ExcelVBAレベル確認

注意点

この方法の場合は、氏名の項目に空白行が出来てしまうと、正しい連番が表示されなくなります。

そのため、特定の項目に値が必ず入力されている前提で活用する必要があります。

2024/12/09
【Excel】先頭の「0」を維持する簡単な対策

【Excel】先頭の「0」を維持する簡単な対策

『「0」から始まる数字を入力して確定すると、先頭の「0」が消えてしまう…』
この現象に困った経験がある方は多いのではないでしょうか?

今回は、先頭の「0」を維持する方法について3通りで解説していきます。


①表示形式を「文字列」にする

1つ目は、表示形式を「文字列」にするという方法です。

対象の範囲を選択し、[ホーム]タブの表示形式の設定から[文字列]を指定することで、先頭の「0」を維持することができます。

「0」からの数字を表示できない原因は、数値として認識されてしまうことになります。
Excelは表計算ソフトのため、セルに入力されている数字は、基本、数値として認識されてしまいます。
数値には、「0」から始まる値は存在しないため、勝手に先頭の「0」が消えてしまうというのが原因になります。
そのため、こちらの手順では、セルの表示形式を「文字列」という設定にすることで、入力された数字を数値ではなく「文字列」として判定するようにしています。

セルに表示された緑色の警告は、セルに数値ではなく文字列として入力されているということを表しています。
※Excelの設定内容によっては警告が表示されないこともあります。

ExcelVBAレベル確認

②先頭に「’」を入力する

2つ目は、先頭に「’」を入力するという方法です。

先頭に「’」を入力してから数字を入力することによって、表示形式を設定しなくても数値として入力することができます。

数式バーで確認すると先頭の「’」が表示されてしまいますが、見た目では先頭の「’」は表示されなくなります。

この先頭の「’」は、数式で文字結合する際などには影響ありません。


③表示形式で「0」を表示する

3つ目は、表示形式で「0」を表示するという方法です。

こちらの方法の場合は、「文字列」ではなく「数値」として入力することができます。
ただ、予め指定した桁数でしか「0」を表示することができません。

まずは、対象の範囲を選択し、[ホーム]タブの表示形式の設定から[その他の表示形式]を選択します。

表示された[セルの書式設定]の画面の[表示形式]タブから[ユーザー定義]を選択し、[種類]と書かれた位置の下のテキストボックス内に、好みの桁数の「0」を入力し、確定します。

この設定を行うことによって、入力した数値を指定した桁数になるまで「0」で埋めることができます。

また、この方法の場合は、「文字列」ではなく「数値」として入力できるため、緑色の警告は表示されません。

2024/12/06
【ExcelVBA】複数シートの表に一括反映

【ExcelVBA】複数シートの表に一括反映

以下のように、同じ形式の予定表が複数シートに用意されている場合で、それぞれの予定表の特定の時間に同じ予定を一括で登録する機能の開発方法について解説していきます。

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


開発準備

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

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

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


コードの記述

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

Sub setSchedule()
    
    Dim mWs As Worksheet
    Set mWs = Worksheets("反映")
    
    Dim ws As Worksheet
    Dim i As Long
    
    For i = 4 To 33
        If mWs.Cells(i, "B").Value <> "" Then
            For Each ws In Worksheets
                If ws.Name <> mWs.Name Then
                    If InStr(ws.Cells(i, "B").Value, _
                        mWs.Cells(i, "B").Value) = 0 Then
                        
                        ws.Cells(i, "B").Value = _
                            mWs.Cells(i, "B").Value & vbLf & _
                            ws.Cells(i, "B").Value
                        
                    End If
                End If
            Next ws
        End If
    Next i
    
End Sub

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

    Dim mWs As Worksheet
    Set mWs = Worksheets("反映")

反映元となるシート情報を変数「mWs」に割り当てています。

    Dim ws As Worksheet
    Dim i As Long

繰り返し処理で扱う変数を定義しています。
変数「ws」は各シートを繰り返す際に活用し、変数「i」は各行を繰り返す際に活用します。

    For i = 4 To 33
        If mWs.Cells(i, "B").Value <> "" Then
            For Each ws In Worksheets
                If ws.Name <> mWs.Name Then
                    '処理
                End If
            Next ws
        End If
    Next i

Forで反映シートの予定表の先頭行から最終行までを繰り返し、内側のIfで予定が空でない場合に関してのみ、更に内側のFor Eachを実行するように記述しています。

For Eachでは、存在するシート1つ1つのシート情報を順番に変数「ws」に割り当て、更に内側のIfでシート名が「反映」でない場合に関してのみ、最深部の処理を実行するように記述しています。

                    If InStr(ws.Cells(i, "B").Value, _
                        mWs.Cells(i, "B").Value) = 0 Then
                        
                        ws.Cells(i, "B").Value = _
                            mWs.Cells(i, "B").Value & vbLf & _
                            ws.Cells(i, "B").Value
                        
                    End If

最深部では、Ifで反映元のシートの対象行「i」の予定と同じ予定が登録されていないことを確認しています。
InStrを活用して、反映先のシート「ws」の対象行「i」のセルに、反映元のシート「mWs」の対象行「i」のセルの値が含まれているかどうかを判定しています。
InStrで含まれていないと判断された場合は、「0」を返します。
そのため、その結果が「0」の場合という条件式になっています。

この条件を満たしたときに、反映先のシート「ws」の対象行「i」のセルに元々入力されている値に対し、改行「vbLf」と反映元のシートの対象行「i」のセルの値を加えています。

ExcelVBAレベル確認

ボタンの作成

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


完成

以上の手順で、機能が完成します。
反映シートの10:00の予定(セルB8)に「共通の予定」と入力して、「一括反映」ボタンを押した実行結果は、以下になります。

既存の予定が存在する場合は、その予定を残したまま、先頭に「共通の予定」が追加されます。

▼サンプルファイル▼

2024/12/04
【Excel】抽出元のデータへのハイパーリンクを作成

【Excel】抽出元のデータへのハイパーリンクを作成

今回は、以下のように、VLOOKUP関数などで抽出した値自体に、抽出元のセルに遷移するハイパーリンクを自動で設定する方法について解説していきます。


遷移先のセルのアドレスを取得

抽出元のセルに遷移するハイパーリンクを作成するためには、まずは、遷移先のセルのアドレスを取得する必要があります。
その際に活用する関数は、MATCH関数になります。
この関数の使い方は、以下になります。

=MATCH(検査値, 検査範囲, 照合の種類)
// 指定した[検査値]が[検査範囲]内に存在する場合、先頭からの位置情報を番号で返す
// [照合の種類]では、検索方法を指定する([1]以下、[0]完全一致、[-1]以上)

実際に活用して、セルA2のIDと一致する位置情報から対象の行番号を取得する場合は、以下のようになります

=MATCH(A2,A5:A100,0)+4
// 位置情報と行番号の差分の4を加える

この取得した行番号からセルのアドレスにしていきます。
例えば、ハイパーリンクの遷移先を該当する行のA列にしたい場合は、以下のようになります。

="A"&MATCH(A2,A5:A100,0)+4

以上の手順で、遷移先のセルのアドレスを取得することができます。


ハイパーリンクの作成

では、取得したセルのアドレスに遷移するハイパーリンクを作成していきます。
ハイパーリンクを作成するには、HYPERLINK関数を活用します。
この関数の使い方は、以下になります。

=HYPERLINK(リンク先, 別名)
// [リンク先]に指定したアドレスへ遷移するリンクを作成する
// [別名]に指定した値をリンクに表示させる

実際に活用すると、以下のようになります。

=HYPERLINK("#A"&MATCH(A2,A5:A100,0)+4,"選択")
// セルに遷移するリンクにする場合は、セルのアドレスの先頭に「#」を加える
// [別名]には仮で"選択"と指定している

以上の手順で、ハイパーリンクを作成することができます。
こちらでは、仮の文字として「選択」と表示させていますが、「氏名」のように特定の項目の値を抽出したい場合は、引数の[別名]にVLOOKUP関数などを記述することで実現できます。
実際にハイパーリンクのテキストを表の中の氏名にした例が以下になります。

=HYPERLINK("#A"&MATCH(A2,A5:A100,0)+4,VLOOKUP(A2,A5:D100,2,FALSE))
2024/12/02
【Excel】空白演算子でマトリックス表から値抽出

【Excel】空白演算子でマトリックス表から値抽出

あまり知られていませんが、Excelには空白(半角スペース)の演算子が存在します。
この空白演算子を活用することで、以下のようなマトリックス表から指定した位置の値を簡単に抽出することができます。

今回は、空白演算子を活用して、マトリックス表から指定した位置の値を抽出する方法について解説していきます。


空白演算子とは

まずは、『空白演算子』について簡単に解説していきます。
空白演算子とは、複数の範囲を空白(半角スペース)で区切ることによって、それぞれの範囲で重なっているセルを参照するというものです。
例えば、以下のように活用します。

=B5:E5 D3:D7

この演算子を活用して、空白(半角スペース)の前後の範囲を自由に変更することが出来れば、交差する位置の値を自由に変更して抽出することができるようになります。


マトリックス表から値抽出

次に、空白演算子を活用して、マトリックス表から値を抽出する方法について解説していきます。

今回は、以下の担当とタスクのマトリックス表から、指定した担当とタスクが交差する位置の値を抽出していきます。

実現するためには、「指定した担当」、「指定したタスク」から、マトリックス表の範囲を判断する必要があります。
そのため、こちらでは、それぞれの範囲に名前を定義していきます。


名前の定義

まずは、縦向きの範囲に担当の名前を割り当てます。
その際は、担当の名前を含むデータの範囲を選択し、[数式]タブから[選択範囲から作成]を選択し、選択範囲の上の担当の名前を、それぞれの縦向きの範囲の名前として設定したいため、[上端行]を選択し、確定します。

これだけで、それぞれの範囲に担当の名前を設定することができます。

タスクに関しても同様に、タスクの名前を含むデータの範囲を選択し、[数式]タブから[選択範囲から作成]を選択し、選択範囲の左側のタスクの名前を、それぞれの横向きの範囲の名前として設定したいため、[左端行]を選択し、確定します。

設定した名前は、[名前の管理]から確認することができます。
稀に指定した名前に「_」などの文字が加えられる可能性もあるので、どのような名前で登録されたのかを確認します。


名前を活用して値抽出

では、名前を活用して値を抽出していきます。

試しに、設定した担当の名前とタスクの名前を活用して、交差する値を抽出してみると、以下のようになります。

=斎藤 タスク1

後は、数式内の名前が、セルC10とD10に指定した名前になれば、自由に抽出位置を変更することができるようになります。
ただ、以下のように直接参照しても、上手く抽出することができません。

=C10 D10

上記の例だと、単純にセルC10とD10の交差する位置を取得しようとし、1つも交差していないため、エラーになってしまっています。
今回実現したい内容は、セルC10とD10自体ではなく、それぞれのセルの中の名前を活用して抽出する必要があります。
そのような際は、それぞれを『INDIRECT関数』で囲むことで実現できます。
実際に、INDIRECT関数を活用した場合は、以下のような数式になります。

=INDIRECT(C10) INDIRECT(D10)
ExcelVBAレベル確認

補足

今回解説した例のように、担当とタスクの名前をそのまま設定できた場合は、INDIRECT関数で囲むだけでよいのですが、万が一、「_」などが加えられた場合は、「_」などを加えた名前で参照する必要があります。
その際は、以下のように「&」などで文字を結合して実現します。

=INDIRECT(C10) INDIRECT(D10&"_")
// タスクの名前(No1など)に「No1_」などと「_」が加えられた場合の例です
2024/11/29
【Excel】カテゴリー単位で交互に色付け

【Excel】カテゴリー単位で交互に色付け

以下の表のように、特定の項目(カテゴリー)の値単位で交互に自動で色付けする方法について解説していきます。

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


条件式の作成

まずは、色付けする行の条件式を作成していきます。
色付けする行の条件式は、以下の手順で作成していきます。

1.カテゴリーの重複を除いた表を用意
2.対象行のカテゴリーが重複を除いた表の上から何番目なのかを求める
3.(2)で求めた数値が偶数の場合にTRUEと表示する

では順番に作成していきます。


1.カテゴリーの重複を除いた表を用意

まずは、カテゴリーの重複を除いた表の用意です。
重複を除いた表を用意する際は、UNIQUE関数を活用します。
この関数の使い方は、以下になります。

=UNIQUE(配列, [列の比較], [回数指定])
// 配列:対象のデータの範囲
// [列の比較]:データが列方向の場合(TRUE)、行方向の場合(FALSE[省略時])
// [回数指定]:重複していないデータのみを抽出する場合(TRUE)、重複を除いた全件を抽出する場合(FALSE[省略時])

実際にUNIQUE関数を活用して数式を作成すると、以下のようになります。

=UNIQUE(C3:C100)
// 表の範囲は100行目までとする

※空白のセルは「0」として抽出されます。


2.対象行のカテゴリーが重複を除いた表の上から何番目なのかを求める

次に、それぞれの行のカテゴリーが先ほど抽出した表の何番目になるのかをMATCH関数を活用して求めます。
この関数の使い方は、以下になります。

=MATCH(検査値, 検査範囲, [照合の種類])
// 検査値:検索する値
// 検査範囲:検索する範囲
// [照合の種類]:(1)以下、(0)完全一致、(-1)以上(省略時は(1)が指定される)

実際にMATCH関数を活用して数式を作成すると、以下のようになります。

=MATCH(C3,UNIQUE(C3:C100),0)
// C3:検索する値
// UNIQUE(C3:C100):検索する範囲(直接UNIQUE関数を指定)
// 0:完全一致で検索

他の行でも、正しく求めることができることを確認します。
そのため、数式の中のカテゴリーの項目の範囲を絶対参照にします。
検査値に関しては、列方向に反映した際に、参照列が移動しないように列のみを絶対参照にします。

=MATCH($C3,UNIQUE($C$3:$C$100),0)

この数式を下へコピーすることで、カテゴリーが切り替わる位置で数値をカウントアップすることができます。

カテゴリーが入力されていない行に関しては、エラーが表示されます。
理由は、UNIQUE関数で抽出した値に空が存在しないためです。
(UNIQUE関数で抽出した値では、空が「0」になってしまっているため、空ではヒットしません。)

一度、エラーはこのままにしておきます。


3.(2)で求めた数値が偶数の場合にTRUEと表示する

次は、先ほどMATCH関数で抽出した、それぞれの値が偶数の場合にTRUEと表示する数式を作成していきます。

偶数かどうかを判定する場合は、ISEVEN関数を活用します。
この関数の使い方は、以下になります。

=ISEVEN(数値)
// 数値:対象の数値

実際にISEVEN関数を活用して数式を作成すると、以下のようになります。

=ISEVEN(MATCH($C3,UNIQUE($C$3:$C$100),0))

この数式を下へコピーすることで、偶数番目のカテゴリーのみにTRUEと表示することができます。

ただ、空白の場合にエラーになってしまうので、エラーに関しては、IFERROR関数を活用してFALSEと表示するようにしていきます。
この関数の使い方は、以下になります。

=IFERROR(値, エラーの場合の値)
// 値:エラーを検証する値
// エラーの場合の値:値がエラーの時に表示する値

実際にIFERROR関数を活用して数式を作成すると、以下のようになります。

=IFERROR(ISEVEN(MATCH($C3,UNIQUE($C$3:$C$100),0)),FALSE)

この数式を下へコピーすることで、偶数番目のカテゴリーのみにTRUEと表示することができます。

このように条件式を作成することができましたら、後は条件付き書式で設定してきます。


条件付き書式の設定

まずは、色付けする可能性のある対象の範囲を全選択します。

先ほど作成した条件式は3行目を基準とした100行目までに対応させた数式になります。
そのため、セルB3を基準にD100までを選択します。

名前ボックスを活用することで、簡単に選択することができます。

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

条件付き書式の設定画面にて、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にし、表示されたテキストボックス内に、先ほどの条件式を入力します。
※アクティブセルに対する条件式を入力します。

条件式の入力ができましたら、[書式]を選択し、好みの書式を設定します。
こちらでは、書式設定の画面にて、[塗りつぶし]から灰色を設定します。

上記のように設定して確定することで、以下のように、カテゴリー単位で交互に自動で色付けすることができます。

※広範囲に設定すると、Excelファイルが重たくなります。そのため、今回のように100行目までなどと必要最低限の範囲にしておくとよいです。

▼サンプルファイル▼

2024/11/27
【Excel】指定した年月のデータを数式で抽出

【Excel】指定した年月のデータを数式で抽出

今回は、抽出シートに年月を指定するだけで、売上管理シートの表から該当する年月のデータを瞬時に抽出する数式の作成方法について解説していきます。


表から指定したデータを抽出

表から指定したデータを抽出するには、FILTER関数を活用します。
この関数の使い方は、以下になります。

=FILTER(配列, 含む, [空の場合])
// 配列:抽出元の表
// 含む:抽出条件
// [空の場合]:対象が存在しない場合に表示する値(省略時はエラーが表示される)

今回は、指定した年月のデータを抽出する必要があるため、抽出条件は以下のようになります。

『日付の項目が指定した年月の1日以上、かつ、日付の項目が指定した年月の月末日以下』

この条件をFILTER関数の[含む]に指定するには、年月から1日と月末の日付を求める必要があります。


年月から1日と月末の日付を求める

年月から1日と月末の日付を求める場合は、DATE関数を活用します。
この関数の使い方は、以下になります。

=DATE(年, 月, 日)
// 年:求めたい日付の年
// 月:求めたい日付の月(桁上がり桁下がり対応)
// 日:求めたい日付の日(桁上がり桁下がり対応)

実際に年月から1日の日付を求める場合は、以下の数式になります。

=DATE(A1,C1,1)

月末の日付を求める場合は、日付の桁下がりを活用した、以下の数式になります。

=DATE(A1,C1+1,0)

では、この数式を活用して、FILTER関数の[含む]に条件を指定していきます。


指定した年月のデータを抽出

FILTER関数の[含む]に「尚且つ」という条件で複数の条件式を指定する場合は、複数の条件式を「*」で組み合わせる必要があります。
実際に、以下の条件のデータをFILTER関数で抽出する場合は、以下の数式になります。

『日付の項目が指定した年月の1日以上、かつ、日付の項目が指定した年月の月末日以下』

=FILTER(売上管理!A:D,(売上管理!A:A>=DATE(抽出!A1,抽出!C1,1))*(売上管理!A:A<=DATE(抽出!A1,抽出!C1+1,0)),"")
// 売上管理!A:D:抽出元の表の範囲(見出しを含んだ範囲になるが、見出しは[含む]に指定した条件を満たさないため抽出対象から除外される)
// 売上管理!A:A>=DATE(…):日付の項目が指定した年月の1日以上であるという条件式
// 売上管理!A:A<=DATE(…):日付の項目が指定した年月の月末以下であるという条件
// "":対象が存在しない場合は何も表示しない
ExcelVBAレベル確認

補足

数式が長くて分かりづらい場合は、Altキーを押しながらEnterキーを押して、以下のように改行して入力することもできます。