YouTubeで開く
表の値を活用してフォルダを一括作成する方法と、作成したフォルダを表示するハイパーリンクを作成する方法について紹介しています。
こちらの方法では、マクロは使用しません。
>マクロでフォルダ作成を自動化する方法
IT予備
業務効率化のコツが無料で学べる!Excelなどの解説&配布サイト

表の値を活用してフォルダを一括作成する方法と、作成したフォルダを表示するハイパーリンクを作成する方法について紹介しています。
こちらの方法では、マクロは使用しません。
>マクロでフォルダ作成を自動化する方法

担当者を順番に切り替えながら作業するとき、
「次は誰が担当するのか」
をExcel上で分かりやすく管理したいことがあります。
今回は、スピンボタンをクリックするだけで、担当者を順番に切り替えられる仕組みを作っていきます。

※こちらで作成したファイルは、記事の最後にて配布しています。
まずはシンプルに、表の先頭「佐藤」から末尾「加藤」までをスピンボタンで移動する仕組みを作ります。
後半では、末尾「加藤」の次は先頭「佐藤」へとローテーションできる仕組みに発展させます。
今回は、以下の表を元に作成していきます。

まずは、[開発]タブの[挿入]から[スピンボタン]を選択し、適当な位置に作成します。

次に、スピンボタンの上で右クリックし、[コントロールの書式設定]を開きます。

[コントロールの書式設定]にて、以下のように設定します。
・最小値:5(氏名の先頭の行番号)
・最大値:14(氏名の末尾の行番号)
・リンクするセル:$B$2(スピンボタンの下に隠れるセル、相対参照でもOK)

以上の設定を行うことで、スピンボタンを押すだけでセルB2の値を5~14に変えることができるようになります。

後は、条件付き書式を活用して、セルB2に表示されている数値と同じ行番号の氏名を色付けします。
まず担当の範囲を選択し、[ホーム]タブの[条件付き書式]から[新しいルール]を選択します。

条件付き書式の設定画面にて、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にし、以下の数式を入力します。
=ROW()=$B$2
// 行番号がセルB2と同じ

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

以上の手順で、スピンボタンを押すだけで、担当の色付けが移動します。

しかし現状は、スピンボタンの上を押すと、担当の色付けが下に移動するといった感じに、上下が逆になってしまっています。
上下を揃えるためには、「スピンボタンの数値が増えると同時に、行番号が減る」という仕組みを数式で実現する必要があります。
一度、スピンボタンの[コントロールの書式設定]から[リンクするセル]を「$B$3」に変更します。

そして、セルB3が「5」のときにセルB2が「14(氏名の末尾の行番号)」、セルB3が「14」のときにセルB2が「5(氏名の先頭の行番号)」になるように、以下の数式をセルB2に入力します。
=19-B3
// B3の値が大きくなると結果が小さくなる

最後に、スピンボタンをセルB2とB3の上に移動させれば完成です。
(スピンボタンを選択するには、Ctrlを押しながらスピンボタンをクリックします)

現状のままですと、スピンボタンで移動できる範囲は、5行目から14行目までになります。
ここから、14行目の次に5行目へと、ローテーションできる仕組みに発展させていきます。
実装方法は簡単です。
スピンボタン自体にローテーションする仕組みはないため、数式でローテーションする仕組みを実装するだけになります。
ただ、スピンボタン自体にローテーションする仕組みがないため、偏ってクリックすると、いずれ上限に達して止まってしまいます。
可能な限り上限を広げるために、スピンボタンの[コントロールの書式設定]を開き、以下のように修正します。
・現在値:15000(最小値と最大値のほぼ中央の値)
・最小値:0(スピンボタンで表現できる最小値)
・最大値:30000(スピンボタンで表現できる最大値)

次に、スピンボタンを移動させ、セルB2が5~14を繰り返すような数式を入力します。

具体的には、以下のような数式になります。
=MOD(30000-B3,10)+5
// ① 30000-B3:スピンボタンの上を押すと数値が減るようにする
// ② MOD(①,10):氏名の数である10通りを繰り返すように、10で割った余りを取得
// ③ ②+5:10で割った余りは0~9になるため、5を加えて5~14にする

後は、スピンボタンの位置を戻せば完成です。
末尾の次は先頭へ、先頭の前は末尾へ移動します。

▼サンプルファイル▼

複数選択可能なドロップダウンリストを、マクロを使わずに実現する方法について解説しています。
00:00 挨拶
00:12 完成イメージ
00:53 準備
01:08 作成(リストの候補を表示)
07:55 作成(ドロップダウンリスト)
09:28 完成
▼準備ファイル▼

Excelでチェックボックスを使っていると、チェックした値のみを隣に表示したいという場面があります。
表示する際に、対象を上詰めで表示するのではなく、チェックした値と同じ行に表示させた方が、全体の位置も把握しやすいです。
今回は、チェックした氏名だけを同じ行の隣へ自動で表示する方法を紹介します。

※こちらで作成したファイルは、記事の最後にて配布しています。
以下のシートから実現していきます。

こちらで使用するシートの氏名の範囲は3行目から24行目です。
この範囲は自由に変更できます。
まずは氏名の隣の列を選択し、[挿入]タブから[チェックボックス]を選択することで、チェックボックスを用意します。

チェックボックスのセルには、チェックすると「TRUE」、外すと「FALSE」が自動で入力されます。

続いて、チェックした行の氏名を薄い色にします。
まずは、氏名の範囲を選択し、[ホーム]タブから[条件付き書式]の[新しいルール]を選択します。

設定画面で、ルールの種類を[数式を使用して、書式設定するセルを決定]にし、以下の条件式を入力します。
=C3
// 選択基準のセルB3を色付けする条件式(C3がTRUEのとき)

チェックボックスのセルにはTRUE/FALSEが入っているため、以下のように書く必要はありません。
=C3=TRUE
他の選択範囲には、以下のように相対参照で条件式が反映されます。
セルB4 → =C4
セルB5 → =C5
…
あとは[書式]から、[フォント]タブを選択し、[色]をグレーにします。

以上の設定で確定することで、チェックした行の氏名が薄い色になります。

ここからは、チェックした氏名だけを同じ行の隣に表示する方法を紹介します。
たった1つの数式で、簡単に抽出することができます。
こちらのシートの場合、氏名の範囲は3行目から24行目になります。
そのため、先頭である3行目のチェックボックスの隣のセルに、以下の数式を入力します。
=IF(C3:C24,B3:B24,"")
// C列がチェックされている場合(TRUE)はB列の氏名を表示
// チェックされていない場合(FALSE)は空を表示

複数行の範囲を指定することで、以下のように、各行に対して一括で反映することができます。
3行目:=IF(C3,B3, "")
4行目:=IF(C4,B4, "")
…

ここでも、チェックボックスのセルには「TRUE/FALSE」の値が入ってくるため、以下のように書く必要はありません。
※書いても問題ありません。
C3:C24=TRUE
ただ、このままですと、空白行にチェックした際に「0」が表示されてしまいます。

Excelでは、空白のセルへの参照が「0」扱いになってしまいます。
「0」ではなく空として扱いたい場合は、以下のように「&””」を加えるとよいです。
=IF(C3:C24,B3:B24&"","")
空文字を参照元の値に加えることで、常に文字列として表示することができます。

今回は、チェックボックスを使って、
・チェックした行の氏名をグレー表示にする方法
・チェックした氏名だけを同じ行の隣に表示する方法
を紹介しました。
チェックボックスとその値「TRUE/FALSE」を組み合わせるだけで、出席確認や作業管理など、さまざまな場面で活用できます。
▼サンプルファイル▼

※サイト内の限定動画です。
セルを選択して専用フォームに「+10」や「*5」などと「演算子+数値」を入力することで、セルの値に対して直接計算し、上書きすることができる機能の作成方法になります。
計算用のセルを用意する必要がなく、そのセルのみで計算することができます。
>アドインの保存方法から設定方法はこちら
00:00 挨拶
00:36 完成イメージ
01:31 準備
01:54 作成(セル値演算機能)
09:54 作成(クイックアクセスツールバー)
11:36 完成
13:05 プログラムの全体
▼準備ファイル▼

書類フォーマットに入力した値を瞬時に削除(リセット)する仕組みについて、3パターンを紹介しています。
予め指定したセルの値のみを削除することができます。
>マクロの実行を許可する手順
00:00 挨拶
00:34 完成イメージ
01:29 準備
02:06 方法1:名前の定義
04:54 方法2:リセットボタン
10:41 方法3:特定のセル編集
17:56 全体の補足
▼準備ファイル▼

「着手したら進捗を”着手中”に変更し、完了したら”完了”に変更する。」
このようにタスクなどの進捗管理を行う場合、セルを編集して進捗を変更する手間が発生します。

※色付けは条件付き書式で行っています。
>条件付き書式で行全体を色付け
そこで今回は、予め用意したチェックボックスをクリックするだけで、
・(空欄) → 着手中(チェックボックスのチェック解除)
・着手中 → 完了
・完了 → (空欄)
と進捗が自動で更新される仕組みを実現していきます。

※こちらで作成したファイルは、記事の最後にて配布しています。
以下のシートを元に作成していきます。

チェックボックスは、[挿入]タブの[チェックボックス]から作成しています。

今回は、チェックボックスが配置されたセル(B3~B27)を操作すると同時に、処理(D列の進捗を更新)を実行する仕組みを実現します。
そのような、指定したセルを編集すると同時に何かしら処理を実行するには、シートモジュールのイベントプロシージャを活用します。
シートモジュールは、対象シートのタブ上で右クリックし、[コードの表示]を選択することで表示できます。

以下のエディタ画面(VBE)が立ち上がり、対象のシートモジュールが表示されます。

「Option Explicit」はVBEの設定によっては表示されません。「Option Explicit」についての解説はこちらでは省略します。
次に、セルを編集すると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

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

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

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

「Worksheet_Change」内に以下のコードを記述します。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t As Range: Set t = Target
If t.CountLarge = 1 And _
t.Row >= 3 And t.Row <= 27 And _
t.Column = 2 Then
Application.EnableEvents = False
If t.Value = False Then
Cells(t.Row, "D").Value = ""
Else
Select Case Cells(t.Row, "D").Value
Case ""
t.Value = False
Cells(t.Row, "D").Value = "着手中"
Case "着手中"
Cells(t.Row, "D").Value = "完了"
End Select
End If
Application.EnableEvents = True
End If
End Sub
では、処理内容について解説していきます。
Private Sub Worksheet_Change(ByVal Target As Range)
'省略
End Sub
「Worksheet_Change」というイベントプロシージャは、実行されるときに、引数の「Target」に編集されたセルの情報が渡されます。
単体のセルが編集されたなら単体のセル、複数のセルが編集されたなら複数のセルの情報が渡されます。
Dim t As Range: Set t = Target
If t.CountLarge = 1 And _
t.Row >= 3 And t.Row <= 27 And _
t.Column = 2 Then
'省略
End If
編集されたセルの情報(Target)を変数(t)に割り当てています。
そして、そのセルの数が1つであり、行番号が3以上27以下、列番号が2のとき、
要するに、チェックボックスが配置されたセルが、単体でクリックされたときに、Ifの中の処理を実行します。

Application.EnableEvents = False
If t.Value = False Then
Cells(t.Row, "D").Value = ""
Else
Select Case Cells(t.Row, "D").Value
Case ""
t.Value = False
Cells(t.Row, "D").Value = "着手中"
Case "着手中"
Cells(t.Row, "D").Value = "完了"
End Select
End If
Application.EnableEvents = True
Ifの中の処理では、進捗の値を更新します。
セルの値を変更すると、再度「Worksheet_Change」のプロシージャが実行されてしまうので、イベントを一時的に無効にしています。(Application.EnableEvents = False ~ True)
そして、編集されたセルの値がFalseのとき、要するにチェックが外されたときに、進捗を空欄にしています。
チェックされたときは、進捗の値が空欄なら”着手中”にしてチェックを外し、着手中なら”完了”にしています。
以上の内容で、実現できます。
用意されたチェックボックスをクリックするだけで、以下のように進捗が更新されます。

▼サンプルファイル▼

年と月を選択するだけで簡単に表を絞り込みできる仕組みを、Excelの標準機能のみで実現しています。
>テーブルについて
>構造化参照について
00:00 挨拶
00:14 準備
00:31 罫線や背景色のリセット
01:25 テーブル化
02:21 年月の抽出
04:18 スライサーの挿入
06:35 ウィンドウ枠の固定
07:01 スライサーの微調整
08:56 補足
09:32 まとめ
▼準備ファイル▼

請求書などを作成するとき、
・翌月末
・翌月15日
・1か月後
などの日付を毎回手入力していませんか?
実は、このような一定のルールに基づいた日付は、数式で自動入力できます。
今回は、基準日をもとに日付を自動で求める方法を4パターン紹介します。
基準日の翌月末を求めるには、EOMONTH関数を活用します。
=EOMONTH(B3,1)
// B3:基準日
// 1:1か月後

例えば、基準日が「2026/6/3」の場合、結果は「2026/7/31」になります。
基準日の1か月後を求めるには、EDATE関数を使用します。
=EDATE(B3,1)
// B3:基準日
// 1:1か月後

例えば、基準日が「2026/6/3」の場合、結果は「2026/7/3」になります。
基準日の翌月15日を求めるには、DATE関数を使用します。
=DATE(YEAR(B3),MONTH(B3)+1,15)
// YEAR(B3):年の取得
// MONTH(B3):月の取得
// 15:15日を指定

DATE関数は月の繰り上げにも対応しているため、以下のように基準日が12月でも翌年の1月15日を正しく求められます。

他の方法として、EOMONTH関数で当月末を求めて15日後を求めるという方法もあります。
=EOMONTH(B3,0)+15

支払期限が土日の場合は、次の営業日にすることがあります。
そのような日付を求める場合は、WORKDAY.INTL関数を組み合わせます。
=WORKDAY.INTL(DATE(YEAR(B3),MONTH(B3)+1,15)-1,1,1)
// DATE:翌月15日の1日前の日付を求める
// 1:1営業日後の日付を求める
// 1:土日を固定の休みとして設定

例えば、翌月15日(2026/11/15)が日曜日の場合は、自動で翌週の月曜日の日付(2026/11/16)が返されます。
祝日を考慮する場合は、以下のように指定します。
※翌月の18日として求めています。
=WORKDAY.INTL(DATE(YEAR(B3),MONTH(B3)+1,18)-1,1,1,D2:D19)
// D2:D19:祝日一覧の日付の範囲を指定

例えば、翌月18日(2026/7/18)が土曜日、かつ翌週の月曜日が祝日(2026/7/20)の場合は、自動で翌週の火曜日の日付(2026/7/21)が返されます。

毎回カレンダーを確認しながら入力する必要がなくなるため、請求書の請求期限の入力などを効率化できます。


「同じ形式の書類」の入力パターンごとで、ファイルを分けて管理していませんか?
こちらでは「同じ形式の書類」の複数の入力パターンを、1つのファイルで一元管理する方法について紹介しています。
00:00 挨拶
00:36 完成イメージ
01:17 準備
01:48 作成(テーブル)
04:12 作成(ドロップダウンリスト)
05:50 完成
▼準備ファイル▼

以下の表は、複数の担当者のタスクを1つのシートにまとめた一覧表です。

担当者ごとにシートを分けたい場合、毎回シートをコピーして不要な行を削除するのは大変です。

そこで今回は、担当者ごとにシートを自動分割する仕組みの実現方法について解説していきます。

※こちらで作成したファイルは、記事の最後にて配布しています。
こちらでは、以下の1枚のシートのみが存在するファイルを元に実現していきます。

ファイルの用意ができたら、[開発]タブから[マクロ]を選択し、表示された設定画面に「開発する機能の名前」を入力して[作成]を選択します。
こちらでは「シート分割」と入力しています。

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

以下のコードを記述します。
Sub シート分割()
Dim mWs As Worksheet, mRow As Long
Set mWs = Worksheets("全体")
mRow = mWs.Cells(mWs.Rows.Count, "B").End(xlUp).Row
Dim sWs As Worksheet
Dim tName As String
Dim i As Long, j As Long
For i = 3 To mRow
tName = mWs.Cells(i, "D").Value
On Error Resume Next
Set sWs = Worksheets(tName)
On Error GoTo 0
If sWs Is Nothing Then
mWs.Copy After:=Worksheets(Worksheets.Count)
Set sWs = ActiveSheet
sWs.Name = tName
For j = mRow To 3 Step -1
If sWs.Cells(j, "D").Value <> tName Then
sWs.Rows(j).Delete
End If
Next j
End If
Set sWs = Nothing
Next i
End Sub
では、コードについて解説していきます。
Dim mWs As Worksheet, mRow As Long
Set mWs = Worksheets("全体")
mRow = mWs.Cells(mWs.Rows.Count, "B").End(xlUp).Row
対象となるシート情報を変数「mWs」に割り当て、そのシートの表の末尾の行番号を変数「mRow」に格納しています。
末尾の行番号「mRow」は、対象シート(mWs)のB列の末尾のセルを基準に、「Ctrl+↑」で移動して止まった位置のセルの行番号としてします。

Dim sWs As Worksheet
Dim tName As String
Dim i As Long, j As Long
For i = 3 To mRow
'省略
Next i
変数「sWs」は作成・操作するシートを割り当てる用、変数「tName」は担当者名を格納する用です。
今回の分割対象の表は、データが3行目から入力されているため、3行目から表の末尾の行番号までを変数「i」に格納して繰り返しています。

tName = mWs.Cells(i, "D").Value
On Error Resume Next
Set sWs = Worksheets(tName)
On Error GoTo 0
If sWs Is Nothing Then
'省略
End If
Set sWs = Nothing
変数「i」に格納されている値の行の担当者名(D列)を変数「tName」に格納し、その名前のシート情報を変数「sWs」に割り当てています。
しかし、その名前のシートが存在しない場合はエラーになります。
そのため、「On Error」を活用して、エラーの場合は処理を中断せずに無視して続行しています。
エラーの場合は、「Set」の処理が実行されないため、変数「sWs」には何も割り当てられません。
その仕組みを活用し、「If」で変数「sWs」が未割当の場合に別処理(’省略)を実行するようにしています。
最後に変数「sWs」の中身を空に戻し、次の行の処理に進みます。
mWs.Copy After:=Worksheets(Worksheets.Count)
Set sWs = ActiveSheet
sWs.Name = tName
変数「sWs」が空の場合は、変数「tName」の名前のシートが作成されていないことになります。
そのため、元のシート(mWs)をコピーして、コピーされたシートをシートタブの末尾に追加しています。
その追加されたシート情報を変数「sWs」に割り当て、そのシート名を担当者名(tName)に変更しています。
For j = mRow To 3 Step -1
If sWs.Cells(j, "D").Value <> tName Then
sWs.Rows(j).Delete
End If
Next j
表の範囲の行番号を変数「j」に格納して、こちらでは末尾から先頭の行番号へと繰り返しています。
末尾から先頭へ処理している理由は、行を削除すると行番号がずれてしまうためです。
例えば、5行目を削除した場合、6行目だったセルの行番号は5に変わってしまいます。
その次に、5行目の次である6行目の確認を行うと、もともと6行目だったセルの確認を飛ばしてしまうことになります。
末尾から確認することで、削除処理があったとしても行を飛ばさずに確認することができます。
繰り返し処理の中で、変数「j」に格納されている値の行の担当者名(D列)と変数「tName」の値が不一致の場合に、その行を削除しています。
そのため、変数「tName」に格納されている値の担当者名のタスクのみが表に残ります。
以上の手順で完成です。
作成したマクロを実行することで、瞬時に担当者ごとにシートが分割されます。

▼サンプルファイル▼

評価判定を行うときなどにIF関数を使用するのは、場合によっては危険です。
こちらでは、保守を考慮した数式の作成について解説しています。
>テーブルについて
>構造化参照について
00:00 挨拶
00:54 IFS
02:41 表の作成
04:01 VLOOKUP
06:08 XLOOKUP
07:19 テーブル
10:15 まとめ