2025/06/27
【ExcelVBA】非表示の行を一括で削除

【ExcelVBA】非表示の行を一括で削除

「表の中の特定のデータのみを残したい」

そのような場面、ありますよね。
特に、特定のデータのみを他の方に共有するときなどです。

ただ、標準機能には、「特定のデータ以外を一括で削除する」という機能はありません。
そのため、「特定のデータ以外で絞って、残ったデータ行を削除してから絞り込みを解除する」といった手順を行う必要があります。

例えば、以下の表から「地域が東京のデータのみ」を残したい場合、以下の手順になります。


① 東京以外で絞り込み

② 表示されたデータ行を削除

③ 絞り込みを解除(フィルターの解除)


ただ、「削除したいデータで絞り込みする」というのが直観的じゃないです。

そこで今回は、「残したいデータ」で絞り込んでから非表示のデータ行を一括削除できるように、非表示の行を一括削除する機能の開発方法について解説していきます。

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

ExcelVBAレベル確認

1. 開発準備

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

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

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


2. コードの記述

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

Sub DeleteHiddenRows()
    
    Dim r As Long
    For r = 100000 To 3 Step -1
        If Rows(r).Hidden Then
            Rows(r).Delete
        End If
    Next r
    
End Sub

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

    Dim r As Long
    For r = 100000 To 3 Step -1
        '省略
    Next r

100000から3までを-1ずつ変数「r」に渡して、ForからNextの間を繰り返しています。
100000から3というのは、表の最終行(仮)から先頭行までを表しており、最終行の100000は、「100000行目まではデータがない」という前提の仮の値になります。

        If Rows(r).Hidden Then
            Rows(r).Delete
        End If

繰り返し処理で受け取る変数「r」の値を活用して、「r」行目が非表示の場合に「r」行目を行ごと削除しています。

ExcelVBAレベル確認

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

開発した機能が簡単に実行できるように、ショートカットを割り当てていきます。
まず、[開発]タブを選択し、[マクロ]を選択します。

マクロの画面から先ほどの開発したマクロ名を選択し、[オプション]を選択します。

表示された以下の画面にて、[ショートカットキー]のテキストボックスを選択し、好みのキーを入力します。
※「Ctrl+Shift+○」のようにShiftを加えたい場合は、「Shift+好みのキー」を入力します。

こちらでは、「Ctrl+Shift+D」に割り当てました。
ショートカットキーの入力後は、確定して画面を閉じます。


4. 完成

以上の手順で完成です。
抽出したいデータのみに絞り込みし、割り当てたショートカットキーを入力することで、非表示の行がすべて削除されます。

必要に応じて、フィルター機能を解除していただいて問題ございません。
また、今回の機能は、フィルター機能による絞り込みでなくても、非表示の行があれば、削除対象となります。

▼サンプルファイル▼

2025/06/24
【Excel】VLOOKUPで「見つかった一番下の値」を抽出する方法

【Excel】VLOOKUPで「見つかった一番下の値」を抽出する方法

表からデータを検索して抽出する際に便利な関数に「VLOOKUP関数」があります。
しかし、この関数では、重複する値が存在する場合に、「上から順に最初に見つかった値」しか取得できません。

そこで今回は、VLOOKUP関数で「見つかった一番下の値」を抽出する方法について解説していきます。


1. 行番号を取得する補助列を追加

まずは、検索対象の表の左側に新しい列を追加し、以下の数式を入力します。

=IF(B3=$B$16,ROW(),"")

この数式は、「表の顧客IDが検索値(顧客ID)と一致する場合、その行の行番号を表示する」という内容です。
検索値(顧客ID)の参照は「$」を加えて絶対参照にしています。

この数式を、表の最後の行までコピーします。

これで該当する行のみ行番号を表示することができました。

ExcelVBAレベル確認

2. 最大の行番号を使ってVLOOKUPで抽出

次に、検索結果を抽出するセルに、以下の数式を入力します。

=VLOOKUP(MAX(A3:A12),A3:D12,3,FALSE)

この数式は、「先ほど抽出した行番号の最大値の行にある3列目(購入日)を抽出する」という内容です。
これで一番下にある該当データを抽出することができます。


Excel2021以降なら「XLOOKUP」が便利

Excel2021以降の環境の場合、XLOOKUP関数が使えます。
XLOOKUP関数は、VLOOKUP関数をさらに快適にした関数で、以下の数式1つで「見つかった一番下の値」を抽出することができます。

=XLOOKUP(B16,B3:B12,C3:C12,"",0,-1)

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


まとめ

VLOOKUP関数単体では実現できないことでも、複数の関数を組み合わせることで解決できるケースは多くあります。

今回解説した「見つかった一番下の値を抽出する」方法もその一つです。
このテクニックを覚えておけば、実務でのデータ処理や分析の幅がぐっと広がります。

ぜひ、日々のExcel作業に取り入れてみてください。

2025/06/20
【ExcelVBA】新機能「セルにフォーカス」を自作する

【ExcelVBA】新機能「セルにフォーカス」を自作する

新機能「セルにフォーカス」は、選択中のセルの行と列をハイライト表示してくれる便利な機能です。

しかし、現時点では最新のバージョンでしか、この機能は使えません。
そこで、こちらの記事では、「セルにフォーカス」に似たような機能を自作する方法について解説していきます。

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


1. 条件付き書式の活用

「セルにフォーカス」という機能は、選択しているセルと同じ行、列のセルの背景を色付けするというものです。
そのような特定の条件を満たしたときのみにセルの色を変更する場合は、「条件付き書式」を活用します。


1.色付けしたい対象の範囲を選択

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

3.表示された画面のルールの種類を[数式を使用して、書式設定するセルを決定]にし、以下の数式を入力

=XOR(ROW(A1)=CELL("row"),COLUMN(A1)=CELL("col"))
// セルA1は選択基準のセル(アクティブセル)

数式の意味は以下になります。

XOR:いずれかの条件を1つのみ満たしている場合
ROW(A1)=CELL("row"):対象のセルの行番号がアクティブセルの行番号と同じ
COLUMN(A1)=CELL("col"):対象のセルの列番号がアクティブセルの列番号と同じ

4.[書式]を選択し、[塗りつぶし]タブから好みの色を選択

5.確定


これで、アクティブセルと同じ行、列のセルの背景色を色付けすることができます。

ただし、他のセルを選択しても、色が更新されません。
色を更新するためには、セルを編集したり、F9キーを押したりして、数式を再計算する必要があります。

毎回、数式を再計算するのは大変ですので、次の設定を行います。

ExcelVBAレベル確認

2. 数式を自動で再計算させる

セルを移動した時に、自動で数式を再計算して、セルの色が更新されるようにしていきます。

特定のシートのセルを選択すると同時に、何かしらの処理を実行するには、該当するシートのシートモジュールを活用します。

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

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

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

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

このプロシージャの中に、「数式を再計算する」という以下の処理を記述します。

Application.Calculate

3. 完成

以上の手順で完成です。
セルを選択すると同時に、数式が再計算され、選択しているセルがフォーカスされるようになります。

▼サンプルファイル▼


4. 注意点

自作する場合は、以下の点を考慮する必要があります。

・マクロ有効ブック(.xlsm)として保存する必要がある(マクロを使用しているため)
・数式が多いシートでは処理が重たくなる可能性がある(セルを選択する度、数式が再計算されるため)
・セルのコピー操作が解除されてしまうことがある(再計算と同時にコピーモードがキャンセルされるため)

2025/06/17
【Excel】表へのデータ入力を快適にするテクニック

【Excel】表へのデータ入力を快適にするテクニック

以下のような表へのデータ入力の作業は、単純なようで意外と手間がかかります。
「値を入力 → Enterキーで確定 → カーソルキーで移動 → 値を入力 → …」という繰り返しは大変ですよね。

ドロップダウンリストから選択する時は、わざわざマウスで選択…
これもまた大変です。

ということで今回は、TabキーとAltキーを活用した効率的な入力方法を紹介します。


快適に項目を移動する

通常、値を入力したあとにEnterキーで確定すると、カーソルは下方向に移動します。
Excelのオプションから移動する方向を変更することは可能ですが、常時、移動方向が変更した方向に変わってしまうので、快適とは言えません。

そこで、Tabキーを活用します。
Tabキーで確定することによって右方向に移動することができるため、横に並んだ項目を次々と入力することができます。

1つ前の項目に戻りたい時は、Shiftキーを押しながらTabキーを押すことで、戻ることができます。


快適にリストから選択する

次はドロップダウンリストの入力です。
リストに関しても、マウスを使わずに入力することができます。

その方法は、Altキーを押しながら下矢印キーです。
対象のセルを選択して、Altキーを押しながら下矢印キーを押すことで、リストを展開することができます。

リストを展開した後は、上矢印キー、下矢印キーで選択肢を移動して、EnterキーまたはTabキーで確定します。


過去に入力した値から選択する

実は、Altキーと下矢印キーは、ドロップダウンリストが設定されていないセルでも使うことができます。
リストが設定されていないセルで使うと、その項目で過去に入力した値がリストとなって表示されます。

ただし、この過去に入力した値のリストから選択して確定する場合は、TabキーではなくEnterキーで行う必要があります。


次の行に移動する

表の最後の項目まで移動した後に、次の行の先頭の項目に移動したい場合は、Enterキーで確定するだけです。
Tabキーで項目を移動した場合、Enterキーで確定することで、Tabキーで移動した最初の位置の下のセルに移動することができます。

ExcelVBAレベル確認

まとめ

Tabキー:右隣りのセルへ移動
Altキー + 下矢印キー:リストや履歴の展開

これらの操作を覚えておくだけで、表への入力作業が快適になります。
ぜひご活用ください。

2025/06/13
【Excel】一部が結合されている表から特定の値を数式で抽出

【Excel】一部が結合されている表から特定の値を数式で抽出

以下のように、一部のセルが結合されている表でデータが管理されていることがあります。

このような表では、VLOOKUP関数やXLOOKUP関数などでの値の抽出が難しそうに感じます。
実は、法則性がある場合は、数式を用いて簡単に値を抽出することができます。

今回は、以下の表の「No」で検索して、該当する「イベント」と「担当者」を抽出する方法について解説していきます。
「担当者」に関しては、カンマ区切りで複数セルをまとめて抽出していきます。

ExcelVBAレベル確認

該当する「イベント」を抽出

まずは、以下の表を元に、セルF3の「No」から該当する「イベント」を抽出していきます。

結合されているセルは、その結合範囲の左上のセルに値が入力されている扱いになるので、上記の表の場合は、以下の表と同じ扱いになります。

そのため、VLOOKUP関数やXLOOKUP関数で簡単に抽出することができます。
こちらでは、XLOOKUP関数で抽出していきます。
XLOOKUP関数を活用する場合は、以下の数式で「イベント」を抽出することができます。

=XLOOKUP(F3,A:A,B:B,"")
// F3:検索値
// A:A:検索範囲
// B:B:戻り範囲(抽出範囲)
// "":見つからない場合

該当する「担当者」を抽出

次は、以下の表を元に、セルF3の「No」から該当する「担当者」を抽出していきます。

「担当者」に関しては複数行あります。
先頭の「担当者」は、先ほどと同じ理屈で抽出できますが、それ以降に関しては、抽出することが複雑になります。
そのため、「No」の項目に関しては、セルの結合を解除し、全ての行に「No」を入力していきます。

まずは、「No」の項目の要素全体を選択します。

選択した状態で、[ホーム]タブから[セルを結合して中央揃え]を選択して、一括で結合を解除します。

次に、セルを選択している状態で、[ホーム]タブから[検索と選択]の[条件を選択してジャンプ]を選択します。

次の画面で、「空白セル」を選択して確定します。

これだけで、以下のように「No」の項目の空白セルのみを選択することができます。

後は、この選択されている状態で「=」と入力し、一つ上のセルを選択します。

この状態で、Ctrlキーを押しながらEnterキーを押すことで、「No」の項目全体に「No」を入力することができます。

※必要に応じて見た目の修正や値のみの置き換えなどを行ってください。

後は、FILTER関数を活用して、以下のような数式で「担当者」を抽出することができます。

=FILTER(D:D,A:A=F3,"")
// D:D:配列(抽出範囲)
// A:A=F3:含む(抽出条件)
// "":空の場合

ただ、このままですと、上記のように「#スピル!」というエラーになってしまうか、複数行に渡って「担当者」が表示されてしまいます。
そのため、以下のように、TEXTJOIN関数を組み合わせて、抽出される「担当者」をカンマ区切りでセル内に表示させます。

=TEXTJOIN(",",TRUE,FILTER(D:D,A:A=F3,""))
// ",":区切り文字
// TRUE:空のセルは無視
// FILTER(D:D,A:A=F3,""):テキスト

まとめ

一部のセルが結合されている表でも「法則性がある場合」は、少し工夫することで、数式での抽出が可能になります。

2025/06/10
【Excel】表の入力漏れを防ぐ対策

【Excel】表の入力漏れを防ぐ対策

以下の表に関して、「所属」が「社員」の場合は「社員ID」を入力する必要があり、それ以外の場合は入力する必要がないとします。

ただ、以下のように「所属」が「社員」なのに「社員ID」が入力されていないといった入力漏れが発生する可能性があります。

そこで今回は、上記の表を例に、「所属」が「社員」の場合は該当行の「社員ID」を黄色にし、「社員」以外の場合は「社員ID」を灰色にする方法について解説していきます。


実現方法

特定の条件を満たしたときのみに、セルの色を変えるには『条件付き書式』を活用します。


「所属」が「社員」の場合に「社員ID」を黄色にする

今回の色付け対象の範囲は、「社員ID」の項目になります。
そのため、「社員ID」の列全体を以下のように選択します。

→ D列を全選択してから、不要なセルD1を、Ctrlキーを押しながら選択して選択を解除するとよいです。

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

以下の設定画面で、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にし、以下の条件式を入力します。

=AND(C2="社員",D2="")

条件式は、選択基準のセルD2が、どのような条件の時に黄色にするのかを考えて入力します。
今回の場合は、セルC2の値が「社員」の場合、尚且つ、セルD2(選択基準のセル)が空の場合といった条件式になります。
「セルD2が空の場合」という条件は、「社員ID」が入力された後は、セルを黄色にする必要がないためです。

ここに設定した条件式は、他の選択範囲にも相対参照で反映されます。
セルD3には以下の数式が反映されるといった感じです。

=AND(C3="社員",D3="")

条件式の入力ができましたら、[書式]を選択し、[塗りつぶし]タブから黄色を選択して確定します。

これだけで、以下のように「所属」に「社員」が入力されていて「社員ID」が空の時に黄色が設定されます。


「所属」が「社員」以外の場合に「社員ID」を灰色にする

先ほどと同様に、「社員ID」の項目を選択し、条件付き書式の設定画面にて、以下の条件式を入力します。

=AND(C2<>"社員",C2<>"")

この条件式は、「所属」が「社員」以外で、尚且つ、「所属」が空でない場合という意味です。

条件式の入力ができましたら、[書式]を選択し、[塗りつぶし]タブから灰色を選択して確定します。

これだけで、以下のように「所属」に「社員」以外が入力されている時に灰色が設定されます。


まとめ

このように、条件付き書式を使うことで、入力ミスを未然に防ぐことができます。
特に複数人で同じファイルを扱う場合などでは、このような対策がされているとよいです。

2025/06/06
【ExcelVBA】タスク管理表で残タスク数をシート名に自動反映

【ExcelVBA】タスク管理表で残タスク数をシート名に自動反映

複数シートでタスクを管理している場合、他のシートのタスクの進捗状況が確認しづらいですよね。
ということで今回は、シートごとの残タスク数をそれぞれのシート名に自動で表示させる仕組みの実現方法について解説していきます。

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

ExcelVBAレベル確認

1. 開発準備

こちらでは、プロジェクトごとのタスク管理表をシート分けしている以下のようなファイルを活用します。
シート名とそれぞれのシートのセルA1にはプロジェクト名を指定しています。

そして、それぞれのシートのいずれかのセルを編集すると同時に、最新の残タスク数をシート名に反映させる仕組みを実装していきます。

そのように、全てのシートに対し、セルを編集すると同時に処理を実行するには、「ブックモジュール」「イベントプロシージャ」を活用します。
[開発]タブから[Visual Basic]を選択、もしくはAltキーを押しながらF11キーを押して、VBEの画面を表示します。

表示されたVBEの画面のプロジェクトエクスプローラーから[ThisWorkbook]をダブルクリックすることで、ブックモジュールを開くことができます。
※プロジェクトエクスプローラーが表示されていない場合は、Ctrlキーを押しながらRキーを押すことで表示することができます。

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

「Workbook」を選択すると、自動で「Workbook_Open」というプロシージャが表示されます。
このプロシージャは、Excelファイルの立ち上げ時に自動で実行されるイベントプロシージャになります。

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

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

ExcelVBAレベル確認

2. コードの記述

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

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    If Sh.Range("A2").Value = "ID" Then
        
        Dim taskCnt As Long
        Dim compCnt As Long
        
        taskCnt = _
            WorksheetFunction.CountA(Sh.Range("A3:A10000"))
        compCnt = _
            WorksheetFunction.CountIf(Sh.Range("D3:D10000"), "完了")
            
        If taskCnt = compCnt Then
            Sh.Name = Sh.Range("A1").Value
        Else
            Sh.Name = Sh.Range("A1").Value & _
                "(" & (taskCnt - compCnt) & ")"
        End If
        
    End If
    
End Sub

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

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    If Sh.Range("A2").Value = "ID" Then
        
        '省略
        
    End If
    
End Sub

「Workbook_SheetChange」というプロシージャの引数の「Sh」に編集されたシートの情報、「Target」に編集されたセルの情報が渡されます。
そのため、「Sh」を活用して、編集されたシートにタスク管理表が含まれているかどうかを確認しています。
具体的には、編集されたシートのセルA2に「ID」という文字が入力されている場合にタスク管理表が含まれたシートと判断しています。

タスク管理表が含まれたシートと判断された場合に、Ifの中の処理を実行します。

        Dim taskCnt As Long
        Dim compCnt As Long
        
        taskCnt = _
            WorksheetFunction.CountA(Sh.Range("A3:A10000"))
        compCnt = _
            WorksheetFunction.CountIf(Sh.Range("D3:D10000"), "完了")

全体のタスクの件数を格納する用の変数「taskCnt」と、完了したタスクの件数を格納する用の変数「compCnt」を用意し、それぞれの件数を格納しています。

全体のタスクの件数(taskCnt)に関しては、セルA3からA10000の中で値が入力されているセルの数を格納し、完了したタスクの件数(compCnt)に関しては、セルD3からD10000の中で「完了」という値が入力されているセルの数を格納しています。

        If taskCnt = compCnt Then
            Sh.Name = Sh.Range("A1").Value
        Else
            Sh.Name = Sh.Range("A1").Value & _
                "(" & (taskCnt - compCnt) & ")"
        End If

先ほど取得した全体のタスクの件数(taskCnt)と完了したタスクの件数(compCnt)が一致している場合は、未完了のタスクが存在しないとして、シート名をセルA1のプロジェクト名にしています。

一致しない場合は、未完了のタスクが存在するとして、シート名をセルA1のプロジェクト名に「(残タスク数)」という文字列を加えた名前にしています。
残タスク数は、全体のタスクの件数(taskCnt)から完了したタスクの件数(compCnt)を引くことで求めています。


3. 完成

以上の内容で実現できます。
タスク管理表が含まれるシートのいずれかのセルを編集すると同時に、そのシートのシート名に残タスク数が反映されます。
また、残タスク数が0件の場合は、残タスク数は反映されません。

▼サンプルファイル▼

2025/06/03
【Excel】数式を劇的に読みやすくする方法

【Excel】数式を劇的に読みやすくする方法

Excelで数式を使っていると、こんな経験はありませんか?

・数式の意味がすぐに分からない
・セル範囲(例:B6:B20)ばかりで、どのデータを参照しているのか見えにくい
・他の人が作った数式を読み解くのに時間がかかる

そんな時に役立つのが「テーブル」機能です。
この機能を使うだけで、数式が劇的に読みやすくなります。


テーブル機能とは

Excelの「テーブル」機能は、データ範囲に名前を付けて管理しやすくする機能です。
テーブルを活用することで、データの増減にも対応して名前を付けることができます。
さらに、テーブル名や列名を使って参照できるようになるので、数式の意味が一目で分かるようになります。

上記のような、テーブルを使った参照のことを「構造化参照」と呼びます。


テーブルに変換する方法

1.テーブルにしたい表の範囲を選択(表の中のいずれか1つのセル選択でもOK)

2.[挿入]タブから[テーブル]を選択

3.表示された以下の画面の入力範囲が表全体であることを確認(間違っている場合は直接修正)

4.表の範囲の先頭が見出しの場合は[先頭行をテーブルの見出しとして使用する]にチェックして[OK]を選択

5.テーブルを選択して[テーブルデザイン]タブから[テーブル名]を設定(例:「従業員管理」など)

ExcelVBAレベル確認

テーブルを使うと数式がこう変わる

例えば、以下のような数式があったとします。

=XLOOKUP(H3,B3:B17,E3:E17)

この数式を、テーブルの参照(構造化参照)を活用した数式にすると、以下のように書き換えられます。

XLOOKUP(H3,従業員管理[No],従業員管理[雇用形態])

このように、「どの列を参照しているのか」が明確になり、数式の意味がすぐに分かるようになります。


まとめ

Excelの「テーブル」機能を使えば、数式の可読性が格段に向上します。
特に複雑な数式や、他の人と共有するファイルでは大きな効果を発揮します。

また「テーブル」は、データが追加されると自動で範囲が拡張します。

そのため、データの増減に合わせて数式を修正する手間がなくなります。

保守がしやすい数式を目指すなら、ぜひ「テーブル」機能を活用してみてください。

2025/05/30
【ExcelVBA】選択した時のみ値が表示される!?

【ExcelVBA】選択した時のみ値が表示される!?

以下の表の「性別」と「生年月日」の項目のように、通常は「***」が表示されているが、セルを選択した時のみ、そのセルの値が表示される仕組みの実現方法について解説していきます。

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


1. 条件付き書式の活用

このような仕組みを実現するには、条件付き書式を活用します。
条件付き書式とは、指定した条件を満たしている時に、指定したセルの書式を変更するという機能になります。
今回の場合は、以下の表の「性別」と「生年月日」の項目に対して、通常は「***」を表示させ、選択時のみセルの値を表示させます。

セルの値を変えずに見た目のみを「***」にするには、表示形式を活用します。
表示形式で文字列や数値を含むセルの値を「***」にする設定は、以下になります。

"***";"***";"***";"***"

今回は、特定の条件を満たした時に、先ほどの表示形式に切り替えることによって、表示を「***」にしていきます。
その条件は以下のようになります。

「対象のセルの行番号が、現在選択しているセルの行番号と一致しない場合」もしくは「対象のセルの列番号が、現在選択しているセルの列番号と一致しない場合」

では、この条件で条件付き書式の設定をしていきます。


設定手順


1.条件付き書式を設定する対象のセルを選択(こちらでは、「性別」と「生年月日」のセル全体を選択します)

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

3.表示された画面にて、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にし、以下の条件式を入力

=OR(ROW(C2)<>CELL("row"),COLUMN(C2)<>CELL("col"))
// セルC2は現在の選択基準のセルのアドレス
// ROW(C2):対象のセルの行番号
// CELL("row"):現在選択しているセルの行番号
// → 対象のセルの行番号が、現在選択しているセルの行番号と一致しない
// COLUMN(C2):対象のセルの列番号
// CELL("col"):現在選択しているセルの列番号
// → 対象のセルの列番号が、現在選択しているセルの列番号と一致しない

4.[書式]を選択し、[表示形式]タブの[ユーザー定義]にて、以下の内容を設定して確定

"***";"***";"***";"***"

以上の設定で、選択しているセル(アクティブセル)の値のみを表示することができます。

ただ、条件付き書式の設定のみですと、セルを編集するか数式を再計算しない限り、設定が更新されません。

その理由は、CELL関数で取得される値は、数式が再計算されたタイミングに、値が更新されるためです。
そのため、対象の範囲が選択された場合は、自動で数式を再計算する仕組みを実現する必要があります。


2. 自動で数式を再計算する

今回は、セルを選択すると同時に数式を再計算させる仕組みを実現していきます。
特定のシートのセルを選択すると同時に、何かしらの処理を実行するには、該当するシートのシートモジュールを活用します。

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

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

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

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

このプロシージャの中に、「数式を再計算する」という以下の処理を記述します。

Application.Calculate

3. 完成

以上の手順で完成です。
セルを選択すると同時に、数式が再計算され、選択しているセルの値が表示されるようになります。

▼サンプルファイル▼

2025/05/27
【Excel】非表示にした範囲の値をグラフに表示させる

【Excel】非表示にした範囲の値をグラフに表示させる

こんな経験、ありませんか?
『グラフを作成した後で、参照元の表の一部を非表示にしたら、グラフの一部も消えてしまった…』

実は、ある設定を変更するだけで、非表示にした範囲の値もグラフに表示させることができるようになります。


非表示にした範囲の値をグラフに表示させる

グラフが参照元の表の表示・非表示に左右されないようにするには、「非表示の行と列のデータを表示する」という設定をONにします。


操作手順


1.対象のグラフを選択

2.[グラフのデザイン]タブから[データの選択]を選択

3.表示された画面の右下の[非表示および空白のセル]を選択

4.表示された画面の下の[非表示の行と列のデータを表示する]にチェックして確定


以上の手順で、以下のように非表示にした範囲の値に関しても、グラフに表示させることができるようになります。

2025/05/23
【ExcelVBA】入力後のセルを自動で編集不可にする

【ExcelVBA】入力後のセルを自動で編集不可にする

「入力後のセルを誤って上書きしてしまった…」そんな経験はありませんか?
今回は、一度入力したセルを自動で編集不可にする仕組みの開発方法について解説していきます。

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


1. はじめに

Excelでデータを入力した後、うっかり編集されることを防ぐ方法として、セルを自動で編集不可にする仕組みが有効です。
特に業務で扱うシートでは、入力後のデータを守る必要がある場合が多いです。今回紹介する方法を使えば、誤って編集されることなく、データの整合性を保つことができます。


2. シート側の設定

まずは、入力を許可するセルを選択し、そのセルのロック設定を解除します。
これにより、シートを保護した際に、ロックが解除されたセルのみ編集可能になります。

こちらでは、以下のシートのB列にある「受付済みID」を入力する項目に対して設定していきます。

まずは、B列全体を選択し、Ctrlキーを押しながらセルB1~B6を選択することで、一部の選択を解除します。

次に、選択範囲内で右クリックし、「セルの書式設定」を選択します。

書式設定の画面の[保護]タブを選択し、ロックのチェックを解除します。

以上で、シートの設定は完了です。
この設定を行うことで、シートを保護した際に、ロックを解除したセルだけが編集可能になります。


3. 開発準備

次に、Excel VBAを使って、セルに値を入力した後、そのセルが自動的に編集不可になるように設定します。

このように、特定のシート内の特定のセルが編集された時に処理を実行する仕組みを実現するには、「シートモジュール」を使用します。

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

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

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

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

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

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

ExcelVBAレベル確認

4. コードの記述

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Me.Protect UserInterfaceOnly:=True

    Dim r As Range
    For Each r In Target
        If r.Value <> "" Then
            r.Locked = True
        End If
    Next r
    
End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Me.Protect UserInterfaceOnly:=True

    '省略
    
End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されます。
この「Target」は後に使用します。
まず初めに、シートを保護する処理(Me.Protect)を記述しています。
「Me」は自身のシートモジュールのシート情報を指します。
また、保護する際に、「UserInterfaceOnly」の引数を「True」にすることで、シートが保護されたセルに対しても、VBAからは操作ができるようになります。

    Dim r As Range
    For Each r In Target
        If r.Value <> "" Then
            r.Locked = True
        End If
    Next r

実行時に渡される編集されたセルの情報(Target)には、複数のセルの情報が入っている可能性があります。
(コピー&ペーストなどで複数セルに同時に値を入力した場合など)
その際は、1つ1つのセルに対して、値の有無を確認し、値が入力された場合に関してのみ、セルをロックする必要があります。
そのため、「For Each」を使用して、「Target」の情報を1つ1つ繰り返して実行しています。

「For Each」から「Next」の中で、1つ1つのセルの情報(r)に対し、「If」で空でない場合のみにロックをする(r.Locked = True)という内容を記述しています。


5. 完成

以上の内容で実現できます。
B列の表に値を入力して確定すると同時に、入力されたセルが保護され編集ができなくなります。

どうしても編集したい場合は、[校閲]タブの[シート保護の解除]を選択して「シートの保護」を解除する必要があります。

解除後は、対象シートのいずれかのセルを編集すると同時に、自動でシートが保護されます。

▼サンプルファイル▼

2025/05/20
【Excel】グループ化されたセルを素早く開閉!?

【Excel】グループ化されたセルを素早く開閉!?

Excelでグループ化されたセルを操作する際に、アウトラインの小さなボタンをクリックするのって地味に面倒ですよね。

実は、アウトラインのボタンをクリックせずに、簡単にグループを開閉する方法があるので紹介していきます。


「Shift + マウスホイール」で時短

実は、グループの開閉は、Shiftキーを押しながらマウスホイールを回転させることでも行えます。

・グループを閉じる

1. グループ化されている範囲内のセルの上にカーソルを移動
2. Shiftキーを押しながらマウスホイールを下に回転

行と列のグループが交差している上記の画像のオレンジ色の範囲上で行うと、行と列、両方のグループが同時に閉じられます。

・グループを開く

1. 「+」ボタンのある行もしくは列のセルの上にカーソルを移動
2. Shiftキーを押しながらマウスホイールを上に回転

行と列のグループが交差している上記の画像のオレンジ色の範囲上で行うと、行と列、両方のグループが同時に開かれます。


まとめ

この操作を覚えておけば、もうアウトラインの小さなボタンをクリックする必要はありません。
さらに、アウトラインまでマウスカーソルを移動する必要もなくなるため、今見ているセルの位置を見失うリスクも減ります。