2023/11/15
【ExcelVBA】「マクロの記録」でクラス分け

【ExcelVBA】「マクロの記録」でクラス分け

以下のような名簿があります。
こちらの名簿には、A~Cの複数のクラスが含まれます。

この表をクラス分けして、以下の別々のシート(A~C)に表示させる機能の開発方法について解説していきます。

今回、こちらでは「マクロの記録」という機能を活用して開発していきます。
解説する流れは以下になります。

・手順の確認
・「マクロの記録」の実行
・記録内容の確認と修正(修正後のファイルも配布)

実際に、「マクロの記録」にて開発したファイルは以下になります。
※こちらのファイルは、記録後の未修正ファイルです。

では、順番に解説していきます。


・手順の確認

「マクロの記録」を上手く活用するには、無駄な手順を無くし、尚且つ、繰り返し実行できる手順を考える必要があります。
今回は、以下の手順で記録することで実現していきます。

① 表にフィルターを設定(ショートカット:Ctrl+Shift+L)

② Aクラスで絞る

③ A~B列をコピー(ショートカット:Ctrl+C)

④ シート「A」のセルA1を選択して貼り付け(ショートカット:Ctrl+V)

⑤ シート「A」のセルA1を選択

⑥ ②~⑤の手順を、Bクラス、Cクラスでも実行する

⑦ 表のフィルターを解除(ショートカット:Ctrl+Shift+L)

この手順のポイントは、③でコピーする際に列全体をコピーしているというところです。
列全体を選択することで、今後、データ数が増えてきた場合にも対応することができます。


・「マクロの記録」の実行

では、先ほどの手順を記録していきます。
[開発]タブの中の[マクロの記録]を選択し、好みの名前で作成します。

[作成]を選択した後は、以下のように[記録終了]という文字に切り替わり、記録が開始します。

記録が開始すると、その後の操作は、すべて記録されてしまうため、無駄な操作なく、先ほどの手順を行います。
※記録される操作は、「マクロの記録」に対応している操作のみになるため、Windowsの操作などは記録されません。

先ほどの①~⑦の操作が完了したら、上記の[記録終了]を選択することで完成です。
実行は、[マクロ]の中の作成した名前を選択することで行えます。


・記録内容の確認と修正

記録された内容を確認します。
記録されたコードは、[VisualBasic]を選択することで確認することができます。

記録されたコードは以下になります。

こちらには、無駄なコードが多く存在します。
[マクロの記録]を活用するデメリットはここにあります。
[マクロの記録]を活用した後は、中身を確認し、無駄な処理を修正した方が、保守的になります。

では、無駄な処理を確認していきます。

まずは以下の内容です。

Selection.AutoFilter
ActiveSheet.Range("$A$1:$C$51").AutoFilter Field:=3, Criteria1:="A"

この処理は、「選択したセルを基準にフィルターを設定し、その後にセルA1~C51が含まれるフィルターの3列目が「A」のもので絞り込む」という内容になっています。
ここの無駄なポイントは、以下になります。

・フィルターの設定と絞り込みを分ける必要がない
・フィルターの範囲を指定するには、設定が含まれるセルであればよいので、A1~C51などの指定が不要
・ActiveSheet(現在選択されているシート)というのが抽象的で、別のシートを選択して実行すると不具合を起こす

こちらを改善すると、以下のようになります。

Sheets("学年").Range("A1").AutoFilter Field:=3, Criteria1:="A"

この処理は、「シート「学年」のセルA1を基準にフィルターを設定し、設定したフィルターの3列目が「A」のもので絞り込む」という内容になっています。
このように、無駄な処理を修正し、より不具合が起こりにくい処理にすることができました。

次に、以下の処理です。

Columns("A:B").Select
Range("B1").Activate
Selection.Copy
Sheets("A").Select
ActiveSheet.Paste
Range("A1").Select

この処理は、「現在選択されているシートのA列とB列を選択し、セルB1をアクティブにしてコピーし、シート「A」を選択し、貼り付けて、セルA1を選択する」という内容です。
ここの無駄なポイントは、以下になります。

・コピー対象は選択されている範囲であり、現在、どのセルが選択されているのかは関係ない
・シート情報が省略されているため、別のシートを選択して実行すると不具合を起こす

こちらを改善すると、以下のようになります。

Sheets("学年").Columns("A:B").Copy
Sheets("A").Range("A1").PasteSpecial
Sheets("A").Select
Range("A1").Select

この処理は、「シート[学年」のA~B列をコピーし、シート「A」のセルA1を基準に貼り付け、シート「A」のセルA1を選択する」という内容です。
Pasteメソッドはシートに対してしか使えないため、セルに対して直接貼り付けできるPasteSpecialメソッドを使用しています。

この流れで他も修正すると、以下のようになります。

これだけでも、かなり見やすくなったかと思います。
こちらのファイルは以下になります。

ExcelVBAレベル確認

「マクロの記録」は、とても便利な機能ですが、無駄な処理も多く記録されてしまいます。
また、中身の確認が出来ない場合は、機能の仕組みはブラックボックスとなり、どのタイミングで不具合を起こすのかが予測できません。

その状態での業務での運用は、かなり危険になります。
初めは大変ですが、「マクロの記録」を活用した場合は、コードの内容を確認することを推奨します。

2023/11/12
【便利】選択した範囲の値を瞬時に交換する機能

【便利】選択した範囲の値を瞬時に交換する機能



YouTubeで開く

複数の範囲選択をするだけで、その範囲単位の値を瞬時に交換する機能について解説しています。

例えば、クラスの席替え時に座席表で特定の人を交換する際や、グループ学習用のグループ表のグループリーダーを時計回りに交換する際に役立ちます。

今回の1つの機能だけで実現できるので、よく使う場合は、アドインにするのも良いかと思います。
>アドインの設定方法

00:00 挨拶
00:35 完成イメージ
01:47 準備
02:02 作成(選択範囲の値交換)
14:13 作成(交換ボタン)
14:51 完成
16:10 プログラムの全体
19:20 まとめ

▼準備ファイル▼

2023/11/06
【Excel】特定のセルに値がある場合に行全体を色付け

【Excel】特定のセルに値がある場合に行全体を色付け

以下の表に関して、「済」が入力されている行を全体的にグレーにする方法について、3パターンで解説していきます。

今回解説する3パターンは以下になります。

・E列に「済」が入力されている場合に、行全体を色付け
・E~G列すべてに「済」が入力されている場合に、行全体を色付け
・E~G列のいずれかに「済」が入力されている場合に、行全体を色付け

では、順番に解説していきます。


・E列に「済」が入力されている場合に、行全体を色付け

1つのセルを参照して行全体を色付けする場合は、開始のセル(B3)を基準とした条件式を作成します。

セルB3に色付けする場合とは、“セルE3に「済」が入力されている場合”になります。
この内容を数式で表現すると、以下のようになります。

=E3="済"

では、次に隣のセル(C3)を基準とした条件式を作成します。
セルC3の場合に関しても同様に、以下のようになります。

=E3="済"

では、次に下のセル(B4)を基準とした条件式を作成します。
セルB4の場合は、以下のようになります。

=E4="済"

ここで分かることとして、行番号は基準の位置によって相対的に変化しますが、列は固定になります。
そのため、列を固定の条件式を作成する必要があります。
セルB3が基準の条件式の列を固定すると、以下のようになります。

=$E3="済"

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

まずは、セルB3を基準とした対象の範囲を全選択します。

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

[数式を使用して、…]より、先ほどの数式を入力し、[書式]を[塗りつぶし]のグレーにします。

=$E3="済"

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

Excel本紹介

・E~G列すべてに「済」が入力されている場合に、行全体を色付け

先ほどの内容を踏まえ、次は、指定の列全体に「済」が入力されている場合に色付けしていきます。

先ほど同様に、開始のセル(B3)を基準にした条件式を作成します。

求め方は色々ありますが、今回は、「済」が入力されたセルの数が3の場合という条件式にしていきます。
先ほど同様に、列を固定した場合の式は、以下になります。

=COUNTIF($E3:$G3,"済")=3

COUNTIF関数で、指定した範囲の「済」が入力されたセルの数を数えることができます。

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

先ほど同様に、セルB3を基準に対象の範囲を全選択し、[ホーム]タブの中の[条件付き書式]の[新しいルール]を選択します。

[数式を使用して、…]より、先ほどの数式を入力し、[書式]を[塗りつぶし]のグレーにします。

=COUNTIF($E3:$G3,"済")=3

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

ExcelVBAレベル確認

・E~G列のいずれかに「済」が入力されている場合に、行全体を色付け

先ほどは、対象の列すべてに「済」が入力されている場合という条件でしたが、次はいずれかに入力されているという条件にします。

先ほどの数式は以下になります。

=COUNTIF($E3:$G3,"済")=3

この数式をいずれかにする場合は、“「済」が入力されたセルの数が1以上の場合”という条件式にする必要があります。
その数式を求めると以下のようになります。

=COUNTIF($E3:$G3,"済")>=1

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

先ほど同様に、セルB3を基準に対象の範囲を全選択し、[ホーム]タブの中の[条件付き書式]の[新しいルール]を選択します。

[数式を使用して、…]より、先ほどの数式を入力し、[書式]を[塗りつぶし]のグレーにします。

=COUNTIF($E3:$G3,"済")>=1

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

2023/10/27
【Excel】連続した文字の色を自動で薄くする

【Excel】連続した文字の色を自動で薄くする

以下のように、同じ項目に同じ値が続く場合に、自動で文字の色を薄くする設定方法について解説していきます。

このような設定をする場合、まず初めに「どのような条件の時に色を薄くするのか」を定義する必要があります。
また、その定義は、より具体的である必要があります。

今回の場合、「同じ項目に同じ値が続く場合に、自動で文字の色を薄くする」という内容を、より細かい表現にします。
例えば、以下のように表現することができます。

・「対象のセルの値」と、そのセルの「1つ上のセルの値」が一致する場合に、対象のセルの「文字の色」をグレーにする

このように、「同じ値が続く場合」という抽象的な表現を、より具体的にします。

この条件を、特定のセルに対する数式で表現していきます。

今回の場合、適用したい範囲は「C3」以降になるかと思います。
※「C3」は文字が重複する可能性がないため、「C4」を基準にしても問題ございません

その場合、適用したい範囲の一番上のセルを基準にした条件式を作成します。
「「対象のセルの値」と、そのセルの「1つ上のセルの値」が一致する場合」という条件を数式で表現すると、以下のようになります。

=C3=C2
// C3とC2が等しい場合

他のセルに関して、例えば、「C4」を基準とした数式の場合は、以下のようになります。

=C4=C3

ここから分かる通り、「C3」以降は、一番上の数式から相対的に変化する数式になります。
※今回のケース以外で、相対的にならない場合は、固定すべき行や列に「$」を付けて、絶対参照にします。

このような一番上の数式を導くことができましたら、「条件付き書式」にて設定していきます。


今回は、設定する範囲を「C3」から一番下の行までにします。
その場合は、C列を全体的に選択し、不要なセルをCtrlキーを押しながら選択することで選択を解除します。

恐らく、「C3」が基準のセルになっているかと思います。
基準のセルが「C3」以外の場合は、その基準のセルの条件式を考える必要があります。
※基準のセルというのは、選択範囲内で色が白くなっているセル「C3」を指します。

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

[新しい書式ルール]の設定画面にて、ルールの種類を[数式を使用して、…]にし、テキストボックスに基準のセルの条件式を入力します。
こちらでは、以下の数式になります。

=C3=C2

[書式]に関しては、好みの文字の色を設定します。

上記のように設定することが出来ましたら[OK]で確定することで、以下のように、連続した値を薄くすることができます。

条件付き書式に設定した数式は、選択範囲全体に相対参照で設定されます。
そのため、基準のセルによって、設定する数式が異なります。

2023/10/26
【便利】開きながらファイル名を変更

【便利】開きながらファイル名を変更



YouTubeで開く

Excelファイルを閉じずに開いた状態で、Excelのファイル名が変更できる機能の開発方法について解説しています。
Excelファイルを操作している際にファイルの名前を変更したくなった時、ファイルを閉じてから名前を変更する必要がなくなります。

00:00 挨拶
00:19 完成イメージ
01:13 実現方法
02:01 作成(ファイル名変更)
09:35 アドインの保存・設定
12:39 完成
14:02 プログラムの全体
16:35 まとめ

2023/10/16
【ExcelVBA】瞬時にフィルターで絞り込み

【ExcelVBA】瞬時にフィルターで絞り込み

以下のような表に関して、対象のデータを探す際に、フィルターボタンから絞り込みをするとします。

この絞り込み作業が毎回発生する場合、フィルターのメニューから絞り込み条件を毎回設定するのは大変に感じることがあります。

こちらでは、データを絞り混む際に、フィルターのメニューを操作せずに、瞬時に絞り込む機能の開発方法について解説していきます。
具体的には、対象の項目の上の空白セルに、検索したい文字を入力することで、その文字が含まれるデータのみを瞬時に絞り混むという機能になります。
以下の画像がイメージになります。

こちらでは、項目[ふりがな]を絞り込むための機能を開発する方法について解説していきます。

※全項目に対応した機能を開発する場合は、以下のコンテンツをご確認ください。

>【業務】瞬時に表のデータを絞り込む機能

Excel本紹介

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

まず初めに、[開発]タブの中の[Visual Basic]を選択します。

次に[プロジェクト]から対象のシートモジュールを開きます。

※[プロジェクト]が表示されていない場合は、[表示]タブから表示することができます。

開いたシートモジュールのエディターの上に[General]と書かれたリストがあります。
こちらから[Worksheet]を選択します。

選択すると、隣のリストの[Declarations]が[SelectionChange]に切り替わり、[Private Sub Worksheet_SeletionChange]というプロシージャが表示されます。
今回は、こちらを使用せず[Worksheet_Change]というプロシージャを使用するため、隣のリストから[Change]を選択します。

選択することで、[Worksheet_Change]というプロシージャが表示されます。
[Worksheet_SelectionChange]のプロシージャに関しては、今回は使用しないため、削除しても問題ないです。

次に[Worksheet_Change]のプロシージャ内に以下のように記述します。

このコードの意味を説明します。

[Worksheet_Change]というプロシージャは、対象シートのセルの値を編集した際に自動で実行される、イベントプロシージャと呼ばれる特殊なプロシージャになります。
引数の[Target]には、編集したセルの情報がRange型で格納されます。

その[Target]の情報を活用して、対象のセルが編集されたかどうかを確認します。

If Target.CountLarge = 1 And Target.Address = "$D$1" Then ~ End If
// 上記の画像内の「_」はコードを改行する際に使用します。

上記のコードにて、編集されたセル[Target]が1つのセルなのかどうかと、アドレスがセルD1なのかを確認しています。
[.CountLarge]で対象のセルの数を取得することができ、[.Address]で対象のアドレスを絶対参照で取得することができます。

この条件を満たした時に以下のコードが実行されます。

Range("B2").AutoFilter 3, "*" & Range("D1").Value & "*"

上記のコードにて、セルB2が属している表にフィルターを設定し、[3]で列番号を指定、[“*” & Range(“D1”).Value & “*”]で絞り込み条件を指定しています。

[3]は表の先頭からの列番号になります。
[ふりがな]の項目は先頭から3番目の要素になるため、[3]と指定しています。

[“*” & Range(“D1”).Value & “*”]は、条件として、「セルD1の値を含む」という意味になります。
[Range(“D1”).Value]でセルD1の値を取得し、[“*” &]と[& “*”]で、セルD1の値に「*」という文字を結合しています。
「*」は0文字以上の文字という特殊な意味があり、「*」で囲むことによって、「その値を含む」という条件にすることができます。


以上の設定にて完成です。
セルD1に好みの値を入力することで、その文字を含む値のみに絞り込むことができます。

数値の項目に適用する場合は、「○○を含む」という条件では実現できないため、「*」の結合を無くすなどと条件を変更する必要があります。

▼サンプルファイル▼

2023/10/13
【便利】リンク取得可能な検索関数

【便利】リンク取得可能な検索関数



YouTubeで開く

該当するセルのハイパーリンクの情報を抽出できる関数の開発方法について解説しています。

検索用の関数として、VLOOKUP関数やXLOOKUP関数などがあります。
しかし、これらの関数は、対象範囲の文字列のみしか取得することができません。
対象範囲内にハイパーリンクが含まれている場合は、そのハイパーリンクの情報を取得することができず、文字列のみの取得になってしまいます。

こちらで開発する関数(ユーザー定義関数/自作関数)を活用すると、対象範囲内のハイパーリンクの情報(URLやセルのアドレス、ファイルやフォルダのパス)を取得することができます。

00:00 挨拶
00:54 完成イメージ
01:54 準備
02:14 作成(リンク情報取得用の検索関数)
15:52 完成
19:35 プログラムの全体
24:26 まとめ

▼準備ファイル▼

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]を基準に降順にすることができました。

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

=COUNTIF(B2:B4,TRUE)

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

ExcelVBAレベル確認

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

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

表示された「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)

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

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