2023/10/12
【Excel】FILTER関数で離れている列を抽出

【Excel】FILTER関数で離れている列を抽出

FILTER関数では、指定した表から指定した条件を満たしたデータのみを抽出することができます。
FILTER関数の使い方は以下の通りです。

=FILTER(配列, 含む, [空の場合])
// 指定した配列から指定の条件を満たすデータのみを抽出する
// [空の場合]は条件を満たすデータが見つからない場合に表示する内容

ただ、表の指定は通常であれば「開始セル:終了セル」というような指定になり、離れている項目のみを指定することができません。
例えば、以下の表から性別が”女”のデータのみを抽出する場合、以下の数式で実現ができます。

=FILTER(B3:E12,D3:D12="女","")

こちらの場合は、すべての項目を抽出しています。
表の範囲の指定は、「B3:E12」の部分になります。

このように「開始セル:終了セル」と指定しているため、特定の項目(例えば、”氏名”と”生年月日”)のみを抽出ということが難しいです。

“氏名”と”生年月日”のみを抽出する際に、考えられる方法の1つとして、複数の数式を扱うという方法があります。
以下のイメージになります。

=FILTER(C3:C12,D3:D12="女","")
=FILTER(E3:E12,D3:D12="女","")

ただ、この方法の場合、複数の項目になると同時に、数式が増えてメンテナンスが大変になります。

そこで、上記のような離れている項目を抽出するには、次の方法がオススメです。


それは、FILTER関数を用いて必要な項目を抽出した上で、FILTER関数で絞り込むという方法です。

FILTER関数は横向きの表にも活用することができます。
また、条件式は「要素の数分のTRUEもしくはFALSE」である必要があります。

例えば、「D3:D12=”女”」という式を使わずに直接指定する場合は以下のようになります。

=FILTER(C3:C12,{TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE;FALSE},"")
// 要素を直接指定する場合は、"{"と"}"で囲み、行を表す場合は「;」、列を表す場合は「,」を用いる

また、TRUEとFALSEは「0」や「1」などの数値でも表現することができます。

詳しくはこちら(FILTER関数で複数条件指定)をご確認ください。


先ほどの数式を数値で表現すると以下のようになります。

=FILTER(C3:C12,{1;0;1;1;0;1;0;1;0;0},"")

この数式と同じように、特定の項目(例えば、”氏名”と”生年月日”)のみを抽出したい場合は以下のように表現できます。

=FILTER(B3:E12,{0,1,0,1},"")
// 列に対しての抽出条件を指定する必要があるため、「{0,1,0,1}」と「,」区切りで表現
// 「{0,1,0,1}」は、先頭から抽出したい項目の位置を「1」としている

この数式をFILTER関数の引数「配列」に代入して、抽出条件を外側のFILTER関数の引数に指定することで、1箇所のセルのみの数式で表現することができます。

=FILTER(FILTER(B3:E12,{0,1,0,1}),D3:D12="女","")
// 列の抽出では対象が必ず存在するため、引数の[空の場合]を省略している

また、FILTER関数の順番を逆にしても実現することができます。

=FILTER(FILTER(B3:E12,D3:D12="女",""),{0,1,0,1},"")

ただ、後者の方法の場合、内側のFILTER関数で対象が見つからない場合、外側のFILTER関数では、必ずエラーになってしまいます。

このことを考慮すると、以下の前者の方法で実現するのが良いです。

=FILTER(FILTER(B3:E12,{0,1,0,1}),D3:D12="女","")

メンテナンスのことを考慮すると、数式が増えすぎるのは良くないです。
そのため、今回の方法のように簡単にまとめられる場合は、まとめた方が良いです。

2023/10/06
【Excel】新関数で文字を抽出

【Excel】新関数で文字を抽出

以下の新関数を用いた文字を抽出する方法について解説していきます。

=TEXTBEFORE(対象の文字, 区切り文字)
// 対象の文字を、指定した区切り文字までの左側の文字を返す
// 指定した区切り文字が複数ある場合は、先頭にある区切り文字が基準になる
// 指定した区切り文字が存在しない場合は、エラー(#N/A)を返す
=TEXTAFTER(対象の文字, 区切り文字)
// 対象の文字を、指定した区切り文字以降の右側の文字を返す
// 指定した区切り文字が複数ある場合は、先頭にある区切り文字が基準になる
// 指定した区切り文字が存在しない場合は、エラー(#N/A)を返す

新関数を用いた文字の抽出方法

これらの関数を用いることで、特定の文字(半角スペース)で姓と名が区切られた名前を、別のセルに、姓と名で分けることができます。

=TEXTBEFORE(B4," ")
=TEXTAFTER(B4," ")

ちなみに、このように複数行に抽出したい場合は、それぞれの関数の第一引数(対象の文字)に複数の範囲を指定することで、スピルを用いて一括で抽出できます。

>スピルとは

=TEXTBEFORE(B4:B7," ")
=TEXTAFTER(B4:B7," ")

異なる区切り文字の場合

では、以下のように姓と名の値に半角スペースと全角スペースなど、異なる区切り文字が存在する場合、どのように抽出するのでしょうか。

実は、TEXTBEFORE関数やTEXTAFTER関数だけで、関数を組み合わせずに実現することができます。

実現方法は以下になります。

=TEXTBEFORE(B4:B7,{" "," "})
=TEXTAFTER(B4:B7,{" "," "})

複数の区切り文字が存在する場合は、”{}”を用いて、複数の区切り文字をカンマ(,)もしくはセミコロン(;)区切りで指定することができます。

“{}”で囲ったカンマ区切りの要素は、列範囲を表現しており、セミコロン区切りの要素は行範囲を表現しております。
そのため、以下のようにも抽出することができます。
※入力文字を分かりやすくするため、区切り文字を”A”と”B”にしています。

=TEXTBEFORE(B4:B7,F6:G6)
=TEXTAFTER(B4:B7,F6:G6)
=TEXTBEFORE(B4:B7,F6:F7)
=TEXTAFTER(B4:B7,F6:F7)
2023/10/04
【Excel】「選択範囲内で中央」の本当の使い道

【Excel】「選択範囲内で中央」の本当の使い道

セルの結合に似た設定で「選択範囲内で中央」という設定があります。
この設定は、選択された範囲内の先頭の値を、結合されているセルのように表示させるものになります。

見た目はセルの結合と変わりません。

そのため、表にはセルの結合ではなく、「選択範囲内で中央」を使うべきと言われることがあります。
セルの結合は、「フィルターが使いにくくなる、並べ替えができなくなる」などといった理由で、表の中に使用することは一般的に禁止されています。
「選択範囲内で中央」を活用することで、並べ替えができるようになります。

「セルの結合」の場合は、並べ替えをすると、以下のような警告が表示され実行することができません。

ただ、「選択範囲内で中央」の設定がされている場合は、下記のように[No]を基準に降順にすることができました。

ExcelVBAレベル確認

「選択範囲内で中央」の設定方法

「選択範囲内で中央」の設定方法は、以下になります。

1.対象の範囲の選択
2.「右クリックの中の[セルの書式設定]を選択」もしくは「Ctrl+1」で、[セルの書式設定]を開く
3.[配置]の中の[横位置]を「選択範囲内で中央」にし、[OK]で確定

この手順で、以下のように設定することができます。

ExcelVBAレベル確認

「選択範囲内で中央」の本当の使い道

次に、以下の表の場合で確認していきます。

こちらの表は、「研修を実施する会場の場所」を示した表になります。
このように、行単位でまとめるべき範囲が異なる場合、「セルの結合」や「選択範囲内で中央」で設定するのは大変のように思えます。

実は、「選択範囲内で中央」では簡単に設定することができます。

まず、以下のような表を作成します。
同じ予定が入力される範囲に関しては、一番左のセルのみに値を入力します。

後は、設定したい範囲全体を選択し、[セルの書式設定]から「選択範囲内で中央」を設定します。

この設定で確定することで、以下のように一括で設定することができます。

「選択範囲内で中央」という設定では、右隣りが空白なら同じグループとして表示するというもののため、「セルの結合」とは異なり、修正する際も簡単です。
全範囲の値を消すと、以下のようになるため、後は必要な値を入力するだけで、自動で結合された表示になります。

上記のような表を作成する際は、「選択範囲内で中央」という機能を活用した方が、修正や再利用する可能性がある場合は良いかと思います。

2023/09/28
【ExcelVBA】チェックボックスを一括リセットするボタン作成

【ExcelVBA】チェックボックスを一括リセットするボタン作成

作成したチェックボックスを一括でリセットする方法について解説していきます。

まずはチェックボックスの作成方法から解説していきます。

チェックボックスの作成方法

チェックボックスを作成するには[開発]タブを表示する必要があります。
[開発]タブの表示方法についてはこちらをご確認ください。

[開発]タブを表示できましたら、[開発]タブ内の[挿入]から作成することができます。
[挿入]内のフォームコントロールの[チェックボックス]を選択することで作成することができます。

作成する際は、セル内に収めることを意識して作成すると、その後に複製しやすくなります。
まずは、適当なサイズで作成し、テキストが不要な場合は、テキストを削除した上で、セル内にサイズを調整します。

作成した後に選択すると、チェックのON・OFFが切り替わってしまいます。
修正したい場合は、Ctrlキーを押しながら選択することで、サイズ調整などを行うことができます。

1つ作成できましたら、そのセルをコピーすることで簡単に複製することができます。


作成することができましたら、チェックの有無をセルに表示させます。
チェックボックスの上で右クリックし、[コントロールの書式設定]を開き、リンクするセルを設定します。
それぞれ、チェックボックスを含むセルのアドレスを設定します。

それぞれに設定をすると、チェックボックスのON・OFFを切り替えた場合に、対象のセルにTRUEもしくはFALSEの値が表示されるようになります。
※以下の画像の場合は、セルの幅が狭いため”###”と表示されていますが、数式バーにて実際の値を確認することができます。

セルの値がTRUEの場合にチェックされ、FALSEもしくは空白の場合にチェックが外されます。
見た目では、チェックの有無に関しては瞬時に判断できるため、TRUE・FALSEの値は不要かと思います。
そのため、TRUE・FALSEの値を非表示にしていきます。

ExcelVBAレベル確認

実際の値を残した状態で、見た目のみを非表示にするには表示形式が活用できます。

設定内容は、表示形式の[その他の表示形式]より、[ユーザー定義]にて「;;;」とセミコロンを3つ並べて確定します。

この設定によって、以下のように非表示にすることができます。

余談にはなりますが、このTRUE・FALSEの値を用いて、チェックの数を集計することが可能です。
具体的には、以下のような数式で求めることができます。

=COUNTIF(B2:B4,TRUE)

では次に、チェックボックスのチェックを一括でリセットするボタンを開発していきます。


チェックを一括でリセットするボタンの開発方法

[開発]タブの中の[マクロ]を選択し、「チェック取消」という名前を入力して[作成]を選択します。

表示された「Sub チェック取消」の中身に、以下のコードを記述します。
※こちらのファイルは配布しています。

Sub チェック取消()
    
    Range("B2:B4").ClearContents
    
End Sub

連続しているセルを指定する場合は、「”B2:B4″」もしくは「”B2″,”B4″」のようにRangeの中に記述します。
離れているセルを指定する場合は、「”B2,B5,C3″」のように「”」内にカンマ区切りでアドレスを指定します。

このコードの意味は、指定したセルの値を削除する(ClearContents)というものになります。

入力できましたら、[開発]タブの中の[挿入]より、フォームコントロールの[ボタン]を選択し、適当な位置に作成します。
作成時に、「マクロの登録」という画面が表示されるため、先ほど作成した「チェック取消」を選択します。

必要に応じて、ボタンのテキストを変更することで完成です。

こちらのボタンを選択することで、チェックを一括で取り消すことができます。

▼サンプルファイル▼

2023/09/26
【Excel】深夜退社を考慮した勤務時間の求め方

【Excel】深夜退社を考慮した勤務時間の求め方

以下のような出社時刻と退社時刻、休憩時間を管理した表があります。
この表のD列の勤務時間(労働時間、稼働時間)を求める方法について解説していきます。


勤務時間を求める方法

時刻はシリアル値という数値で管理されています。

>シリアル値とは

そのため、時刻の差は引き算で求めることができます。
単純に勤務時間を求める式は以下のようになるかと思います。

勤務時間 = 退社時刻 - 出社時刻 - 休憩時間

こちらの計算式でD列を埋めてみます。

=B3-A3-C3

そのようにすることで勤務時間を求めることができるのですが、退社時刻が深夜の場合は求めることができません。
深夜の時刻を翌日の値として入力している場合は求めることができますが、直接「1:30」などと入力している場合は求めることができません。

求めることができない理由は、退社時刻より出社時刻の方が大きな数値となってしまい、「退社時刻 – 出社時刻 – 休憩時間」の計算結果がマイナスになってしまうためです。

以上の理由から、退社時刻よりも出社時刻の方が大きい場合は特殊な計算をする必要があります。
特殊な計算とはいっても複雑なものではありません。

以下の条件を加えるだけで、深夜退社でも正しく計算することができるようになります。

『出社時刻が退社時刻よりも大きい場合は、計算結果に1を加え、それ以外は0を加える

シリアル値の概念を理解している場合は、上記の条件式のイメージがしやすいかと思います。
1日はシリアル値で1と表現され、時間は1をさらに細かくした値です。

出社時刻が退社時刻よりも大きい場合は、本来、退社時刻の方が大きくなければいけないため、深夜時刻が入力されていることが考えられます。
深夜時刻とは、正確には翌日の朝になります。

そのため、1を加えて、翌日の時間として計算させるという理屈になります。

3行目の数式に条件式を加えると以下のようになります。

// =IF(論理式, [値が真の場合], [値が偽の場合])
=B3-A3-C3+IF(A3>B3,1,0)

反映させると以下のように求めることができます。

時刻や日付の計算をする上では、シリアル値の仕組みから考えると、徐々に解決策が思い付くようになるかと思います。

ExcelVBAレベル確認

補足

「A3>B3」というような比較式の結果はTRUEもしくはFALSEで表現されます。
また、TRUEは「1」、FALSEは「0」という数値として管理されています。
そのため、以下のようにIF関数を使わない数式でも表現することができます。

=B3-A3-C3+(A3>B3)

TRUEとFALSEの実体に関しては、以下の記事で詳しく解説しています。

>TRUEとFALSEを理解する

2023/09/20
【Excel】グラフに表示させるデータを瞬時に追加

【Excel】グラフに表示させるデータを瞬時に追加

以下のような各支店ごとの各月の売り上げをまとめた表があります。
1月から3月まではグラフに表示されていますが、後から4月のデータを追加した場合、グラフにも追加する必要があります。


データの追加方法①

データを追加する方法として、グラフを選択した後に表示される範囲から枠をドラッグして参照範囲を拡張するという方法があります。


データの追加方法②

では、次の場合はどうでしょうか。
3月の後に、一度集計列を追加し、その後に4月と5月のデータを追加しています。

このようになると、単純にドラッグでは拡張することができません。

ただ毎回、グラフを選択し、[グラフのデザイン]タブより[データの選択]から修正するのは大変かと思います。
※離れている範囲は「,(カンマ)」区切りで指定します。

実は、簡単に離れている範囲でもグラフに追加する方法があります。


それは、「Ctrl+C」でコピーして、「Ctrl+V」で貼り付けるという方法です。

まず、追加したい範囲を選択し、「Ctrl+C」でコピーします。

後は、グラフを選択して、「Ctrl+V」で貼り付けるだけで完了です。

このような方法も覚えておくと、役立つことがあるかと思います。

2023/09/07
【Excel】英単語のスペルチェック機能

【Excel】英単語のスペルチェック機能

近代では海外との仕事も増え、英語での文章のやり取りをする方も多くなっているかと思います。
そこで、英語を入力する際に、入力した単語のスペルが正しいのかどうか不安になることもあるかと思います。

実は、Excelには入力した単語のスペルを自動でチェックする機能があります。
その機能について解説していきます。

スペルチェック

スペルを自動でチェックする機能は、[校閲]タブ内にある[スペルチェック]になります。

こちらの機能は、[F7]キーでも実行することができます。
※ノートパソコンなど、小さめのキーボードの場合は、[Fn]キーを同時に押す必要があるものもあります。

まずは、スペルを確認したいセル上で、[スペルチェック]を実行します。

スペルにミスがないと判断された場合は、以下のウィンドウが表示されます。
必要に応じて、「はい」を選択し、先頭から順番にチェックすることができます。

実行すると、以下のように誤っている単語がある場合に、修正候補が表示されます。
修正が不要な場合は[無視]を選択し、修正が必要な場合は、修正候補から単語を選択し、[修正]を選択することで置換されます。

名詞などで辞書に登録されていない単語に関して、今後、警告を表示したくない場合は、辞書に追加することができます。
以下の画面にて、[辞書に追加]を選択することで、辞書に追加され警告が表示されなくなります。

辞書に登録した内容を修正したい場合は、上記の画面の左下の[オプション]、もしくは、[ファイル]タブから[オプション]を選択するなどとして、[Excelのオプション]を開きます。
そして、Excelのオプション内の[文章校正]内の[ユーザー辞書]を選択します。

以下の[ユーザー辞書]のウィンドウにて、対象の辞書を選択し、[単語の一覧を編集]より追加や削除することができます。

2023/09/04
【Excel】セルの結合を正しく使う

【Excel】セルの結合を正しく使う

「セルの結合はダメ」とよく言われますが、本当にダメな機能なのでしょうか?

本当に使うべきでない機能の場合は、Excelに機能として残り続けないかと思います。
「セルの結合」は使い方を気を付ければ、かなり便利な機能です。

「セルの結合」とは、以下の表のように複数のセルを1つのセルとして扱う機能になります。

ということで、こちらでは、「セルの結合」のデメリットとメリットについて解説していきます。
また、最後に、「セルの結合」を上手く活用したメンテナンスのしやすい書類の作成方法についても解説しています。


セルの結合のデメリット3つ
①正しく絞り込みができない

フィルターを設定して、結合されたセルを含む列に対して絞り込みをすると、以下のように正しく絞り込むことができません。

カテゴリーが「A」の商品が3つ表示されるのではなく、先頭のデータのみしか表示されていません。
この原因は、結合されたセルに入力されている値は、結合範囲の左上のセルに入力されていることになり、他のセルは空白になるためです。

実際に、値の入力されている複数のセルを結合すると、以下のような警告が表示されます。

他のセルが空白になってしまうため、フィルターで正しく絞り込むことができなかったということになります。

※結合されている範囲全体に同じ値を入力するような小技もありますが、見た目上では、値が入力できているのか判断が難しいため、推奨はできません。
一応小技を載せておきます。

1.結合されているセルに入力したい値を別のセルに入力し、そのセルをコピーする

2.結合されているセル上で右クリックし、「形式を選択して貼り付け」より「数式」で貼り付ける

これで完成です。
見た目上は変わりませんが、フィルターで正しく絞り込むことができます。
→セルの結合を解除すると、他のセルにも値が入力されていることが確認できます。


②並べ替えができない

セルの結合が使われている表は、並べ替えができません。
実際に行うと、以下のような警告が表示され、作業が中断されます。

ExcelVBAレベル確認

③正しく集計ができない

これは「①正しく絞り込みができない」と同じ理由になりますが、結合されている範囲をCOUNTIF関数などで集計しようとしても、先頭セル以外が集計されません。

①の小技を使うことで、正しく集計することも可能ですが、分かりづらいため、推奨はできません。


セルの結合のメリット

いくつかデメリットをお伝えしましたが、共通して言えることは、「集計する表に対してのセルの結合がよろしくない」ということです。
逆に言えば、集計しない表の場合(印刷する用の資料など)は、結合しても問題ございません。

結合している印刷用のシートの代表が「神エクセル」と呼ばれるセルの幅を均一な正方形にし、結合を多様して作れらたシートになります。

このような資料は、印刷目的であれば全く問題ありません。

しかし、「セルの結合」を多用しすぎるシートは、改修頻度の多い資料には向いていません。
改修時に、結合を解除して再び結合するなどとレイアウトが崩れやすくなるためです。

そのため、「セルの結合」を多用しそうな場合は、以下のように作成することをお勧めします。

1.パーツ単位でシートを分けて用意し、[表示]タブより[目盛線]を非表示にする(パーツ単位で必要に応じて「セルの結合」を使うのは問題ございません)

2.パーツの対象の範囲をコピーし、「リンクされた図」で貼り付けて、好みの位置に配置する

「リンクされた図」を活用すると、元の表が更新されると同時に、貼り付けた図にも反映されます。

こちらの方法を活用することで、セルの幅などに左右されずにメンテナンスのしやすいシートを作成することができます。

2023/08/31
【ExcelVBA】マークされた行を削除する

【ExcelVBA】マークされた行を削除する

以下の表のように、マークされた行を瞬時に削除するマクロの開発方法について解説していきます。

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


実現方法

このような仕組みをVBAで開発するには、どのような処理で実現するのかを考える必要があります。
今回の場合は、以下のような処理で実現できるかと思います。
※このような処理の流れを表現した図をフローチャートと呼びます。

処理を上記のように分解することができましたら、1つ1つVBAで実現していきます。


開発

まずは、[開発]タブより[マクロ]を選択し、好みの名前(こちらでは”対象行の削除”)を入力し、[作成]を選択します。

表示された「Sub 対象行の削除()」内に以下のようなコードを記述します。
※「’」から始まっている緑の文字はコメントアウトと呼び、処理には関係のないメモ書きになります。

Sub 対象行の削除()
    
    Dim lastRow As Long
    
    'B列の最終行(≒150万行目)から「Ctrl+↑」で移動して止まった位置の行番号
    '⇒B列に●が入力されている一番下の行番号
    lastRow = Cells(Rows.Count, "B").End(xlUp).Row
    
    Dim i As Long
    
    '行を削除すると、行番号がずれてしまうため、下から上へと対象行を削除する
    For i = lastRow To 3 Step -1
        
        'B列のi行目のセルに値が入力されている場合
        '※「….Value = "●"」でも可
        If Cells(i, "B").Value <> "" Then

            'i行目を削除する
            Rows(i).Delete
            
        End If
        
    Next i
    
End Sub

上記のコードの解説をします。

Dim lastRow As Long

Dim と書かれているものは変数宣言と呼び、プログラム内で一時的に使用する値を格納する部屋(変数)を用意しています。
As の後に部屋(変数)の種類を定義しています。
Long は整数を格納する専用の部屋(変数)を指します。

lastRow = Cells(Rows.Count, "B").End(xlUp).Row

Rows.Count で対象のシートの最大の行番号(1048576)を取得できます。
Cells(Rows.Count, “B”) でセルB1048576を指定し、 .End(xlUp) でCtrlキーと↑キーを押した先に移動しています。
Ctrlキーと↑キーを同時に押すと、対象列の次に値が入力されているセルまで移動することができます。
その移動した先のセルの行番号を .Row で取得しています。

For i = lastRow To 3 Step -1 ~ Next i

For ~ Next 間を、先ほど取得した行番号から3まで-1刻みで繰り返します。
変数(i)が先ほど取得した行番号から3まで-1刻みで変化して、For ~ Next の中の処理が繰り返し実行されます。

If Cells(i, "B").Value <> "" ThenEnd If

If ~ End If の中の処理に関して、 Cells(i, “B”).Value <> “” の条件を満たした場合のみ実行します。
Cells(i, “B”).Value は対象のi行目のB列のセルを指しており、 .Value でそのセルの値を取得しています。
<> は等しくないという意味を表しており、 <> “” で空白でないという意味になります。

Rows(i).Delete

Rows(i) でi行目の全体を指定し、 .Delete で削除しています。

上記の内容を記述し、エディタ内の実行ボタン、もしくは、[マクロ]の実行ボタンにて実行すると、B列に値が入力された行全体が削除されます。

※マクロを実行すると、実行前の状態に戻すことができなくなるため、動作確認をする前に、保存をしておくと良いです。

▼サンプルファイル▼

2023/08/30
【Excel】再利用するための瞬時に値を削除できる設定

【Excel】再利用するための瞬時に値を削除できる設定

「特定のセルの値のみを瞬時に削除したい」
そんな時に活用できるのが、「名前」という機能です。

セルに名前を付ける

セルには、好みの「名前」を付けることができます。

例えば、以下のようなシートのセル「C2、C3、C4、C6」に名前を付けていきます。

対象のセルをCtrlキーを押しながら複数選択し、名前ボックスにて、好みの名前を入力してEnterキーで確定します。
※名前には、「A1」などの実在するアドレスや数字から始まるものなどは設定することができせん。


名前を付けたセルを選択して値を削除する

名前を登録することで、以下のように、名前ボックスのリストから簡単に選択できるようになります。

そのため、値が入力されている場合は、名前を選択してDeleteキーを押すだけで値を削除することができます。

複数のセルに名前を設定することができるため、色々と応用できるかと思います。
登録した名前は、[数式]タブの中の[名前の管理]にて管理されているので、自由に編集や削除することができます。


補足

セルが結合されている場合で、離れているセルを含む場合は、結合範囲の先頭のセルのみしか登録されないことがあります。
その場合、名前を選択すると以下のようにセルが選択されます。

この状態でDeleteキーを押すと、以下のようなメッセージが表示されて削除できません。

ただ、この警告が表示された後に、以下のように選択が修正されます。

そのため、警告が表示されましたら、Enterキーで警告を閉じ、そのままDeleteキーを押すことで値を削除することができます。

※毎回使用するファイルの場合は、テンプレート用のExcelファイルを用意したほうが良いかと思います。
ただ、ファイルを増やしたくない場合や、バックアップをする必要がない場合は、こちらの方法が便利かと思います。

2023/08/24
【Excel】締め日を考慮したカレンダーの作成方法

【Excel】締め日を考慮したカレンダーの作成方法

締め日を考慮した以下のようなカレンダーを作成していきます。
※こちらのExcelファイルは配布しています。

こちらのカレンダーは、セルB2とB3に年月を入力し、セルD3に締め日を入力することで、自動でセルA6以降にカレンダーが表示される仕組みになっています。

ExcelVBAレベル確認

15日を締め日とした場合(1行目)

まずは、締め日を15日とした場合の数式を考えていきます。

締め日を15日とした場合、対象期間はひと月前の16日から対象月の15日までになります。
まず、開始日は「ひと月前の16日」で固定になるため、そのような値を数式で求めていきます。

こちらで使用する関数はDATE関数になります。

=DATE(年, 月, 日)
// 指定した年月日の日付を表す値を返す

DATE関数を用いて、ひと月前の16日を求めた数式は以下になります。

=DATE(B2,B3-1,16)

また、DATE関数は、月日の桁上がり桁下がりにも対応しています。
そのため、以下のような月にも対応することができます。


15日を締め日とした場合(2行目以降)

続いて、2行目以降の日付を求めていきます。
17日以降に関しては、基本は前のセルの日付に1日ずつ加算していけばよいのですが、条件として対象月の16日以降は対象外になってしまいます。
そのため、IF関数を用いて1日加算した日付が対象月の16日よりも前の場合は表示、それ以外は非表示という式にする必要があります。

=IF(論理式, [値が真の場合], [値が偽の場合])
// 論理式の条件を満たしている場合は、[値が真の場合]に設定した内容を表示、満たしていない場合は、[値が偽の場合]に設定した内容を表示する

IF関数を用いた数式は以下になります。

=IF(A6+1<DATE($B$2,$B$3,16),A6+1,"")
// 下の行へコピーしても問題ないように、位置を固定する必要のあるセル(B2,B3)に関しては絶対参照にしています

後は、こちらの数式を最大31日分を表示できるようにコピーします。

ただ、この数式をコピーすると、期間が31日ない月(3月など)の場合、エラーが表示されることがあります。

エラーの原因は、空白(“”)に1を加えているためです。

そのため、IFERROR関数を用いた数式にします。

=IFERROR(値, エラーの場合の値)
// 指定した値(数式)がエラーの場青は、[エラーの場合の値]に設定した内容を表示する

IFERROR関数を用いた数式は以下になります。

=IFERROR(IF(A6+1<DATE($B$2,$B$3,16),A6+1,""),"")

このようにエラーを無くすことができました。


締め日を自由に変更できるようにする

では次に、締め日を自由に変更できるように修正していきます。

こちらに関しては、締め日の値を別のセルを参照させることで解決します。
そのため、数式を以下のように修正することで、締め日を自由に設定することができるようになります。

=DATE(B2,B3-1,D3+1)
=IFERROR(IF(A6+1<DATE($B$2,$B$3,$D$3+1),A6+1,""),"")
// 2行目以降のコピーする数式では、位置を固定する必要のあるセル(B2,B3,D3)に関しては絶対参照にしています

補足

セルA1の「対象月(10月締め)」に関して、セルD3の内容を元に文言が切り替わるように以下の数式を入力しています。

="対象月("&D3&"日締め)"

▼サンプルファイル▼

2023/08/21
【Excel】特定の曜日の日付を入力できないようにする

【Excel】特定の曜日の日付を入力できないようにする

スケジュール表などの日付を入力する項目に対し、特定の曜日の日付を入力できないようにする方法について解説していきます。
目的は、誤って「営業日でない日を登録する」などのことを未然に防ぐことになります。

こちらでは、以下の2点について順番に解説していきます。

・土日の入力を禁止する
・指定した曜日の入力を禁止する

以下の表を用いて順番に解説していきます。


土日の入力を禁止する

特定のセルへの入力を制限するには、「データの入力規則」を活用します。
ただ、「土日の入力を禁止する」というような設定は、予め用意されていないため、ユーザー設定にて自作する必要があります。

ユーザー設定では、TRUEもしくはFALSEを表す値を返す数式を入力し、対象のセルに値が入力されたときに、その数式の結果がTRUEでない場合に制限するという設定になります。

特定のセルの値が土日以外の場合に、TRUEを返す数式を作成するには、NETWORKDAYS関数が便利です。

=NETWORKDAYS(開始日, 終了日, [祭日])
// 指定した期間の営業日(土日休み)の日数を返す
// [祭日]は今回は使用しないため、省略します

こちらの関数を用いて、開始日と終了日を同じ日付にして営業日の日数を求めます。
そのようにすることで、対象の日付が土日のいずれかの場合は、日数が「0」になり、土日以外の場合は、日数が「1」になります。

以下のようなイメージです。

=NETWORKDAYS(B3,B3)

また、TUREとFALSEは数値でも表現することができます。
数値で表現する場合は、「0」がFALSE、「0以外」がTRUEになります。

そのため、この数式をそのまま「データの入力規則」にて設定することで、土日の入力を制限することができます。

設定したい対象の範囲を選択し、[データ]タブから[データの入力規則]を選択します。

次に、以下の内容を設定します。

・入力値の設定:ユーザー設定
・数式:以下のを参照

=NETWORKDAYS(B3,B3)

数式で指定したセルB3は、選択の基準となっているセルになります。
他のセルには、B3から相対参照で数式が設定されます。

上記の設定をすることで以下のように、土日の入力が制限されます。


指定した曜日の入力を禁止する

次に、土日に限らず、指定した曜日の入力を制限する方法について解説していきます。
指定した曜日に関しても、先ほどと同様に、営業日の日数を求めることで入力を制限することができます。

土日以外の曜日で設定する場合は、NETWORKDAYS.INTL関数が便利です。

=NETWORKDAYS.INTL(開始日, 終了日, [週末], [祭日])
// 指定した期間の営業日(土日休み)の日数を返す
// [週末]にて定休日を好みの曜日に設定することができる ※省略すると土日で設定される
// [祭日]は今回は使用しないため、省略します

NETWORKDAYS関数と比べると、[週末]という引数が追加されています。
[週末]は以下の数値で設定することができます。

1 または省略:土と日
2:日と月
3:月と火
4:火と水
5:水と木
6:木と金
7:金と土
11:日のみ
12:月のみ
13:火のみ
14:水のみ
15:木のみ
16:金のみ
17:土のみ

好みの曜日設定がない場合は、[0」と「1」を並べることでも表現することができます。

"0000011":土と日
"1010000":月と水
など

こちらでは、例として、水曜日と土曜日の入力を制限していきます。
水曜日と土曜日を定休日とした営業の日数を求める数式は以下になります。

=NETWORKDAYS.INTL(B3,B3,"0010010")

では、こちらの内容を「データの入力規則」にて設定していきます。

=NETWORKDAYS.INTL(B3,B3,"0010010")

上記の設定をすることで以下のように制限されます。


補足

引数の[祭日]では、定休日以外の休日を設定することができます。
使用例は以下になります。

=NETWORKDAYS.INTL(B3,B3,"0010010",$E$3:$E$9)
// 休日一覧など位置が変わらないセルは絶対参照にする