2026/03/06
【ExcelVBA】チェックしたら行が自動で非表示になる表

【ExcelVBA】チェックしたら行が自動で非表示になる表

以下の表のように、チェックボックスにチェックすると同時に、その行が自動で非表示になる仕組みを実現する方法について解説していきます。

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

今回の仕組みでは、チェックすると同時に自動でフィルター機能が実行され絞り込みされます。
そのため、フィルター機能を解除することで、簡単に再表示することもできます。


1. 開発準備

今回は、以下の表をもとに作成していきます。
あらかじめ、「済」の項目にチェックボックスを用意しています。

チェックボックスが用意されているセルには、TRUE(チェックされている)/FALSE(チェックされていない)の値が入力されます。
今回は、用意したチェックボックスをチェックすると同時に、フィルター機能による絞り込み(「済」がFALSEの行のみを表示)を実行します。

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

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

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

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

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

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


2. コードの記述

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.CountLarge >= 100 Then Exit Sub
    
    Dim t As Range
    For Each t In Target
        If t.Row >= 3 And t.Row <= 15 And _
            t.Column = 2 Then
            
            Range("B2").AutoFilter 1, False
            Exit Sub
            
        End If
    Next t
    
End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.CountLarge >= 100 Then Exit Sub
    
    Dim t As Range
    For Each t In Target
        '省略
    Next t
    
End Sub

「Worksheet_Change」というプロシージャの引数「Target」に、編集されたセルの情報が渡されます。
複数セルを同時に編集した場合は、複数セルの情報が渡されます。

こちらでは、編集された1つ1つのセルに対して処理を実行します。
そのため編集されたセルが多い場合は処理が重たくなってしまうため、100セル以上が同時に編集された場合は処理を終了しています。

次に、編集された1つ1つのセルの情報を受け取る用の「t」という入れ物(変数)を用意し、その「t」にセルの情報を1つ1つ渡して、繰り返して実行しています。

        If t.Row >= 3 And t.Row <= 15 And _
            t.Column = 2 Then
            
            Range("B2").AutoFilter 1, False
            Exit Sub
            
        End If

繰り返し処理の中で、対象のセルの行番号が3以上、15未満、列番号が2のとき、要するに、チェックボックスの範囲内が編集されたときに、チェックされていない行のみをフィルター機能で絞り込みしています。

1回絞り込みを行えば、繰り返し行う必要はないので、処理を終了しています。


3. 完成

以上の内容で実現できます。
チェックボックスにチェックするだけで、その行がフィルター機能により非表示になります。

▼サンプルファイル▼

2026/03/03
Excel2021以降で使える、絶対に覚えたい関数3選

Excel2021以降で使える、絶対に覚えたい関数3選

Excel2021以降のバージョンで使える便利な関数を3つ紹介します。


① XLOOKUP関数

1つ目は、XLOOKUP関数です。
この関数は、VLOOKUP関数を強化した関数で、データを検索して、対応する別の項目の値を抽出することができる関数です。
VLOOKUP関数とは異なり、列番号を数える必要がなく、さらに、IFERROR関数と組み合わせてエラー対策をする必要もなくなります。

活用例は以下になります。

=XLOOKUP(A3,A6:A20,B6:B20,"なし")

また、Excel2021以降からはスピルという機能に対応しており、以下のように連続した複数の項目を1つの数式で抽出することもできます。

=XLOOKUP(A3,A6:A20,B6:D20,"なし")

XLOOKUP関数の詳しい使い方については、以下の記事で解説しています。
>VLOOKUP / INDEX・MATCH / XLOOKUPの使い方


② FILTER関数

2つ目は、FILTER関数です。
この関数は、表の中から指定した条件を満たしたデータのみを抽出することができる関数です。
よく確認するデータに関しては、FILTER関数を活用して抽出することで、毎回フィルター機能で絞り込みをする必要がなくなります。

活用例は以下になります。

=FILTER(A10:D19,C10:C19=B2,"")

FILTER関数の詳しい使い方については、以下の記事で解説しています。
>FILTER関数の使い方


③ UNIQUE関数

3つ目は、UNIQUE関数です。
この関数は、指定した範囲から重複を除いたデータのみを抽出することができる関数です。
カテゴリーの一覧表を作成するときや、申し込み一覧から重複した申し込みを除外したいときなど、集計作業の準備段階で特に活用します。

活用例は以下になります。

=UNIQUE(C8:C20)

まとめ

紹介した3つの関数は、特に実務で即活用できる便利な関数です。
そのため使える環境の方は、ぜひ試してみてください。

2026/02/27
【ExcelVBA】クリックするだけで別表に集計して追加

【ExcelVBA】クリックするだけで別表に集計して追加

「商品を選んだら別の表に追加し、同じ商品なら数量を加算」
この処理を右クリックだけで実現する方法について解説していきます。

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


1. 開発準備

今回は、以下の表(商品一覧とカート)を元に作成していきます。

特定のセルの上で右クリックすることで何かしら処理を実行するには、「シートモジュール」「イベントプロシージャ」を活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示できます。

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

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

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

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

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


2. コードの記述

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

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    
    Dim t As Range: Set t = Target
    
    If t.Row >= 4 And _
        t.Column >= 2 And t.Column <= 4 And _
        t.CountLarge = 1 And _
        Cells(t.Row, "B").Value <> "" Then
        
        Cancel = True
        
        Dim lRow As Long, r As Long, f As Boolean
        lRow = Cells(Rows.Count, "F").End(xlUp).Row
        f = False
        
        For r = 4 To lRow
            If Cells(r, "F").Value = Cells(t.Row, "B").Value Then
                f = True
                Cells(r, "H").Value = Cells(r, "H").Value + 1
            End If
        Next r
        
        If Not f Then
            Cells(lRow + 1, "F").Value = Cells(t.Row, "B").Value
            Cells(lRow + 1, "G").Value = Cells(t.Row, "C").Value
            Cells(lRow + 1, "H").Value = 1
        End If
        
    End If
    
End Sub

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

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    
    Dim t As Range: Set t = Target
    
    If t.Row >= 4 And _
        t.Column >= 2 And t.Column <= 4 And _
        t.CountLarge = 1 And _
        Cells(t.Row, "B").Value <> "" Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_BeforeRightClick」というプロシージャの引数「Target」に、右クリックされたセルの情報が渡されます。
複数範囲を選択している範囲の上で右クリックした場合は、複数セルの情報が渡されます。

次に、そのセルの情報を「t」という名前の入れ物(変数)に格納し、その「t」を活用して、対象の範囲上で右クリックされたかどうかを確認します。

対象の範囲とは、以下の条件を満たす範囲です。

・行番号が4以上
・列番号が2以上4以下
・単体のセル
・そのセルと同じ行のB列が空でない

要するに、商品一覧の表の中かつ商品が入力されている行の上で、単体のセルが右クリックされた場合に処理を実行するようにしています。

        Cancel = True
        
        Dim lRow As Long, r As Long, f As Boolean
        lRow = Cells(Rows.Count, "F").End(xlUp).Row
        f = False

対象の範囲内で、単体のセルが右クリックされた場合に、右クリック時のメニュー表示を無効にし、「lRow」と「r」という数値専用(Long)の入れ物(変数)、「f」という論理値専用(Boolean:True / Falseのみ)の入れ物(変数)を用意しています。

「lRow」には、カートの表の最終行の行番号を格納しています。
最終行の行番号は以下のように取得しています。

F列の末尾のセルを選択し、「Ctrl+↑」で移動した先のセルの行番号

そのため、カートの表にデータが1件も存在しない場合は、見出しの行である「3」が取得されます。

「r」には何も格納せず、「f」には「False」を格納しています。

        For r = 4 To lRow
            If Cells(r, "F").Value = Cells(t.Row, "B").Value Then
                f = True
                Cells(r, "H").Value = Cells(r, "H").Value + 1
            End If
        Next r

カートの4行目から最終行(lRow)まで繰り返し、右クリックされた商品(B列のID)と一致する商品(F列のID)を探します。
一致する商品が見つかった場合は、「f」を「True」にして、その見つかったカートの行のH列の数量に「1」を加えています。

        If Not f Then
            Cells(lRow + 1, "F").Value = Cells(t.Row, "B").Value
            Cells(lRow + 1, "G").Value = Cells(t.Row, "C").Value
            Cells(lRow + 1, "H").Value = 1
        End If

「f」が「False」の場合、要するに、先ほどの繰り返しで一致する商品が見つからなかった場合に、カートの末尾(lRow + 1)のF列に右クリックされた商品のID(B列)、G列に商品名(C列)、H列に「1」を入力しています。


3. 完成

以上の内容で実現できます。
商品一覧の表の中の、IDが入力された行のいずれかのセルを右クリックすることで、隣の表のカートに、その商品を追加することができます。

▼サンプルファイル▼

2026/02/24
【Excel】設定画面を閉じずに別ファイルを操作する裏技

【Excel】設定画面を閉じずに別ファイルを操作する裏技

Excelで作業手順書などを作っていると、次のような場面があります。

・条件付き書式の設定画面を開いたまま別のファイルを操作したい
・マクロの実行中に別のファイルを操作したい

しかし通常、Excelの設定画面(条件付き書式やデータの入力規則など)を開いている間やマクロの実行中には、他のファイル(ブック)を操作できません。

そのため、次のような面倒な作業になりがちです。

スクショ → 設定画面を閉じる → 貼り付け → また設定画面を開く

実はこれ、別のファイルを開くときに、別のアプリとして起動するだけで解決できます。
こちらでは、Excelの設定画面を閉じずに別のファイルを操作する方法について紹介していきます。


できること

今回の方法を行うことで、次のことが可能になります。

・設定画面を開いたまま別のファイルを操作
・マクロの実行中に別のファイルを操作

Excelを別アプリとして起動する

別のアプリとして起動するには、次の手順を行います。


・手順①

すでに2つのExcelファイルを開いている場合は、片方のファイルを閉じます。


・手順②

Altキーを押したまま、タスクバーのExcelアイコンの上で、マウスホイールをクリック(押し込み)します。
この時、Altキーはしばらく押し続けてください。
すると確認メッセージが表示されます。


・手順③

「はい」を選択すると、現在開いているExcelとは別のアプリとして新しいExcelが起動します。


・手順④

新しく立ち上がったExcelで別のファイル開きます。
対象のファイルを、新しく立ち上がったExcelにドラッグすることでも開くことができます。


以上の手順を行い、複数のファイルを立ち上げることで、互いに干渉しない状態で作業を行うことができるようになります。


注意点

便利な機能ですが、互いに干渉しない状態になるため、「別のファイルをクリックしての数式の参照」などの一部の機能が使えなくなります。

2026/02/20
【Excel】前日から値が変わったら自動で色付け

【Excel】前日から値が変わったら自動で色付け

以下のように何かしらの数値を日々記録している場合、値が変わった場所を見つけるのは若干大変です。

そこで今回は、以下のように「前日と値が変わったセル」と「その日付のセル」を色付けする設定方法について解説していきます。

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


前日と値が変わったセルを色付け

はじめに、前日と値が変わったセルを色付けしていきます。
特定の条件を満たしたセルの書式を自動で変更する場合は、「条件付き書式」を活用します。

まずは、日付を除く色付けする可能性のあるセルを選択します。
こちらでは、2行目のデータに関しては前日のデータが存在しないため、3行目以降のB列からD列のセルを選択します。

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

条件付き書式の設定画面が表示されましたら、[ルールの種類]を[指定の値を含むセルだけを書式設定]にして、[セルの値]→[次の値に等しくない]→「=B2」と指定します。

これは選択基準のセルB3を色付けする条件です。
セルB3を色付けするときとは、その一つ上のセルB2の値と異なる場合になるので、上記のように指定しています。
他の選択範囲に関しては、セルが相対的に参照されます。(例:セルC3→「=C2」)

条件の指定ができたら、[書式]から好みの書式を指定します。
こちらでは、[フォント]タブから「赤色」、[塗りつぶし]タブから「黄色」を指定しています。

上記のように書式の設定ができたら、設定内容を確定することで、前日と値が変わったセルを自動で色付けすることができます。


1件でも値が変わった日付のセルを色付け

では次に、1件でも値が変わった日付のセルを色付けしていきます。
先ほどは自分自身のセルに対して、前日と値が変わったかどうかを確認しましたが、今回は自分自身ではなく、他の複数セルを確認する必要があります。
そのため、先ほどより設定内容が複雑になります。

まずは、色付けする可能性のある日付の範囲、3行目以降のA列を選択します。

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

条件付き書式の設定画面が表示されましたら、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にし、条件式を直接入力します。

今回の場合の条件は、以下のようになります。

「B列(数量1)が前日の値と異なる」または「C列(数量2)が前日の値と異なる」または「D列(数量3)が前日の値と異なる」場合

このように、「複数条件のいずれかを満たす場合」という条件式はOR関数を活用し、以下のように指定します。

=OR(B2<>B3,C2<>C3,D2<>D3)
// B2<>B3:B2とB3が等しくない
// C2<>C3:C2とC3が等しくない
// D2<>D3:D2とD3が等しくない

条件式の入力ができたら、[書式]から好みの書式を指定します。
こちらでは、 [塗りつぶし]タブから「黄色」を指定しています。

上記のように書式の設定ができたら、設定内容を確定することで、いずれかの項目の値が前日と変わっている日付のセルを自動で色付けすることができます。

▼サンプルファイル▼

2026/02/17
【Excel】数値を文字列に変換する珍しい関数5選

【Excel】数値を文字列に変換する珍しい関数5選

使い道が分からない「数値を文字列に変換する珍しい関数」を5つ紹介していきます。


1. BAHTTEXT関数

1つ目は、BAHTTEXT関数です。
この関数は、数値をタイ語の通貨表記に変換します。


2. DOLLAR関数

2つ目は、DOLLAR関数です。
この関数は、数値をドル表記の文字列に変換します。

※第2引数で小数点以下の桁数を指定しています。


3. ROMAN関数

3つ目は、ROMAN関数です。
この関数は、数値をローマ数字に変換します。

※変換できるのは1から3999までです。


4. YEN関数

4つ目は、YEN関数です。
この関数は、数値を円表記の文字列に変換します。

※第2引数で小数点以下の桁数を指定しています。


5. NUMBERSTRING関数

5つ目は、NUMBERSTRING関数です。
この関数は、数値を漢数字に変換します。

※この関数は入力候補には表示されません。
※第2引数で変換する形式を指定しています。
※変換できる数値は0以上です。


補足

これらの関数は、どれも数値を指定した文字列に変換するものです。
そのため、SUM関数などでは正しく集計することができません。

また表示形式で対応できるものも多いため、これらの使い道はかなり限られます。

2026/02/13
【Excel】FILTER関数による抽出データの元データに遷移するハイパーリンク

【Excel】FILTER関数による抽出データの元データに遷移するハイパーリンク

FILTER関数の登場により、以下のようにフィルター機能を活用した絞り込みをしなくても、簡単にデータを抽出することができるようになりました。

=FILTER(B3:C100,D3:D100="着手中","")

しかし、データの確認ができても、データを更新する際は元の表の対象データを探す必要があります。

更新するたび、毎回元のデータを探すのは大変です。

ということで今回は、元のデータに瞬時に遷移するハイパーリンクを自動で表示させる方法について紹介していきます。

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


対象データの行番号を取得する

まずは、抽出されたそれぞれのデータが、元の表の何行目のデータになるのか、その行番号を取得する数式を入力していきます。

今回の表の場合、「No」の値が一意のデータになるため、抽出された「No」と一致する元の表の「No」の位置情報を取得していきます。

特定の値と一致するセルの位置情報を取得する場合は、MATCH関数が便利です。
以下のように、抽出データの先頭行の隣のセルに数式を入力します。

=MATCH(F3,B1:B100,0)
// F3:検索値
// B1:B100:検索範囲(行番号を取得するため、1行目から表の範囲を大きめに指定)
// 0:検索方法(検索値と完全一致する値が入力されたセルの位置情報を取得)

これで、先頭行に関しては抽出することができました。

次に、この結果をFILTER関数の抽出範囲の全ての行に対して表示する必要があります。
MATCH関数の検索値の範囲(F3)を複数行指定することでも、全体に展開して表示することができますが、データの増減に対応することはできません。

=MATCH(F3:F19,B1:B100,0)

データの増減に対応させるためには、FILTER関数の展開範囲から指定する必要があります。
スピルにより展開された範囲は、数式を入力したセルの後に「#」を加えることで指定することができます。

=F3#

しかし、今回指定すべき範囲は、抽出された表全体ではなく、「No」の範囲のみになります。

そのような時は、INDEX関数を活用します。
INDEX関数で列番号のみを以下のように指定することで、対象範囲の指定した列のみを抽出することができます。

=INDEX(F3#,,1)
// =INDEX(範囲,行番号,列番号)

後は、この数式をMATCH関数の検索値に指定するだけで、データの増減に対応した数式にすることができます。

=MATCH(INDEX(F3#,,1),B1:B100,0)

ハイパーリンクを表示させる

各行番号のD列(「進捗」の項目)に遷移するハイパーリンクにしていきます。
特定のセルに遷移する動的なハイパーリンクを用意するには、HYPERLINK関数を活用します。

特定のセルに遷移するハイパーリンクは、以下のように指定します。

=HYPERLINK("#[遷移先のセルのアドレス] ", "表示するテキスト")

遷移先のセルのアドレスには、以下のような指定をします。

同じシートのセルD3に遷移:”#D3″
別シート(Sheet1)のセルD3に遷移:”#Sheet1!D3″

今回の例では、同じシート上に遷移させます。
また、行番号はMATCH関数で取得した値になるため、以下のように指定します。

=HYPERLINK("#D"&MATCH(INDEX(F3#,,1),B1:B100,0),"●")

これでハイパーリンクの完成です。
ただ、数式を入力したセル以外の書式は、以下のようにハイパーリンクの書式にならないため、列全体をハイパーリンクの書式と似た書式にしておくとよいです。

こちらでは、青文字に下線を設定しています。
直接書式を変更しているため、通常のハイパーリンクのように、クリックした後に色が変わることはありません。

ハイパーリンク自体は完成していますが、このままですと、抽出データが1件も存在しないときに、以下のようなエラーになってしまいます。

そのため、以下のようにIFERROR関数を組み合わせるとよいです。

=IFERROR(HYPERLINK("#D"&MATCH(INDEX(F3#,,1),B1:B100,0),"●"),"")

完成

以上の手順で完成です。

抽出されたデータから元のデータに遷移したい場合、対象行のハイパーリンクをクリックするだけで、簡単に遷移することができます。

▼サンプルファイル▼

2026/02/10
【Excel】IF関数のネスト問題を「IFS関数」で解決

【Excel】IF関数のネスト問題を「IFS関数」で解決

以下のようなIF関数のネストは、条件の確認がしづらいです。

また、入力時に括弧の数が分からなくなってしまうこともあり、スムーズな入力ができません。

実は、Excel2019以降では、「IFS関数」というIF関数のネスト問題を解決する関数が追加されています。
こちらでは、IF関数のネストからIFS関数に置き換える方法について紹介していきます。


IFS関数に置き換える

まずは、IF関数とIFS関数の使い方から比較していきます。
2つの使い方(引数の指定方法)は以下のとおりです。

=IF(論理式, 結果が真の場合, 結果が偽の場合)
=IFS(論理式1, 結果が真の場合1, [論理式2, 結果が真の場合2], [論式式3, 結果が真の場合3], …)

このように、IFS関数では、複数の論理式(条件)を指定することができ、それぞれの論理式(条件)に対し、結果が真の場合に表示する値を指定することができます。
複数の論理式(条件)が真になる場合は、先頭に記述された結果が優先されて表示されます。

(例)「論理式1」と「論理式2」が真 → 「結果が真の場合1」の値が表示される

では、以下のIF関数の数式をIFS関数に置き換えます。

=IF(E3<>"","完了済",IF(D3="","未設定", IF(D3<TODAY(),"期限切れ",IF(D3=TODAY(),"今日","期限前"))))

以下のように、論理式を指定する順番はそのままで、「論理式、結果」という順番でカンマ区切りにして並べます。

=IFS(E3<>"","完了済",D3="","未設定",D3<TODAY(),"期限切れ",D3=TODAY(),"今日",TRUE,"期限前")

IFS関数には、「結果が偽の場合」に表示する値を指定することができないため、末尾の論理式を「TRUE」にし、末尾の「結果が真の場合」の値が最終的に表示されるようにします。

ただ、以下のように数式が長くなります。

そのため、条件の組み合わせ単位で、以下のように改行するとよいです。

このように改行すると、条件の位置の確認もしやすくなるため、条件を加えることも容易になります。

2026/02/06
【ExcelVBA】連続した値を一括でセル結合!その逆も可能

【ExcelVBA】連続した値を一括でセル結合!その逆も可能

以下のように、連続した値を含む範囲を選択して、今回紹介する機能を実行するだけで、セルの結合をすることができる、もしくは、その逆をすることもできます。

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

このような、複数範囲に対して、セルの結合(解除)を瞬時に行うことができる機能の作り方を紹介していきます。


1. 開発準備

機能を加えたいファイルを立ち上げ、[開発]タブから[マクロ]を選択します。

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

次に表示される以下の画面の「Sub ○○」から「End Sub」の間にコードを記述します。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

こちらで作成した機能を保存するには、マクロ有効ブック(拡張子「xlsm」)にする必要があります。


2. コードの記述

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

Sub ToggleMerge()
    
    Dim s As Variant: Set s = Selection
    
    If TypeName(s) <> "Range" Then Exit Sub
    If s.Columns.Count <> 1 Then Exit Sub
    If s.Count > 10000 Then Exit Sub
    
    Application.DisplayAlerts = False
    Dim i As Long, r As Range
    For i = 1 To s.Cells.Count
        If s.Cells(i).MergeCells Then
            With s.Cells(i).MergeArea
                .UnMerge
                .Value = s.Cells(i).Value
                i = i + .Count - 1
                Set r = Nothing
            End With
        Else
            If Not r Is Nothing Then
                If r.Value = s.Cells(i).Value Then
                    Range(r, s.Cells(i)).Merge
                Else
                    Set r = s.Cells(i)
                End If
            Else
                Set r = s.Cells(i)
            End If
        End If
    Next i
    Application.DisplayAlerts = True
    
End Sub

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

    Dim s As Variant: Set s = Selection
    
    If TypeName(s) <> "Range" Then Exit Sub
    If s.Columns.Count <> 1 Then Exit Sub
    If s.Count > 10000 Then Exit Sub

選択している範囲の情報を変数(s)に割り当て、その範囲が以下の条件を満たしているときに処理を終了します。(上から順番に確認)

・セル以外(Rangeではない:図形など)
・(セルの場合で)セルが1列以外(複数列)
・(セルが1列の場合で)セルの数が10000より多い

こちらは、処理する範囲が正しくないときにエラーになってしまうことや、範囲が膨大で処理が重たくなってしまうことを防ぐための対策です。

    Application.DisplayAlerts = False
    '省略
    Application.DisplayAlerts = True

セルを結合するときに、以下のような警告メッセージが表示されることがあるため、このような警告メッセージの表示を一時的に無効にしています。

    Dim i As Long, r As Range
    For i = 1 To s.Cells.Count
        If s.Cells(i).MergeCells Then
            '省略
        Else
            '省略
        End If
    Next i

変数(i)は繰り返し処理(For i = 1 … Next i)でセルの位置情報を格納する用、変数(r)は1つ前のセルの情報を格納する用として用意しています。
選択されているセルを先頭から1つずつ確認し、そのセルが「結合されている場合」と「結合されていない場合」で処理を分岐しています。

            With s.Cells(i).MergeArea
                .UnMerge
                .Value = s.Cells(i).Value
                i = i + .Count - 1
                Set r = Nothing
            End With

セルが結合されている場合の処理で、まずは結合されているセルの範囲をWithで指定しています。
その次に、その範囲の結合を解除し、結合されていた範囲全体に、その範囲の先頭のセルの値を入力しています。

そして、セルの位置情報を格納している変数(i)に、結合されていた範囲のセルの数から1を引いた数を加えて、その範囲の末尾のセルの位置情報に上書きしています。

最後に、1つ前のセルの情報を格納する用の変数(r)を未割当にしています。

            If Not r Is Nothing Then
                '省略
            Else
                Set r = s.Cells(i)
            End If

セルが結合されていない場合の処理で、1つ前のセルの情報を格納する用の変数(r)が未割当でない場合と、未割当の場合で処理を分岐しています。

未割当の場合は、現在確認しているセルの情報を変数(r)に割り当てています。

                If r.Value = s.Cells(i).Value Then
                    Range(r, s.Cells(i)).Merge
                Else
                    Set r = s.Cells(i)
                End If

変数(r)が未割当でない場合は、その変数(r)が指すセルの値と現在の値が一致しているかどうかで処理を分岐しています。(1つ前の値と同じかどうか)

一致している場合は、変数(r)が指すセルから現在のセルまでの範囲を結合し、一致していない場合は、変数(r)に現在のセルを割り当てています。


3. ショートカットの割り当て

コードが完成したら、実行用のショートカットを割り当てます。

[開発]タブから[マクロ]を選択し、表示される画面から作成した機能を選択して、[オプション]を選択します。

表示される以下の画面にて、ショートカットを割り当てるキーを指定します。
こちらでは、Merge(結合)の略で「m」と入力し、「Ctrl + M」に機能を割り当てています。

以上の設定で確定して、設定画面を閉じます。


4. 完成

以上の手順で完成です。
セル結合したい、もしくはセル結合を解除したい範囲を選択して、「Ctrl + M」のショートカットを実行することで、以下のように切り替えることができます。

セルの結合を解除するときに、一部の罫線の設定が取り消されることがあります。

▼サンプルファイル▼

2026/02/03
【Excel】スピル活用時!指定した範囲内まで展開

【Excel】スピル活用時!指定した範囲内まで展開

スピルに対応したFILTER関数などで値を抽出する際に、指定した範囲内に収まらないとエラーになってしまいます。

ということで、スピルの活用時に「予め指定した範囲内」まで表示し、それ以外は表示しない方法について解説していきます。


TAKE関数の活用

スピルによる展開時に、予め指定した範囲内に収めたいときは「TAKE関数」が便利です。
TAKE関数では、指定した範囲から指定した件数(行数もしくは列数)まで表示し、それ以外は表示しないようにすることができます。

例えば、以下の数式の抽出を最大5件(5行)までにしたい場合について解説していきます。

=SORT(FILTER(B3:D1000,E3:E1000="完了",""),3)

その際は、数式の先頭に「TAKE(」を加え、末尾に「,行数)」を以下のように加えます。

=TAKE(SORT(FILTER(B3:D1000,E3:E1000="完了",""),3),5)
// 先頭から5行分を表示

このようにTAKE関数で囲むことで、以下のように指定した件数まで表示することができます。


補足

TAKE関数に指定する行数に「負の値」を指定すると、末尾から指定した件数まで表示することができます。

=TAKE(SORT(FILTER(B3:D1000,E3:E1000="完了",""),3),-5)
// 末尾から5行分を表示

TAKE関数では、以下のように指定することもできます。

=TAKE(範囲,,2)
// 先頭から2列分を表示
=TAKE(範囲,,-2)
// 末尾から2列分を表示
=TAKE(範囲,2,2)
// 先頭から2行2列分を表示
2026/01/30
【Excel】日付の年月日の位置を揃えて表示

【Excel】日付の年月日の位置を揃えて表示

以下のように、日付の年月日の位置を揃えて表示する方法について、「0埋め」で揃える方法「スペース埋め」で揃える方法2通り紹介していきます。


「0埋め」で揃える方法

初めに、「0埋め」で揃える方法について紹介していきます。

「0埋め」の方法は、表示形式を活用します。
まずは、対象の範囲を選択し、右クリックから[セルの書式設定]を開きます。

次に、[表示形式]タブの[ユーザー定義]を選択し、「yyyy/mm/dd」と入力します。

これで確定すれば完成です。
以下のように、月日が「0埋め」になって年月日の位置が揃いました。

表示形式についての詳しい解説は、以下が参考になります。
>セルの表示形式の設定方法


「スペース埋め」で揃える方法

次に、「スペース埋め」で揃える方法について紹介していきます。

「スペース埋め」の方法は、「0埋め」のような単純な方法では実現できません。
「月が1桁、日が1桁」の場合、「月が1桁、日が2桁」の場合などとすべてのパターンに対し、スペースを表示する位置を表示形式で指定する必要があります。

入力されている日付によって、反映させる表示形式を変える必要があるので、実現するには「条件付き書式」を活用します。

まずは、準備段階として、「0埋め」でない日付の形式にしておきます。
(表示形式:yyyy/m/d)

次に、各パターンについて、それぞれ設定していきます。


【月1桁・日1桁】

まずは、対象の範囲を選択し、[ホーム]タブから[条件付き書式]の[新しいルール]を選択します。

次に、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にし、「月が1桁、日が1桁の場合」という条件式を入力します。

条件を数式で表現すると、以下のようになります。

=AND(LEN(MONTH(A2))=1,LEN(DAY(A2))=1)
// 選択基準のセルがA2なので、セルA2に対しての条件式を指定
// AND(…):すべての条件を満たす場合
// LEN(MONTH(A2))=1:セルA2の月が1桁の場合
// LEN(DAY(A2))=1:セルA2の日が1桁の場合

次に、[書式]を選択し、[表示形式]タブの[ユーザー定義]にて、以下の表示形式を指定します。

yyyy/ m/ d
// mとdの手前に半角スペースを指定

これで確定することで、月と日が1桁の日付に関しては、「スペース埋め」になります。

【月1桁・日2桁】

条件付き書式に設定する条件式と表示形式以外の手順は同じになります。
そのため、以降は条件式と表示形式のみ記載します。

=AND(LEN(MONTH(A2))=1,LEN(DAY(A2))<>1)
yyyy/ m/d
// mの手前のみ半角スペースを指定

上記の内容で設定すると、以下のように反映されます。

この時点では年月日の位置が揃っていませんが、問題ありません。

【月2桁・日1桁】

条件付き書式に設定する条件式と表示形式は、以下になります。

=AND(LEN(MONTH(A2))<>1,LEN(DAY(A2))=1)
yyyy/m/ d
// dの手前のみ半角スペースを指定

上記の内容で設定すると、以下のように反映されます。


各パターンの表示形式の設定が完了しました。
しかし、年月日の位置が揃っていません。
これは、デフォルトのフォント(「游ゴシック」など)の文字幅が統一されていないためです。

そのため、文字幅が等間隔のフォントに変更する必要があります。
こちらでは、「HGゴシックM」に変更します。

これで完成です。
以下のように、月日が「スペース埋め」になって年月日の位置が揃いました。

2026/01/27
【Excel】INDEXとMATCHの組み合わせ

【Excel】INDEXとMATCHの組み合わせ

INDEX関数とMATCH関数を組み合わせることによって、以下のように、マトリックス表(クロス表)から値を抽出することができます。

この数式、一見長くて難しそうですが、理屈が分かると簡単です。

ということで、INDEX関数とMATCH関数の組み合わせで、値を抽出する仕組みについて解説していきます。


INDEX関数

まずは、INDEX関数についての解説です。
INDEX関数には、「配列・行番号・列番号」の3つを指定します。

=INDEX(配列, 行番号, 列番号)

[配列]に指定した範囲から、指定した[行番号・列番号]に位置する値を取得します。
実際に、以下の数式を入力します。

=INDEX(C3:D5,3,2)
// C3:D5:配列
// 3:行番号
// 2:列番号

[配列]に指定した範囲の3行目2列目に位置する値を取得するので、プラン「C」性別「女」の「1,200」が抽出されます。


MATCH関数

次は、MATCH関数についての解説です。
MATCH関数には、「検査値・検査範囲、照合の種類」の3つを指定します。

=MATCH(検査値, 検査範囲, 照合の種類)

[検査値]に指定した値を、[検査範囲]に指定した範囲の先頭から探し、見つかった位置の番号(先頭から1、2,3、…)を取得します。
[照合の種類]には、「1、0、―1」が指定でき、それぞれ、以下の検査方法を指します。

1:検査値以下
0:検査範囲と完全一致
―1:検査範囲以上

こちらでは、一番使われる「0」のみについて解説していきます。

実際に、以下の数式を入力します。

=MATCH(G2,C2:D2,0)
// G2:検査値
// C2:D2:検査範囲
// 0:照合の種類(完全一致)

横方向は左が先頭、縦方向は上が先頭になります。
そのため、検査範囲の「男」が最初に確認され、その次に「女」が確認されます。
そこで、検査値の「女」が見つかった位置、2番目の「2」を取得します。

次に、以下の数式を入力します。

=MATCH(G3,B3:B5,0)
// G3:検査値
// B3:B5:検査範囲
// 0:照合の種類(完全一致)

この場合、検査範囲の先頭の「A」から確認し、検査値の「C」の位置を取得します。
「C」の位置は先頭から3番目のため、「3」を取得します。


INDEX関数とMATCH関数の組み合わせ

最後に、INDEX関数とMATCH関数の組み合わせです。
MATCH関数を活用することで、対象の値の位置情報を取得することができ、INDEX関数を活用することで、指定した位置情報から、その位置の値を取得することができます。

そのため、INDEX関数の「行番号・列番号」にMATCH関数の数式を指定します。

=INDEX(C3:D5,3,2)
=MATCH(G2,C2:D2,0)
=MATCH(G3,B3:B5,0)
↓
=INDEX(C3:D5,MATCH(G3,B3:B5,0),MATCH(G2,C2:D2,0))

これで完成です。

INDEX関数に指定する位置情報の順番は「行番号→列番号」になるので、順番が逆にならないように注意してください。