2025/10/28
【Excel】条件付き書式で結合した見た目にする方法

【Excel】条件付き書式で結合した見た目にする方法

以下の予定表のように、連続した予定を結合した見た目にし、背景色を色付けする「条件付き書式」の設定方法について解説していきます。


条件付き書式に設定する条件式

こちらでは、以下の表をもとに作成していきます。

まずは、どのような条件を満たしたときに、以下の書式を反映させる必要があるのか考えていきます。

① セルに色付けする
② セルの値を非表示にする
③ セルの罫線を非表示にする

①のセルの色付けに関しては、B列とC列の2列に適用する必要があります。
この該当行の2列を色付けするかどうかは、C列に値が入力されているかどうかで判断できます。
例えば、3行目の場合、以下のような条件式になります。

=$C3<>""
// C列で固定のため、Cの手前に「$」を指定

次、②のセルの値を非表示にすることに関しては、C列のみに適用する必要があります。
C列の対象のセルの値を非表示にするかどうかは、1つ前の値と同じかどうかで判断できます。
例えば、3行目のC列の場合、以下のような条件式になります。

=C3=C2
// C列のみのため、Cを「$」で固定しなくてもよい

さらに、セルが空の場合は、非表示にする必要はないので、「空でない場合」という条件を加えます。
例えば、3行目のC列の場合、以下のような条件式になります。

=AND(C3<>"",C3=C2)
// ANDで2つの条件式を指定

最後、③のセルの罫線を非表示にすることに関しては、②と同様にC列のみに適用する必要があります。
また、条件式に関しても②と同様で、②の条件を満たしたときに、そのセルの上の罫線を非表示にします。


条件付き書式の設定

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

① セルに色付けする(B列とC列):=$C3<>””
② セルの値を非表示にする(C列):=AND(C3<>””,C3=C2)
③ セルの罫線を非表示にする(C列):=AND(C3<>””,C3=C2)

まずは、①のセルに色付けする対象の範囲(見出しを除いた範囲全体)を選択します。
この時、選択基準のセル(アクティブセル)は、以下のように、3行目になるようにします。

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

入力する数式は、アクティブセルに対しての数式になります。
上記では、セルB3がアクティブセルのため、セルB3に対しての以下の条件式を入力しています。

=$C3<>""

他の選択範囲には相対参照(「$」で固定された列または行を除く)で反映されます。
そのため、上記の設定内容で確定することで、以下のように予定のある行を色付けすることができます。

次は、②のセルの値を非表示にする対象の範囲(見出しを除いたC列全体)を選択します。
この時、選択基準のセル(アクティブセル)は、以下のように、セルC3になるようにします。

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

入力する数式は、アクティブセルに対しての数式になります。
上記では、セルC3がアクティブセルのため、セルC3に対しての以下の条件式を入力しています。

=AND(C3<>"",C3=C2)

また、③のセルの罫線を非表示する範囲と条件式に関しても、②と同様になるので、「セルの書式設定」の画面で「セルの罫線を非表示にする設定」を行います。
条件を満たしたときに非表示にする罫線は、セルの上の罫線になるため、以下のように設定します。

上の罫線を2回クリックすることで、非表示にできます。

上記の設定内容で確定することで完成です。
以下のように、連続した予定を結合した見た目にし、背景色を色付けすることができます。

2025/10/24
【ExcelVBA】予定表を1週間単位で表示

【ExcelVBA】予定表を1週間単位で表示

以下の予定表は、セルC2に配置されたスピンボタンを押すことで、1週間単位で表示する日付を切り替えることができます。

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

こちらは、実際の値が置き換わっている訳ではなく、対象の週以外の列が非表示になっています。

そのため、表示されているセルに直接値を入力しても問題ございません。

今回は、上記のように、スピンボタンで表示する列を一定間隔で切り替える仕組みを実現していきます。


1. スピンボタンの用意

今回は、以下のすべての列が表示されている予定表から作成していきます。

まずは、スピンボタンを用意します。
スピンボタンは、[開発]タブの中の[挿入]から[スピンボタン]を選択することで、好みの位置に配置することができます。

スピンボタンの用意ができたら、スピンボタンの上で右クリックし、[コントロールの書式設定]を選択します。

[コントロールの書式設定]にて、以下のように設定します。

スピンボタンで指定した数値が、予定表の表示する週になります。
[最大値]を50にすると、最大50週目までしか表示できなくなります。
そのため、必要に応じて[最大値]は修正してください。

[リンクするセル]は、スピンボタンの現在値を表示させるセルになります。
こちらでは、スピンボタンの隣のセルB2を指定しています。


2. 開発準備

次は、スピンボタンをクリックすると同時に、予定表の週の表示を切り替える仕組みを実現します。
そのためには、VBAを活用します。

スピンボタンに連動する機能を開発する必要があるため、スピンボタンの上で右クリックし、[マクロの登録]を選択します。

[マクロの登録]の画面にて、開発する機能の名前を入力し、[新規作成]を選択します。
こちらでは、「表示切替」と入力しています。

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


3. コードの記述(列の表示切り替え)

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

Sub 表示切替()

    Dim no As Long
    no = Range("B2").Value
    
    Columns("D:MY").Hidden = True
    Range( _
        Columns(no * 7 - 3), _
        Columns(no * 7 + 3)).Hidden = False
        
End Sub

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

    Dim no As Long
    no = Range("B2").Value

「no」という整数(Long)専用の変数(入れ物)を用意し、その「no」にセルB2の値(表示する週を表す数値)を格納しています。

    Columns("D:MY").Hidden = True

予定表の日付の列全体を非表示にしています。

    Range( _
        Columns(no * 7 - 3), _
        Columns(no * 7 + 3)).Hidden = False

「no」の値から対象の週を指定し、対象の週の列を表示しています。

「no」が1のときは、1週目である4列目から10列目を表示し、
「no」が2のときは、2週目である11列目から17列目を表示します。
この関係性を「no」を用いた数式で表すと、「no * 7 – 3」列目から「no * 7 + 3」列目になります。

そのため、「Range」で「Columns(no * 7 – 3)」から「Columns(no * 7 + 3)」と対象の列の範囲を指定しています。

ExcelVBAレベル確認

4. 完成

以上の手順で完成です。
スピンボタンを押すことで、対象の週のみが表示されるようになります。

▼サンプルファイル▼

2025/10/21
【Excel】重複した値の先頭以外をマーク

【Excel】重複した値の先頭以外をマーク

以下のように、ある一覧の重複した値の先頭以外に「不要」と表示させる方法について解説していきます。


1. 重複の有無を確認する

まずは、重複しているかどうかを確認していきます。
今回は、COUNTIF関数を活用して、対象の名前までの範囲に、対象の名前が何件存在しているのかを表示させることで、重複しているかどうかを確認します。
そのため、一覧表の隣の列の先頭に、以下の数式を入力します。

=COUNTIF($B$3:B3,B3)
// 集計対象の範囲:$B$3:B3 
// (下の行にコピーしたときに徐々に範囲が拡張するように、先頭のセルを「$」で固定する)
// 集計対象の値:B3

表の末尾までコピーすると、以下のようになります。

表示された数値が2以上の場合、2回目以降の登場という意味になるため、先頭以外の重複した値と判断できます。
要するに、2以上の値が「不要」と表示させる対象になります。


2. 重複した値の先頭以外に「不要」と表示させる

次は、1は非表示に、2以上に「不要」と表示させます。
そのためには、以下のようにIF関数を加えます。

=IF(COUNTIF($B$3:B3,B3)>1,"不要","")
// 条件:COUNTIF($B$3:B3,B3)>1
// 条件を満たしたときに表示する値:"不要"
// 条件を満たしていないときに表示する値:""(空)

表の末尾までコピーすると、以下のようになります。

これで完成です。

2025/10/17
【ExcelVBA】複数フォルダを一括作成

【ExcelVBA】複数フォルダを一括作成

シート上の表の内容をもとに、データ数分のフォルダを一括で作成する仕組みを実現していきます。

こちらでは、以下のように、生徒一覧表の内容をもとに「No_氏名」という名前のフォルダを一括で作成する仕組みを実現していきます。

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


1. 開発準備

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

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

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


2. コードの記述(フォルダ一括作成)

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

Sub GenerateFolders()
    
    Dim i As Long
    For i = 3 To 32
        '保存先のフォルダのパスを貼り付けて「\」を追加
        MkDir "A:\出力\" & _
            Cells(i, "B").Value & "_" & _
            Cells(i, "C").Value
    Next i
    
End Sub

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

    Dim i As Long
    For i = 3 To 32
        '省略
    Next i

表の1行1行を繰り返す際に使用する変数(i)を用意し、「For」で変数(i)を3~32までを繰り返して実行します。

3~32という数値は、フォルダを作成する対象のデータが入力されている行の範囲になります。

        '保存先のフォルダのパスを貼り付けて「\」を追加
        MkDir "A:\出力\" & _
            Cells(i, "B").Value & "_" & _
            Cells(i, "C").Value

「MkDir」の後に作成したいフォルダのパスを指定することで、フォルダを作成できます。

今回作成するフォルダの位置は、「Aドライブの中の出力フォルダの中」になるので、先頭に「”A:\出力\”」とパスを指定しています。

その後には、作成するフォルダの名前をセルの値を用いて指定しています。
「Cells(i, “B”).Value」で繰り返し処理で使用している変数(i)の値の行にあるB列の値(No)を取得し、「& “_”」で「_」を加え、「& Cells(i, “C”).Value」で変数(i)の値の行にあるC列の値(氏名)を加えています。
※「 _」は1つのコードを改行するときに指定します。


3. 完成

以上の手順で完成です。
作成したコードを指定して実行することで、瞬時にフォルダが作成されます。


4. 補足(Noを「0埋め2桁表記」にする)

作成するフォルダ名の先頭のNoを「0埋めの2桁表記」にしたい場合は、以下のように、「Format」を活用することで実現できます。

        MkDir "A:\出力\" & _
            Format(Cells(i, "B").Value, "00") & "_" & _
            Cells(i, "C").Value

「Format」についての詳しい解説は省略しますが、ワークシート上の「TEXT関数」とほぼ同じようなものです。

上記の内容に書き換えて実行すると、以下のように、Noを「0埋め2桁表記」で作成できます。

▼サンプルファイル▼

2025/10/14
【Excel】チェックしたデータを別シートに抽出

【Excel】チェックしたデータを別シートに抽出

以下のように、A列に用意されているチェックボックスにチェックするだけで、チェックしたデータが別シートに抽出される仕組みの実現方法について解説していきます。

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


1. チェックボックスの用意

まずは、抽出元シートのA列にチェックボックスを用意します。

A列のチェックボックスを作成したい範囲を選択し、[挿入]タブの中の[チェックボックス]を選択します。

これだけで、チェックボックスを作成することができます。

[データ]タブの中に[チェックボックス]という項目がない場合は、以下の記事を参考にして、チェックボックスを作成してください。
>チェックボックスの作成方法

チェックボックスが配置されているセルには、TRUE/FALSEという値が入力されています。


2. チェックしたデータの抽出

次は、チェックしたデータを抽出します。

指定した範囲のデータから指定した条件を満たしたデータを抽出するには、FILTER関数が便利です。
抽出先のシートに、以下のような数式を入力します。
※抽出元の表は、「商品一覧」シートに用意しています。

=FILTER(商品一覧!B2:E1000,商品一覧!A2:A1000=TRUE,"")
// 商品一覧!B2:E1000:抽出対象の表の範囲
// 商品一覧!A2:A1000=TRUE:抽出条件(A2:A1000の中でTRUEのデータを抽出)

ちなみに、抽出元の表のA列に、TRUE/FALSE以外(空白セルを除く)の値が入力されていない場合は、以下のように「=TRUE」を省略することもできます。

=FILTER(商品一覧!B2:E1000,商品一覧!A2:A1000,"")

3. 完成

以上の手順で完成です。
抽出元の表のA列をクリックし、チェックボックスにチェックすることで、チェックしたデータのみが別シートに抽出されます。

抽出される順番は、チェックした順番ではなく、抽出元の表の先頭からの順番で抽出されます。

▼サンプルファイル▼

※Excelのバージョンが新しいチェックボックスなどに対応していない場合は、正しく表示されません。

2025/10/10
【ExcelVBA】双方向の入力を実現する方法

【ExcelVBA】双方向の入力を実現する方法

以下の書類フォーマットは、書類の中に直接入力することも、書類の下の表に入力して書類の中に反映させることもできます。

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

このような、双方向からの入力を実現する方法について解説していきます。

ExcelVBAレベル確認

1. 開発準備

今回は、予め指定したセルに値を入力すると同時に、そのセルに紐づいた別のセルにも同じ値を入力する仕組みを作っていきます。

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

選択すると、以下のエディタ画面(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)
    
    Application.EnableEvents = False
    
    Select Case Target.Address(False, False)
        Case "F3"
            Range("D14").Value = Target.Value
        Case "F4"
            Range("D15").Value = Target.Value
        Case "B4"
            Range("D16").Value = Target.Value
        Case "D6"
            Range("D17").Value = Target.Value
        Case "C7"
            Range("D18").Value = Target.Value
        Case "D14"
            Range("F3").Value = Target.Value
        Case  "D15"
            Range("F4").Value = Target.Value
        Case "D16"
            Range("B4").Value = Target.Value
        Case "D17"
            Range("D6").Value = Target.Value
        Case "D18"
            Range("C7").Value = Target.Value
    End Select
    
    Application.EnableEvents = True
    
End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Application.EnableEvents = False
    
    '省略
    
    Application.EnableEvents = True
    
End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されます。
そのセルの情報を用いて、双方向での入力を実現するのですが、処理の中で別のセルの値を編集してしまうと、再度「Worksheet_Change」が実行されてしまい無限ループになってしまいます。
そのため、処理の前後に、イベントを無効化する処理(Application.EnableEvents = False ~ Application.EnableEvents = True)を記述しています。

    Select Case Target.Address(False, False)
        Case "F3"
            Range("D14").Value = Target.Value
        Case "F4"
            Range("D15").Value = Target.Value
        Case "B4"
            Range("D16").Value = Target.Value
        Case "D6"
            Range("D17").Value = Target.Value
        Case "C7"
            Range("D18").Value = Target.Value
        Case "D14"
            Range("F3").Value = Target.Value
        Case  "D15"
            Range("F4").Value = Target.Value
        Case "D16"
            Range("B4").Value = Target.Value
        Case "D17"
            Range("D6").Value = Target.Value
        Case "D18"
            Range("C7").Value = Target.Value
    End Select

編集されたセルのアドレスから、双方向の入力をする対象のセルかどうかを判断し、対象のセルの場合は、紐づいているセルにも同じ値を入力しています。

「Target.Address(False, False)」で編集されたセルのアドレスを相対参照の形式で取得し、そのアドレスが「F3」の場合は、セルD14にも同じ値を入力、「F4」の場合は、セルD15にも同じ値を入力と、必要な組み合わせ分記述しています。


3. 完成

以上の内容で実現できます。
予め指定したセルに関しては、値を入力すると同時に、紐づいたセルにも同じ値が入力されます。

▼サンプルファイル▼

今回は、1つ1つのセルごとに割り当てましたが、表などで双方向の入力を実現する場合は、以下のように記述した方がよいです。

(例)以下の表①に入力したら表②にも反映、表②に入力したら表①にも反映させる

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Application.EnableEvents = False
    
    If Target.Row >= 3 And Target.Row <= 10 Then
        
        If Target.Column >= 2 And Target.Column <= 3 Then
            Cells(Target.Row, Target.Column + 3).Value = Target.Value
        End If
        
        If Target.Column >= 5 And Target.Column <= 6 Then
            Cells(Target.Row, Target.Column - 3).Value = Target.Value
        End If
        
    End If

    Application.EnableEvents = True
    
End Sub

こちらのコードについての詳しい解説は省略します。

2025/10/07
【Excel】FILTER関数1つで離れている項目を抽出

【Excel】FILTER関数1つで離れている項目を抽出

FILTER関数は、表から指定した条件を満たしたデータのみを抽出する関数です。
表の中の連続した項目を抽出する場合は、以下のように抽出することができます。

(例)「雇用形態」が「アルバイト」の「氏名・雇用形態・所属部署」を抽出

=FILTER(B:D,C:C="アルバイト","")

しかし、離れている項目の場合、以下のように、項目ごとにFILTER関数を入力して抽出している方も少なくないかと思います。

(例)「雇用形態」が「アルバイト」の「氏名・入社日」を抽出

=FILTER(B:B,C:C="アルバイト","")
=FILTER(F:F,C:C="アルバイト","")

もちろん、このままでも抽出はできますが、以下のようなデメリットがあります。

・抽出条件や抽出項目が変わった時に、項目ごとの数式を1つ1つ修正する必要がある
・FILTER関数2つ分の計算処理が必要なため、表のサイズによってはファイルの動きが遅くなる

ということで、こちらでは、FILTER関数1つで離れている項目を抽出する方法について解説していきます。


離れている項目を指定する

連続した項目の場合は、以下のように「:」で範囲を一括で指定することができます。

=FILTER(B:D,C:C="アルバイト","")

しかし、離れている項目の場合、「:」だけで範囲を選択することができません。
そんな時は、HSTACK関数を組み合わせます。
HSTACK関数では、以下のように、指定した複数の範囲を水平方向に繋げることができます。

(例)「氏名・入社日」を先頭から6件抽出

=HSTACK(B2:B7,F2:F7)

そのため、HSTACK関数を使って、以下のような数式にすることで、連続した項目を1つの数式のみで抽出することができます。

(例)「雇用形態」が「アルバイト」の「氏名・入社日」を抽出

=FILTER(HSTACK(B:B,F:F),C:C="アルバイト","")

まとめ

今回のように、1つの数式にすることで、以下の欠点が解消されます。

・抽出条件や抽出項目が変わった時に、項目ごとの数式を1つ1つ修正する必要がある
・FILTER関数2つ分の計算処理が必要なため、表のサイズによってはファイルの動きが遅くなる

しかし、今回の方法の場合、列を挿入すると、以下のように見出しとデータがずれてしまう可能性があります。

そのため、項目数が多い場合などは、見出し自体も数式で抽出するなどと対策すると良いです。

2025/10/03
【Excel】指定した期間の営業日数を求める

【Excel】指定した期間の営業日数を求める

固定曜日休みや休日(祝日など)を考慮した、指定した期間の営業日数を求める方法について解説していきます。


指定した期間の営業日数を求める

指定した期間の営業日数を求める場合は、NETWORKDAYS.INTL関数が便利です。

以下の表で営業日数(赤枠)を求めていきます。
休日を考慮する場合は、予め休日一覧表を用意する必要があります。

赤枠の先頭に、以下のような数式を入力します。

=NETWORKDAYS.INTL(B2,C2,1,休日一覧!$B$2:$B$100)
// B2:開始日
// C2:終了日
// 1:固定曜日休み(土日)
// 休日一覧!$B$2:$B$100:休日一覧表の日付の範囲(絶対参照)

固定曜日休みに関しては、以下の候補から選択することができます。

候補以外の組み合わせを指定する方法については、後半で解説します。

休日一覧表の範囲は、必ず日付が入力されているセル(空白セルを除く)のみにする必要があります。
休日一覧表に見出しが用意されている場合で、見出しを含む範囲を指定してしまうと、以下のようにエラーになってしまいます。

また、入力した数式を複数の範囲にコピーする場合は、休日一覧表の範囲を「$」を加えた絶対参照にする必要があります。

休日一覧!$B$2:$B$100

以上の内容を踏まえて、先ほどの数式を入力することで、以下のように営業日数を求めることができます。

他の行に関しても、数式をコピーするだけで営業日数を求めることができます。

ExcelVBAレベル確認

候補にない固定曜日休みを指定する

候補にない固定曜日休みを指定するには、直接指定する必要があります。
直接指定する方法は、以下になります。

(例)月水金を固定休みとする場合

=NETWORKDAYS.INTL(B2,C2,"1010100",休日一覧!$B$2:$B$100)

先頭を月曜日、休みの曜日を「0」、営業日を「1」として、日曜日まで数字を並べて指定します。
上記の数式を入力することで、月水金を固定休みとした営業日数を求めることができます。

ExcelVBAレベル確認

補足

NETWORKDAYS.INTL関数に似た関数で、NETWORKDAYS関数というものがあります。
NETWORKDAYS関数では、土日固定休みと休日を考慮した営業日数しか求めることができません。
固定曜日休みを指定する引数がないため、NETWORKDAYS.INTL関数を覚えていた方が、活用の幅が広がります。

2025/09/30
【Excel】最初に覚えるべき集計関数(7選)

【Excel】最初に覚えるべき集計関数(7選)

Excelを活用する際に、最初に覚えておくべき集計するための関数を7個紹介していきます。


1. SUM:数値の合計を求める

指定した範囲内の数値の合計を求める場合は、SUM関数を使います。

=SUM(B2:C7)

指定した範囲内に文字列を含んでいたとしても、集計することができます。
離れている範囲を指定する場合は、以下のようにカンマ区切りで指定します。

=SUM(B2:C3,B6:C7,D9)
ExcelVBAレベル確認

2. COUNT:数値が入力されているセルの数を求める

指定した範囲内の数値が入力されているセルの数を求める場合は、COUNT関数を使います。

=COUNT(B2:C7)

離れている範囲を指定する場合は、以下のようにカンマ区切りで指定します。

=COUNT(B2:C3,B6:C7,D9)

3. COUNTA:何かしらの値が入力されているセルの数を求める

指定した範囲内の何かしらの値が入力されているセルの数を求める場合は、COUNTA関数を使います。

=COUNTA(B2:C7)

離れている範囲を指定する場合は、以下のようにカンマ区切りで指定します。

=COUNTA(B2:C3,B6:C7,D9)

4. SUMIF:特定の条件を満たした数値の合計を求める

指定した範囲内で特定の条件を満たしている数値の合計を求める場合は、SUMIF関数を使います。

=SUMIF(B2:B7,"A",C2:C7)
// B2:B7:条件を確認する項目
// "A":上記で指定した項目で集計する対象
// C2:C7:合計する項目

条件には、以下のような条件を指定することもできます。

・"A":Aである
・"*A":Aで終わる
・"A*":Aで始まる
・"*A*":Aを含む
・"<>A":Aでない
・">5":5より大きい
・">=5":5以上
・"<5":5より小さい
・"<=5":5以下
ExcelVBAレベル確認

5. COUNTIF:特定の条件を満たしたセルの数を求める

指定した範囲内で特定の条件を満たしているセルの数を求める場合は、COUNTIF関数を使います。

=COUNTIF(B2:C7,"A")
// B2:C7:条件を確認する範囲
// "A":上記で指定した範囲で数える対象

SUMIF関数と同様に、色んな条件(「含む」や「より大きい」など)を指定することができます。

ExcelVBAレベル確認

6. SUMIFS:複数の条件を満たした数値の合計を求める

指定した範囲内で複数の条件を満たしている数値の合計を求める場合は、SUMIFS関数を使います。

=SUMIFS(D2:D7,B2:B7,"A",C2:C7,"B")
// D2:D7:合計する項目
// B2:B7:1つ目の条件を確認する項目
// "A":1つ目に指定した項目で集計する対象
// C2:C7:2つ目の条件を確認する項目
// "B":2つ目に指定した項目で集計する対象

SUMIF関数と同様に、色んな条件(「含む」や「より大きい」など)を指定することができます。

以下のように、3つ以上の条件を指定することもできます。

=SUMIFS(E2:E7,B2:B7,"A",C2:C7,"B",D2:D7,">10")

7. COUNTIFS:複数の条件を満たしたデータの数を求める

指定した範囲内で複数の条件を満たしているデータの数を求める場合は、COUNTIFS関数を使います。

=COUNTIFS(B2:B7,"A",C2:C7,"B")
// B2:B7:1つ目の条件を確認する項目
// "A":1つ目に指定した項目で数える対象
// C2:C7:2つ目の条件を確認する項目
// "B":2つ目に指定した項目で数える対象

SUMIF関数と同様に、色んな条件(「含む」や「より大きい」など)を指定することができます。

以下のように、3つ以上の条件を指定することもできます。

=COUNTIFS(B2:B7,"A",C2:C7,"B",D2:D7,">10")

まとめ

以上の7個の関数を知っているだけで、集計の幅が広がるため、ぜひ覚えるとよいです。

2025/09/26
【Excel】表の入力必須項目を自動色付け(入力後は解除)

【Excel】表の入力必須項目を自動色付け(入力後は解除)

以下の表の「*」が付いた項目を入力必須項目とします。

上記の画像には入力漏れがあります。
しかし、ぱっと見では、どこが漏れているのかが分かりづらいです。

ということで今回は、以下のように、データが入力されている行に対して、入力必須項目が未入力の場合に、自動で色付けする設定方法について解説していきます。

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


入力必須項目が未入力の場合に色付け

特定の条件を満たしているセルを自動で色付けするには、条件付き書式を活用します。
まずは、入力必須項目の見出しを除く列全体を選択し、[ホーム]タブの中の[条件付き書式]から[新しいルール]を選択します。

次に、選択したセルが空白かどうかで色付けするかどうかを判断していきます。
その際は、設定画面で[ルールの種類]を[指定の値を含むセルだけを書式設定]にし、[次のセルのみを書式設定]を[空白]にします。

次に、[書式]を選択し、書式設定の画面の[塗りつぶし]タブから好みの色を選択します。

後は確定するだけで、以下のように、対象の項目の空白セルが色付けされます。

しかし、このままですと、データが存在していない行(12行目以降)も色付けされてしまいます。
いずれかの項目に値が入力されている場合のみに色付けするには、次の手順を行います。


いずれかの項目に値が入力されている場合のみに色付け

いずれかの項目に値が入力されている場合のみに色付けするためには、「いずれかの項目に値が入力されているかどうかを判定する条件」を加える必要があります。

今回の表の場合、数式が入力されている列が含まれないため、1つのデータ行の値の数をCOUNTA関数で数えて、その数が0よりも大きいかどうかで判定することができます。

では一度、先ほどの条件付き書式の設定を削除します。

次に、対象のセルを選択して、[新しいルール]を選択します。

設定画面が表示されましたら、以下の条件を設定していきます。

対象のセルが空白、かつ、対象行のいずれかのデータが入力されている

このような複雑な設定を行うには、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にします。

表示されたテキストボックスに、選択基準のセルに対する条件式を入力します。
こちらの場合は、選択基準のセルがF2になるため、セルF2に対する以下のような条件式を入力します。

=AND(F2="",COUNTA(A2:G2)>0)
// F2="":セルF2が空の場合
// COUNTA(A2:G2)>0:該当行のいずれかの項目に値が入力されている場合
// AND(…):指定した複数条件のすべてを満たしている場合

ただ、ここで設定した条件式は、他の選択範囲にも相対的に反映されます。
そのため、他のセルに反映されるときに変わってほしくない参照範囲は、予め「$」を加えて固定しておく必要があります。

こちらの場合は、表の列をA~G列で固定したいので、以下のように「$」を加えます。

=AND(F2="",COUNTA($A2:$G2)>0)

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

後は確定するだけで完成です。

以上の設定で、データが存在する行の入力必須項目で、未入力のセルのみが色付けされます。

▼サンプルファイル▼

2025/09/23
【Excel】海外資料を数式でサクッと翻訳

【Excel】海外資料を数式でサクッと翻訳

海外の企業から送られてくる資料などでは、以下のように英語で書かれていることがあります。

英語に慣れていない場合は、内容を読むのに苦戦します。
今回は、そんな時に使える翻訳する関数について解説していきます。


TRANSLATE関数

翻訳する関数、それはTRANSLATE関数です。
以下のように、対象の文字列、翻訳前と翻訳後の言語を指定します。

=TRANSLATE(B4,"en","ja")
// B4:対象の文字列
// "en":翻訳前の言語(英語)
// "ja":翻訳後の言語(日本語)

言語はリストから選択することができます。

上記の数式を入力するだけで、以下のように翻訳された結果が表示されます。

後は、他のセルにもコピーするだけで、全体を翻訳することができます。

※「2024/7/1」に対応した値を表示するセルには、表示形式を設定していないため、シリアル値(45474)が表示されています。

ただ直訳になるため、「Status」が「地位」のように、本来とは異なる翻訳がされることもあります。

他の言語にも翻訳することができるので、海外の企業に資料を共有する際にも活用できます。

=TRANSLATE(B4,"en","th")
// 英語をタイ語に翻訳
2025/09/19
【ExcelVBA】チェックボックスを動的に入力(一括チェック)

【ExcelVBA】チェックボックスを動的に入力(一括チェック)

以下の表は、各作業に対して「A~C」のクラスを割り当てる表です。
「A~C」にはチェックボックスが用意されており、それとは別に、「A~C」を一括でチェックする用のチェックボックス「全」も用意されています。

チェックボックスの作成方法は、以下の記事を参考にしてください。
>チェックボックスの作成方法

この「全」と「A~C」のチェックボックスは連動しており、以下のように動作します。


・「全」をチェック

・A~Cをすべてチェック

・「全」を外す


このような、動的なチェックボックスの作成方法について解説していきます。

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


1. 開発準備

今回は、特定のチェックボックスを操作すると同時に、他のチェックボックスも操作するという仕組みを作っていきます。

チェックボックスが配置されたセルには、TRUEもしくは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)

    Dim r As Range: Set r = Target

    If r.CountLarge = 1 And _
        r.Row >= 4 And r.Row <= 23 And _
        r.Column >= 3 And r.Column <= 6 Then
        
        Application.EnableEvents = False
        
        Dim r1 As Range: Set r1 = Cells(r.Row, "C")
        Dim r2 As Range: Set r2 = Cells(r.Row, "D")
        Dim r3 As Range: Set r3 = Cells(r.Row, "E")
        Dim r4 As Range: Set r4 = Cells(r.Row, "F")
        
        If r.Column = 3 Then
            If r.Value Then
                Range(r2, r4).Value = True
            Else
                Range(r2, r4).Value = False
            End If
        Else
            If r2 And r3 And r4 Then
                r1.Value = True
            Else
                r1.Value = False
            End If
        End If
        
        Application.EnableEvents = True
        
    End If

End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim r As Range: Set r = Target

    If r.CountLarge = 1 And _
        r.Row >= 4 And r.Row <= 23 And _
        r.Column >= 3 And r.Column <= 6 Then
        
        Application.EnableEvents = False
        
        '省略
        
        Application.EnableEvents = True
        
    End If

End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが編集されたかどうかを確認しています。

まずは、入れ物(変数)「r」を用意し、そこにTargetの情報を割り当てています。

次に、編集されたセルが1つ(r.CountLarge = 1)で、行番号が4以上23以下(r.Row >= 4 And r.Row <= 23)、尚且つ、列番号が3以上6以下(r.Column >= 3 And r.Column <= 6)であることを確認しています。
こちらは、「チェックボックスが配置されている範囲内のセルが、単体で編集された場合」という条件になります。

この条件を満たした場合に、Ifの中の処理を実行します。
Ifの中では、他のチェックボックスを操作する可能性があります。
チェックボックスが操作されると、「Worksheet_Change」の処理が再度実行されてしまい無限ループになってしまう恐れがあります。
そのため、Ifの処理の中では、イベントを無効化する処理(Application.EnableEvents = False ~ Application.EnableEvents = True)を記述しています。

        Dim r1 As Range: Set r1 = Cells(r.Row, "C")
        Dim r2 As Range: Set r2 = Cells(r.Row, "D")
        Dim r3 As Range: Set r3 = Cells(r.Row, "E")
        Dim r4 As Range: Set r4 = Cells(r.Row, "F")
        
        If r.Column = 3 Then
            If r.Value Then
                Range(r2, r4).Value = True
            Else
                Range(r2, r4).Value = False
            End If
        Else
            If r2 And r3 And r4 Then
                r1.Value = True
            Else
                r1.Value = False
            End If
        End If

次に、操作されたセルと同じ行にあるチェックボックスのセルの情報を入れ物(変数)「r1~r4」に割り当てています。
そして、操作されたセルの列番号が3の場合とそれ以外の場合で、処理を分岐しています。

操作されたセルの列番号が3の場合は、「全」のチェックボックスが操作されたときになります。
そのため、「全」がチェックされている場合は、「A~C」のチェックボックスすべてをチェックし、「全」がチェックされていない場合は、「A~C」のチェックボックスすべてのチェックを外しています。
「A~C」のチェックボックスが配置されたセルは、連続したセルになっています。
そのため、「A」のチェックボックスのセルから「C」のチェックボックスのセルまでということで、「Range(r2, r4)」と範囲指定することができます。

ちなみに、以下の該当する処理に関しては、1行で表現することもできます。

            If r.Value Then
                Range(r2, r4).Value = True
            Else
                Range(r2, r4).Value = False
            End If

            Range(r2, r4).Value = r.Value

操作されたセルの列番号が3でない場合は、「A~C」のチェックボックスのいずれかが操作されたときになります。
そのため、「A~C」のチェックの有無を確認し、すべてがチェックされているときのみ、「全」をチェックし、それ以外は、「全」のチェックを外しています。

ちなみに、以下の該当する処理に関しても、1行で表現することができます。

            If r2 And r3 And r4 Then
                r1.Value = True
            Else
                r1.Value = False
            End If

            r1.Value = r2 And r3 And r4

3. 完成

以上の内容で実現できます。
「全」と「A~C」のチェックボックスが連動するようになります。


・「全」をチェック

・A~Cをすべてチェック

・「全」を外す


▼サンプルファイル▼