2025/08/29
【ExcelVBA】差し込みで複数のPDFファイルを自動生成

【ExcelVBA】差し込みで複数のPDFファイルを自動生成

以下の表は、セルC2に入力した値に応じてデータが抽出されるように作られています。

今回は、このセルC2の値を「A→B→C」のように好みの値に切り替えながら、このシートの印刷範囲の内容をPDFファイルにして自動で保存する仕組みを実現していきます。

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


1. 開発手順

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

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

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


2. コードの記述(PDFファイル出力)

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

Sub ExportToPDF()
    
    Dim fPath As String
    fPath = ThisWorkbook.Path
    
    Worksheets("PDF出力").ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=fPath & "\Sample.pdf"
    
End Sub

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

    Dim fPath As String
    fPath = ThisWorkbook.Path

「fPath」という変数(入れ物)を用意し、現在開いているExcelファイルの保存先のフォルダのパスを「fPath」に格納しています。
そのため、取得されるパスは環境により異なります。

こちらの環境の場合は、以下のパスが取得されます。

A:\PDF出力
    Worksheets("PDF出力").ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=fPath & "\Sample.pdf"

「PDF出力」というシートの印刷範囲をPDF形式(Type:=xlTypePDF)で保存しています。
保存先とファイル名は、パスで指定します。
こちらでは以下のように、Excelファイルと同じ配下に「Sample.pdf」という名前で保存しています。

Filename:=fPath & "\Sample.pdf"

以上のコードを実行することで、以下のようにPDFファイルを作成することができます。

ただこのままでは、セルC2の値を手動で変更する必要があります。
そこで、次のように修正します。

ExcelVBAレベル確認

3. コードの記述(引数の設定)

以下のように修正します。

Sub ExportToPDF(fName As String)
    
    Dim fPath As String
    fPath = ThisWorkbook.Path
    
    Worksheets("PDF出力").ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=fPath & "\" & fName & ".pdf"
    
End Sub

では、修正点について解説していきます。

Sub ExportToPDF(fName As String)
    …
        Filename:=fPath & "\" & fName & ".pdf"

ファイル名を「Sample.pdf」から「引数に指定した好みの名前」で保存できるように修正しています。
後は、セルC2の値を変更して、セルのC2の値を「ExportToPDF」の引数に指定して実行するという処理を繰り返します。

そこで、次のようなプロシージャを用意します。


4. コードの記述(差し込み実行)

以下のプロシージャを用意します。

Sub ExportAll()
    
    Dim ws As Worksheet
    Set ws = Worksheets("PDF出力")
    
    Dim val As String
    
    val = "A"
    ws.Range("C2").Value = val
    Call ExportToPDF(val)
    
    val = "B"
    ws.Range("C2").Value = val
    Call ExportToPDF(val)
    
    val = "C"
    ws.Range("C2").Value = val
    Call ExportToPDF(val)
    
End Sub

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

    Dim ws As Worksheet
    Set ws = Worksheets("PDF出力")

「ws」という変数(入れ物)を用意し、「PDF出力」シートの情報を「ws」に割り当てています。

    Dim val As String
    
    val = "A"
    ws.Range("C2").Value = val
    Call ExportToPDF(val)

「val」という変数(入れ物)を用意し、「ws」シートのセルC2に入力したい1つ目の値(仮:A)を「val」に格納しています。
そして、「val」の値を「ws」シートのセルC2に格納した上で、最初に記述した「ExportToPDF」に「val」の値を渡して実行しています。

これで、1つ目のPDFファイルが作成されます。

    val = "B"
    ws.Range("C2").Value = val
    Call ExportToPDF(val)
    
    val = "C"
    ws.Range("C2").Value = val
    Call ExportToPDF(val)

こちらは、先ほどの処理と同様に、「B」という値、「C」という値でも実行しています。


5. 完成

以上の手順で完成です。
作成した「ExportAll」を実行するだけで、以下のように複数のPDFファイルが出力されます。

繰り返し似たような処理を実行する場合は、重複する処理の内容を1つのプロシージャ(ExportToPDF)にまとめておくことで、処理全体が見やすく保守しやすいコードになります。

▼サンプルファイル▼

2025/08/22
【ExcelVBA】複数のExcelファイルから必要なデータのみを自動抽出

【ExcelVBA】複数のExcelファイルから必要なデータのみを自動抽出

定期的に送られてくる複数のExcelファイルを、以下のようにまとめるのは、手作業だと大変です。

ということで、「指定したフォルダ内のExcelファイルから、必要なデータを自動で抽出してまとめる仕組み」の実現方法について解説していきます。

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

ExcelVBAレベル確認

1. 開発準備

今回は、フォルダのパスをインプットボックスに入力してから実行するだけで、以下のシートに、該当する項目のデータを抽出する仕組みを、VBAを活用して実現します。

まずは、[開発]タブから[マクロ]を選択し、表示された画面の[マクロ名]に好みの名前(例:ImportSalesData)を入力して、[作成]を選択します。

以上の手順で、入力したマクロ名のプロシージャが表示されるため、そのプロシージャを活用します。
「Option Explicit」は、VBE(エディタ画面)の設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。


2. コードの記述

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

Sub ImportSalesData()
    
    Dim fP As String, fN As String
    fP = InputBox("フォルダパス")
    fN = Dir(fP & "\*.xlsx")
    
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)
    Dim r As Long, c As Long
    r = 3
    
    Do While fN <> ""
        With Workbooks.Open(fP & "\" & fN)
            For c = 2 To 5
                ws.Cells(r, c).Value = _
                    .Worksheets(1).Cells(c, "C").Value
            Next c
            .Close
        End With
        r = r + 1
        fN = Dir()
    Loop
    
End Sub

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

    Dim fP As String, fN As String
    fP = InputBox("フォルダパス")
    fN = Dir(fP & "\*.xlsx")

対象のフォルダのパスを格納する用の変数「fP」と、そのフォルダ内の1つのExcelファイルの名前を格納する用の変数「fN」を用意しています。

そして、「fP」には、インプットボックスに入力した値(対象のフォルダのパスを入力する想定)を格納し、「fN」には、その「fP」のフォルダの中に格納されている1つ目のファイル名を格納しています。
「fP & “\*.xlsx”」で、「フォルダパス\*.xlsx」というファイルのパスを作成し、Dirで該当するファイルの名前を取得しています。
※「*」は0文字以上の任意の文字という意味です。

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)
    Dim r As Long, c As Long
    r = 3

シート情報を格納する用の変数「ws」を用意し、抽出先のファイル(コードを記述している自分自身のファイル)の先頭のシート情報を格納しています。

次に、対象のシート(ws)に、抽出内容を入力するセルの位置を指定するための行番号と列番号を格納する用の変数「r:rowの略、c:columnの略」を用意しています。
行番号を格納する用の変数「r」には、予め「3」を格納しています。

    Do While fN <> ""
        '省略
        fN = Dir()
    Loop

指定したフォルダ内に該当するファイルが見つからない場合は、「fN」が空になります。
そのため、ここでは「fN」が空でない場合に、「Do」から「Loop」の中を実行するようにしています。

最後に「fN = Dir()」と記述することで、「fN」の中に次のファイル名が格納されます。
次のファイルが存在しない場合は、ファイル名を取得できないため、「fN」が空になります。

そして、再度、「Do」に戻り、「fN」が空になるまで繰り返して実行されます。

        With Workbooks.Open(fP & "\" & fN)
            For c = 2 To 5
                ws.Cells(r, c).Value = _
                    .Worksheets(1).Cells(c, "C").Value
            Next c
            .Close
        End With
        r = r + 1

繰り返しの中で行う処理です。
「Workbooks.Open(fP & “\” & fN)」で、指定したフォルダ(fP)内の対象のファイル名(fN)のファイルを開いています。
「With」で指定することによって、「With」から「End With」の中で「.」から記述したコードは、開いたファイルの情報に対しての処理になります。

「For」から「Next」の中を、変数「c」の値を2から5まで順番に変化させて繰り返し実行しています。
「2から5」というのは、抽出先の表のB列からE列までの列番号になります。

「For」の中で、抽出先のシートの「r」行目「c」列目のセルに、開いたブックの先頭のシートの「c」行目C列にある値を入力しています。

抽出先のシートの2列目には、抽出元のシートの2行目、
抽出先のシートの3列目には、抽出元のシートの3行目、
という感じに行番号と列番号が、行と列が逆の関係にあるため、上記のような処理になります。

1つのファイルの内容の入力ができたら、次のファイルに移る前に「r = r + 1」で行番号に1を加えています。


3. 完成

以上の内容で実現できます。
実行する際は、[開発]タブの[マクロ]を選択し、表示された画面から開発したマクロ名を選択して[実行]を選択します。

次に、表示されたインプットボックスに、抽出元のファイルが格納されたフォルダのパスを入力して確定します。

これでだけで、以下のように、指定したフォルダ内のすべてのExcelファイルの内容を抽出することができます。

▼サンプルファイル▼

2025/08/17
【業務】繰り返しタスクにも対応!タスク管理アプリ

【業務】繰り返しタスクにも対応!タスク管理アプリ

#タスク #アプリ

YouTubeで開く

繰り返しタスクにも対応した「タスク管理アプリ」の作成方法について解説しています。
誰でも簡単に、ノーコードで作成できる内容です。

00:00 はじめに
01:02 完成イメージ
01:59 表の作成
03:10 データ設定変更
06:35 未完了タスク一覧作成
09:58 カレンダー作成
10:53 アクションボタン作成
14:08 デザイン変更
14:47 繰り返しタスク機能作成(IT予備メンバー限定)
14:52 まとめ
15:11 プレゼントについて


IT予備メンバーに加入して連携すると、メンバー限定動画に切り替わります。

※サイト内の限定動画です。

繰り返しタスクにも対応した「タスク管理アプリ」の作成方法について解説しています。
誰でも簡単に、ノーコードで作成できる内容です。

00:00 はじめに
00:35 完成イメージ
01:32 表の作成
02:42 データ設定変更
06:07 未完了タスク一覧作成
09:31 カレンダー作成
10:25 アクションボタン作成
13:41 デザイン変更
14:20 繰り返しタスク機能作成(IT予備メンバー限定)
20:21 まとめ

2025/08/15
【Excel】XLOOKUP関数を使って複数条件で検索

【Excel】XLOOKUP関数を使って複数条件で検索

以下の表を例に、XLOOKUP関数を使って複数条件で検索する方法について紹介していきます。

セルF3に「日付」、G3に「商品」を入力し、左側の表から該当するデータの「売上」を、セルH3に抽出する数式を作っていきます。


複数条件で検索する

XLOOKUP関数では、複数の項目を繋げた値に対して検索することができます。
そのため、今回の表では、「日付」と「商品」を繋げて1つの値として検索させます。

具体的には、以下のような数式になります。

=XLOOKUP(F3&G3,B3:B18&C3:C18,D3:D18,"")
// F3&G3:検索値は、検索したい「日付」と「商品」を&で繋げた文字列
// B3:B18&C3:C18:検索範囲は、対象の表の「日付」と「商品」を&で繋げた文字列(18は表の最後の行番号)
// D3:D18:抽出範囲は、「売上」の項目(18は表の最後の行番号)
// "":見つからない場合は、何も表示しない

これだけで、複数項目での検索ができ、必要な値を抽出できます。


正しく検索できない場合と対策

複数の項目を繋げた際に、重複した文字列ができる場合があります。
例えば、以下の表の「グループ」と「商品」を繋げた場合です。

この表ですと、以下の2つのデータが重複してしまいます。
・グループ「A」、商品「BA」→「ABA」
・グループ「AB」、商品「A」→「ABA」

そのため、以下の数式では、正しく検索できない場合があります。

=XLOOKUP(F3&G3,B3:B18&C3:C18,D3:D18,"")

上記の例のように、複数の項目を繋げた際に重複した文字列ができる場合は、対策する必要があります。

その対策とは、項目と項目の間に区切り文字を入れるという方法です。
以下では、「-」を加えて対策しています。

=XLOOKUP(F3&"-"&G3,B3:B18&"-"&C3:C18,D3:D18,"")

区切り文字を加えることで、「AB-A」と「A-BA」という感じに重複していた文字列が異なる文字列となり、正しく検索し、正しい値を抽出することができるようになります。

2025/08/08
【便利】データを自由に移動できる機能

【便利】データを自由に移動できる機能

#ActiveCell #Offset #If #Selection #TypeName

※サイト内の限定動画です。

対象のデータ行を自由に移動することができる機能の開発方法になります。
対象のデータを選択し、ボタン1つで「上、下、交換」といった操作が行えます。

00:00 挨拶
00:12 完成イメージ
01:58 準備
02:28 作成(ウィンドウ枠の固定)
03:04 作成(データ交換機能)
09:23 作成(データ交換機能の汎用化)
09:59 作成(上に移動する機能)
12:52 作成(下に移動する機能)
14:10 作成(2つの行を交換する機能)
16:53 作成(実行ボタン)
18:03 完成
18:47 補足(警告を表示)
19:24 プログラムの全体
23:29 プレゼントについて

▼準備ファイル▼

2025/08/08
【Excel】条件付き書式で文字数チェック機能を実現

【Excel】条件付き書式で文字数チェック機能を実現

文字数制限のあるSNSの投稿文などを作成する際に便利な、文字数をチェックする機能の作り方について解説していきます。

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

ExcelVBAレベル確認

仕様

今回は、以下の仕様で作っていきます。

1. 入力した文字数に応じて残りの文字数を表示
2. データバーで視覚的に残りの文字数を表示
3. 制限を超えた場合は赤色で表示
4. 「残り○文字」という形式で表示

使用するシートは以下になります。

セルB3に文字を直接入力し、セルB2に残りの文字数を表示する想定です。

では、順番に作っていきます。


1. 入力した文字数に応じて残りの文字数を表示

今回は、50文字を制限とした文字数チェック機能を作っていきます。
まずは、残りの文字数をセルB2に表示させるため、以下のような数式を入力します。

=50-LEN(B3)
// LEN(B3):セルB3に入力されている文字数を取得

文字数の制限を変更する場合は、数式内の「50」を変更してください。


2. データバーで視覚的に残りの文字数を表示

では次に、残りの文字数を視覚的にデータバーとして表示していきます。
データバーの設定は「条件付き書式」で行います。

先ほど数式を入力したセルを選択し、[ホーム]タブから[条件付き書式]の[新しいルール]を選択します。

表示された画面で、ルールの種類を[セルの値に基づいてすべてのセルを書式設定]にし、以下の設定を行います。

・書式スタイル:データバー
・最小値:数値「0」
・最大値:数値「50」(制限する文字数)
※色などは必要に応じて変更してください。

上記の設定で確定することで、以下のようにデータバーを表示することができます。


3. 制限を超えた場合は赤色で表示

現状の設定のままですと、文字数の制限を超えた場合は、マイナスの値が表示されるだけになります。

そのため、マイナスの値の場合(文字数の制限を超えた場合)は、セルの背景色を赤色にして目立たせていきます。

先ほど数式を入力したセルを選択し、[ホーム]タブから[条件付き書式]の[新しいルール]を選択します。

表示された画面で、ルールの種類を[指定の値を含むセルだけを書式設定]にし、以下の設定を行います。

・[セルの値]、[次の値より小さい]、「0」

次に、[書式]を選択し、以下の設定を行います。

・[塗りつぶし]タブ → 赤
・[フォント]タブ → 色 → 白

上記の設定で確定することで、以下のように文字数の制限を超えているときに、赤色にすることができます。

ExcelVBAレベル確認

4. 「残り○文字」という形式で表示

最後に、数値を「残り○文字」という形式にしていきます。
数値を変えずに見た目のみを変更するには「表示形式」を活用します。

先ほど数式を入力したセルの上で右クリックし、[セルの書式設定]を選択します。

表示された画面の[表示形式]タブを選択し、[ユーザー定義]にて以下の内容を入力します。

"残り"0"文字";"残り"-0"文字"

表示形式については、以下の記事にて詳しく解説しています。
>【1-入門04】セルの表示形式の基礎から応用

上記の設定で確定し、必要に応じて、太字や中央揃えといった設定を行います。

ExcelVBAレベル確認

完成

以上の手順で完成です。
セルB3に入力された文字数に応じて、セルB2の表示が切り替わります。

▼サンプルファイル▼

2025/08/01
【ExcelVBA】保存時に自動でバックアップファイルを作成

【ExcelVBA】保存時に自動でバックアップファイルを作成

一部を修正して上書き保存した後に、「やらかした!」と気づいた経験はないですか?
ローカル上に保存しているファイルの場合、上書き保存する前のデータに戻すことは困難になります。

そこで今回は、保存時にバックアップファイルを自動で作成する仕組みの実現方法について解説していきます。

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


1. 開発手順

今回は、対象のファイルを上書き保存すると同時に、予め指定したフォルダ内にバックアップファイルを作成するという仕組みを実現します。
対象のファイルを保存すると同時に何かしらの処理を実行するには、「ブックモジュール」を活用します。

ブックモジュールは、[開発]タブから[Visual Basic]を選択し、表示された画面(VBE)のプロジェクトエクスプローラーから[ThisWorkbook]を選択することで表示することができます。

[開発]タブが表示されていない場合は、「Alt + F11」でもVBEの画面を開くことができます。
また、プロジェクトエクスプローラーが表示されていない場合は、「Ctrl + R」で表示することができます。

次に、ファイルを保存したときに、保存される前に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、ブックモジュールの左上のリストから[Workbook]を選択します。

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

ただ、今回使用するイベントプロシージャは、ファイルを保存したときに、保存される前に処理が実行されるものになります。
そのため、右上のリストから[BeforeSave]を選択します。

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

ExcelVBAレベル確認

2. コードの記述

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

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    Dim fP As String
    fP = Me.Path & "\_bk"
    Dim fN As String
    fN = Format(Now, "yyyymmdd_hhnn") & ".xlsm"
    
    Me.SaveCopyAs fP & "\" & fN
    
End Sub

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

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    
    '省略
    
End Sub

「Workbook_BeforeSave」というプロシージャは、対象のファイルを保存したときに、保存される前に実行されます。
処理が完了すると同時に、対象のファイルは保存されます。
今回は使用しませんが、引数の「Cancel」を処理内でTrue(Cancel = True)にすると、処理が完了した後に保存されなくなります。

    Dim fP As String
    fP = Me.Path & "\_bk"

変数「fP」にバックアップファイルを保存する先のフォルダのパスを格納しています。
こちらでは、対象のExcelファイルが保存されているフォルダ内の「_bk」というフォルダのパスを指定しています。

「Me.Path」で自分自身(コードを記述しているファイル)が格納されているフォルダのパスを取得し、「&」で「_bk」フォルダのパスを加えています。

    Dim fN As String
    fN = Format(Now, "yyyymmdd_hhnn") & ".xlsm"

変数「fN」にバックアップファイルを保存する際のファイル名を格納しています。
ファイル名は、「現在の日付_現在の時刻.xlsm」となるように指定しています。

    Me.SaveCopyAs fP & "\" & fN

自分自身(コードを記述しているファイル) のコピーを保存しています。
保存先やファイル名は、変数「fP」と「fN」を活用して指定しています。


3. 完成

以上の内容で実現できます。
開発したファイル(以下の画像では「お問い合わせ管理.xlsm」)を開いて上書き保存すると同時に、同じ配下の「_bk」フォルダ内にバックアップファイルが作成されます。

ファイルは1分単位の名前で保存されるので、1分以内に繰り返し保存した場合は、バックアップファイルの同じ名前のファイルが上書きされます。

▼サンプルファイル▼

2025/07/25
【Excel】表から自動で請求書を作成する方法

【Excel】表から自動で請求書を作成する方法

数式を使うことで、請求書の作成をある程度自動化することができます。
今回は、請求日と顧客名を入力するだけで、自動で請求書が作成される仕組みを紹介していきます。

今回は、以下の請求書を目標にした手順を解説していきます。

【条件】
・請求日には1日の日付を入力する
・入力した顧客名の住所を「顧客情報」シートから数式で抽出
・請求日に入力した日付を基準に、先月の対象顧客の請求データを「請求一覧」シートから数式で抽出
・他の項目(各金額、小計、消費税、合計金額)にはあらかじめ数式を入力

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


1. 準備

今回は、以下の3つのシートを含むファイルを活用して実現していきます。

・「請求書」シート

黄色のセルにはあらかじめ数式を入力しています。
これらの数式についての解説は、こちらでは省略します。
※配布ファイルには入力済みです。

・「請求一覧」シート

「日付、顧客名、摘要、数量、単価」の項目で成り立つ表を用意しています。
こちらの表の「日付」と「顧客名」を基準に、請求データを抽出する数式を作成していきます。

・「顧客情報」シート

「顧客名、住所」の項目で成り立つ表を用意しています。
こちらの表の「顧客名」を基準に、顧客の住所を抽出する数式を作成していきます。


2. 顧客住所の抽出

顧客名を入力すると同時に、顧客の住所を自動で表示させます。
XLOOKUP関数を使用して表示します。

顧客名から顧客の住所を抽出する数式は、以下になります。

=XLOOKUP(B6,顧客情報!A:A,顧客情報!B:B,"")
// B6:検索値(顧客名が入力されたセル)
// 顧客情報!A:A:検索範囲(顧客情報シートのA列全体)
// 顧客情報!B:B:戻り範囲(顧客情報シートのB列全体)
// "":見つからない場合は空白を表示

上記の数式をセルB4に入力するだけで、顧客の住所を表示することができます。


3. 請求データの抽出

次に、請求日と顧客名を入力すると同時に、対象期間の請求データを自動で表示させます。
FILTER関数を使用して表示します。
請求日には、各月の1日の日付が入力させる前提で作成していきます。

請求日と顧客名から請求データを抽出する数式は、以下になります。

=FILTER(請求一覧!C:E,
(請求一覧!B:B=請求書!B6)*
(請求一覧!A:A>=EDATE(請求書!E4,-1))*
(請求一覧!A:A<=請求書!E4-1),"")
// 請求一覧!C:E:請求一覧シートの摘要、数量、単価の列を抽出
// 請求一覧!A:A>=EDATE(請求書!E4,-1):請求日1か月前以降
// EDATE(請求書!E4,-1):請求日の1か月前の日付
// 請求一覧!A:A<=請求書!E4-1:請求日の前日以前
※FILTER関数で複数条件を指定するときは「*」(And)または「+」(Or)で条件式を並べる

上記の数式をセルB11に入力するだけで、請求データを表示することができます。※数式の改行はなくても問題ないです。
請求データが表示されると同時に、他の項目(各金額、小計、消費税、合計金額)の数式が計算され、請求書が完成します。


4. 完成

以上の内容で完成です。
今後は、「請求一覧」シートに請求データを登録し、請求書を発行するときに、請求日(対象月の1日)と顧客名を入力するだけで、請求書(先月の請求データ)を作成することができます。


まとめ

今回の仕組みを使えば、毎月の請求書を作成する時間を短縮できます。
ぜひ試してみてください。

▼サンプルファイル▼

2025/07/18
【Excel】タスク管理表で自分のタスクを自動色付け

【Excel】タスク管理表で自分のタスクを自動色付け

プロジェクトの進行管理では、区分ごとの工程に順序があるタスク管理表がよく使われます。
しかし、このような表を使う際に以下のような問題が発生することがあります:

・絞り込みを使用した場合:自分のタスクのみを表示できるが、全体の流れが分からなくなる

・絞り込みを使用しない場合:全体の流れは把握できるが、自分のタスクが分かりづらく、見落としてしまう可能性がある

この問題を解決するために、現在編集中のタスクの担当者と同じ担当者のセルを自動で色付けする仕組みを作成していきます。

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

ExcelVBAレベル確認

設定
1. 対象セルの選択

1.担当者列(D列)全体を選択

2.不要なセル(ヘッダー行など)を、Ctrlキーを押しながらクリックして選択解除
→ 最終的にセルD3以降が選択された状態にする


2. 条件付き書式の設定

1.[ホーム]タブから[条件付き書式]の[新しいルール]をクリック

2.[ルールの種類]で[数式を使用して、書式設定するセルを決定]を選択

3.以下の数式を入力

=AND(D3<>"",D3=INDIRECT("D"&CELL("row")))
// D3<>"":D3セルが空でない
// D3=INDIRECT("D"&CELL("row")):D3の値が現在アクティブな行のD列の値と同じ
// CELL("row"):現在アクティブなセルの行番号を取得
// INDIRECT(…):指定したアドレスのセルの値を取得

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


完成

以上の手順で、完成です。
設定後は、以下の操作で色付けが自動更新されます:

・タスクのいずれかの項目を編集する

・F9キーを押して数式を再計算する

この設定により、タスク管理表の全体を表示したまま、操作した担当者のタスクが一目で分かるようになります。
そのため、全体の流れを把握しながら、自分のタスクを効率的に管理できるようになります。


まとめ

条件付き書式を活用することで、タスク管理表の使い勝手を大幅に向上させることができます。
ぜひお試しください。

▼サンプルファイル▼

2025/07/11
【ExcelVBA】誤操作防止!実行ボタンを押したときに確認画面を表示する

【ExcelVBA】誤操作防止!実行ボタンを押したときに確認画面を表示する

マクロの実行ボタンが配置されたExcelファイルを使っている際に、「実行ボタンをうっかり押してしまった…」という経験、ありませんか?
特に重要な処理を含むマクロでは、誤操作が思わぬトラブルにつながることもあります。

そんな時におすすめなのが、「確認画面」を実行時に表示する方法です。
実行ボタンを押した際に、ユーザーに実行してよいのか確認を求めることで、誤操作を防ぐことができます。

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

ExcelVBAレベル確認

1. 設定

まずは、「確認画面」を表示したい対象の実行ボタンの上で右クリックし、[マクロの登録]を選択します。

[マクロの登録]画面が表示されましたら、[編集]を選択します。

[編集]を選択すると、対象のプロシージャ(Sub~End Sub)が表示されます。
こちらでは、以下の処理が表示されたとします。

Sub UpdateData()
    
    Range("C4:C23").Value = Range("D4:D23").Value
    Range("D4:D23").ClearContents
    
End Sub

後は、このプロシージャ内に「確認画面」を表示する処理を記述します。
具体的には、元々の処理の先頭に、以下のコードを記述します。

Sub UpdateData()
    
    If MsgBox("本当に実行しますか?", _
        vbExclamation + _
        vbYesNo + vbDefaultButton2) = vbNo Then Exit Sub
    
    Range("C4:C23").Value = Range("D4:D23").Value
    Range("D4:D23").ClearContents
    
End Sub

「If」の処理は、「Then」の後に1つの処理を記述することで、「End If」を省略することができます。
複数の処理を記述する場合は、「Then」の後で改行して、処理を「End If」で囲む必要があります。
「□_」(□は半角スペース)は、本来改行しない位置で改行する場合に入力します。
こちらでは、コードの全体が見やすいように改行しています。

メッセージボックスを表示する処理を追記しています。
それぞれの設定値は、以下のような意味です。

以下のコードにて、表示されたメッセージボックスで「はい」を選択した場合は「vbYes」、「いいえ」を選択した場合は「vbNo」の値が返されます。

MsgBox("本当に実行しますか?", vbExclamation + vbYesNo + vbDefaultButton2)

そのため、その結果が「vbNo」の場合に、処理を終了する旨を記述しています。

If MsgBox(…) = vbNo Then Exit Sub
ExcelVBAレベル確認

2. 完成

以上の手順で完成です。
実行ボタンを押すと、警告音付きの確認画面が表示されます。
また、「いいえ」がデフォルト選択なので、Enterキーを誤って押しても実行されません。
「はい」を選択したときのみ、マクロが実行されます。


3. まとめ

既存のコードの先頭に追記するだけで、マクロの誤操作を防止できます。
そのため、誤操作に悩まされている場合は、ぜひ取り入れてほしいテクニックです。

▼サンプルファイル▼

2025/07/04
【ExcelVBA】選択するだけでテンプレ入力

【ExcelVBA】選択するだけでテンプレ入力

以下は、従業員を管理するための表です。

「勤務形態」によって、ある程度決まった入力パターンが存在します。
毎回同じような内容を手入力するのは、正直かなり手間です。
とはいえ、勤務形態ごとに例外が発生することもあるため、VLOOKUP関数などの数式だけでは柔軟に対応できません。

そこで今回は、「勤務形態」に応じたテンプレートデータを自動で入力する仕組みを実現する方法について解説していきます。

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

ExcelVBAレベル確認

1. 開発準備

今回は、上のテンプレート一覧の表の各行に入力ボタンを設けます。
そして、ボタンを押すと同時に、下の表の最終行に値のみが入力されるといった仕組みを開発します。

ただ、テンプレートの数が多い場合などは、ボタンを複数配置するのは大変です。
そのため今回は、実際のボタンではなく、ボタン風にデザインしたセルの上を選択すると同時に、処理が実行されるといった仕組みにしていきます。

ボタン風のデザインは、罫線や背景色などの書式設定を活用して実現しています。

今回のように、「特定のシートの特定のセルを選択すると同時に、何かしら処理を実行する」、そのような仕組みを実現するには、「シートモジュール」を活用します。

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

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

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

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


2. コードの記述

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    If Target.CountLarge= 1 Then
        If Target.Row >= 3 And _
            Target.Row <= 5 And _
            Target.Column = 1 Then
            
            Dim tR As Long, lR As Long
            tR = Target.Row
            lR = Cells(Rows.Count, "A").End(xlUp).Row + 1
            
            Range(Cells(lR, "B"), Cells(lR, "D")).Value = _
                Range(Cells(tR, "B"), Cells(tR, "D")).Value
            
        End If
    End If
    
End Sub

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    If Target.CountLarge= 1 Then
        '省略
    End If
    
End Sub

「Worksheet_SelectionChange」というプロシージャの引数の「Target」に、選択されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが選択されたかどうかを確認しています。
こちらでは、選択されたセルが1つのみであることを確認しています。

        If Target.Row >= 3 And _
            Target.Row <= 5 And _
            Target.Column = 1 Then
            
            '省略
            
        End If

次に、選択されたセルの行番号が3以上、5以下、列番号が1であることを確認しています。
これは、ボタン風のデザインがされたセルの範囲内を指しています。

            Dim tR As Long, lR As Long
            tR = Target.Row
            lR = Cells(Rows.Count, "A").End(xlUp).Row + 1

以上の条件を満たしたときに、変数(tR)に選択されたセルの行番号、変数(lR)に下の表の最終行に1を加えた数値を格納しています。
変数(lR)に関しては、「Cells(Rows.Count, “A”)」でシートの末尾のA列のセルを指定し、「.End(xlUp)」で「Ctrl+↑」と同じように移動し、その止まった位置の行番号(.Row)に1を加えています。

            Range(Cells(lR, "B"), Cells(lR, "D")).Value = _
                Range(Cells(tR, "B"), Cells(tR, "D")).Value

最後に、先ほど取得した変数(tR、lR)を活用し、下の表の、最終行の1つ下の行のB列からD列に、選択された行のテンプレート一覧の表のB列からD列の値を入力しています。


3. 完成

以上の内容で完成です。
テンプレート一覧表の隣の「入力」と書かれたセルを選択すると同時に、下の表の末尾に自動で反映されます。

また、数式ではなく直接値が入力されるため、必要に応じて直接修正することもできます。

テンプレート一覧表を更新したとしても、既存の登録データには影響ありません。

▼サンプルファイル▼

2025/06/29
【業務】進捗別でシート見出しの色を自動変更

【業務】進捗別でシート見出しの色を自動変更

#条件付き書式 #データの入力規則 #リスト #シートモジュール #Worksheet_Change #If

※サイト内の限定動画です。

シート内のタスクの進捗が完了になった時に、自動でシート見出しの色を変更(更新)する仕組みについて解説しています。

00:00 挨拶
00:20 完成イメージ
02:58 準備
03:19 作成(ステータスのリスト)
04:23 作成(セルの色変更)
07:33 作成(シート見出しの色変更)
14:03 完成
15:17 プログラムの全体
16:26 プレゼントについて

▼準備ファイル▼