2026/01/23
【ExcelVBA】ボタンを押すだけで「データ削除&上詰め」

【ExcelVBA】ボタンを押すだけで「データ削除&上詰め」

こちらでは、削除したいデータのいずれかのセルを選択して、「選択行の削除」ボタンを押すだけで、その行のデータを削除して上に詰めることができる機能の実現方法について紹介していきます。

以下のように、予め指定した列(「名前」と「性別」)のみが削除されます。

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

ExcelVBAレベル確認

1. 開発準備

こちらでは、以下の表を元に実現していきます。

今回は、削除対象の項目は「名前」と「性別」とし、「No」は削除されないように実現していきます。

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

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

ExcelVBAレベル確認

2. コードの記述

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

Sub DeleteSelectedData()
    
    Dim r As Long
    r = ActiveCell.Row
    
    If r < 3 Or r > 12 Then Exit Sub
    
    With Range(Cells(r, "C"), Cells(r, "D"))
        .ClearContents
        .Cut
    End With
    Range("C13").Insert Shift:=xlDown
    
End Sub

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

    Dim r As Long
    r = ActiveCell.Row

数値を格納する用の変数(r)を用意し、アクティブになっているセルの行番号(ActiveCell.Row)を格納しています。

    If r < 3 Or r > 12 Then Exit Sub

先ほど取得した行番号が、3未満、または12より大きい場合、要するに今回使用する表のデータ行以外がアクティブな場合に、処理を終了(Exit Sub)しています。

「If」は処理を1行で記述できる場合、「End If」を省略することができます。

    With Range(Cells(r, "C"), Cells(r, "D"))
        .ClearContents
        .Cut
    End With
    Range("C13").Insert Shift:=xlDown

アクティブセルの行の削除対象の範囲(r行目のC列からD列)を指定し、値のみを削除(ClearContents)して切り取り(Cut)、そして末尾(セルC13を基準)に挿入(Insert)しています。

単純にセルを削除してしまうと、以下のように罫線が崩れてしまうため、このような手順で実装しています。

ExcelVBAレベル確認

3. ボタンの作成

コードが完成したら、実行用のボタンを用意します。

ボタンは、[開発]タブの中の[挿入]から作成することができます。
ボタンには開発した機能「DeleteSelectedData」を割り当てます。


4. 完成

以上の手順で完成です。
削除したいデータのいずれかのセルを選択して、「選択行の削除」ボタンを押すだけで、その行のデータを削除して上に詰めることができます。

▼サンプルファイル▼

2026/01/16
【Excel】カレンダーで予定がある日のみ自動色付け

【Excel】カレンダーで予定がある日のみ自動色付け

スケジュール表に予定が入力されている日付を、カレンダーに自動で色付けする方法について紹介していきます。

以下の例では、予定がある日付が黄色で色付けされています。

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


1. 準備

以下のようなシートを用意します。

今回の設定を1度行えば、年月日を変更しても活用することができます。
日付の「年、月、日」が入力されているセルには、それぞれの値を表す数値のみが入力されています。

こちらでは、同じシート上に、カレンダーとスケジュール表を用意していますが、必要に応じて別のシートに分けても実現できます。

ExcelVBAレベル確認

2. 色付けする条件

では次に、カレンダーを色付けする条件を具体的にしていきます。

まずは、1日を色付けするかどうかを判定する条件について考えていきます。
カレンダーの1日のセルH4を色付けするときは、J列の1日の行のL列の予定に何かしら値が入力されているときです。

カレンダーのセルやスケジュール表のセルは、日によって異なります。
1つ1つのセルに条件付き書式を個別に設定するのは大変なので、共通で使える条件を考える必要があります。

その条件は、以下になります。

スケジュール表の日付の中で、カレンダーの対象セルの値と一致し、尚且つ、スケジュール表の対象行の予定に何かしら値が入力されている場合

この内容を数式で表現すると、以下のようになります。

=COUNTIFS(J4:J34,B4,L4:L34,"<>")
// ★カレンダーのセルB4を色付けするかどうかの条件
// J4:J34の中でB4の値と一致した行のL列が空でない場合
// 上記の条件を満たしているデータの件数を返す
// → 対象がない場合は結果が「0」になる
ExcelVBAレベル確認

3. 条件付き書式の設定

次に、先ほどの以下の条件式を元に、条件付き書式に設定していきます。

=COUNTIFS(J4:J34,B4,L4:L34,"<>")
// ★カレンダーのセルB4を色付けするかどうかの条件
// J4:J34の中でB4の値と一致した行のL列が空でない場合
// 上記の条件を満たしているデータの件数を返す
// → 対象がない場合は結果が「0」になる

上記の数式のように、結果が「TRUE/FALSE」でない数値の場合、結果が「0」ならFALSE、「0以外」ならTRUE扱いになります。

まずは、カレンダーの日付の範囲を全て選択し、[ホーム]タブの中から[条件付き書式]の[新しいルール]を選択します。

条件付き書式の設定画面にて、[ルールの種類]を[数式を使用して、書式設定するセルを決定]を選択します。

表示されたテキストボックスに、先ほどの条件式を入力するのですが、注意点があります。
入力した条件式は、選択基準のセルを軸に、他の範囲に相対参照で反映されます。

以下のように、セルB4を基準に選択している場合は、先ほどの条件式が使えるのですが、他の範囲には正しく反映されません。

=COUNTIFS(J4:J34,B4,L4:L34,"<>")

正しく反映させるためには、スケジュール表の範囲を以下のように固定する必要があります。

=COUNTIFS($J$4:$J$34,B4,$L$4:$L$34,"<>")
// $J$4:$J$34:スケジュール表の日付の範囲(絶対参照)
// B4:カレンダーの基準のセル(相対参照)
// $L$4:$L$34:スケジュール表の予定の範囲(絶対参照)

上記の条件式を設定画面に入力し、[書式]より「条件を満たしたときに反映させる書式」を指定します。
以下の画面では、[塗りつぶし]タブから黄色を指定しています。

上記の設定で確定することで、完成です。


4. 完成

以下のように、予定が入力されているカレンダーの日付のみ色付けされることが確認できます。

年月日に関しては、必要に応じて変更していただけます。

▼サンプルファイル▼

2026/01/09
【Excel】効率的に役割を割り当てる設定

【Excel】効率的に役割を割り当てる設定

1人1つの役割で、役割ごとに必要な人数が決まっている場合、以下の表のようだと、どこに何人割り当てたのかが分かりづらく、誤った割り当てにも気づきにくいです。

そこで今回は、1つ1つ割り当てると同時に、重複入力や人数超過の可能性のある項目が自動で色付けされる仕組みの作り方について紹介します。

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


1. 実現方法

値を入力すると同時に、ある条件を満たしたセルを色付けするには『条件付き書式』を活用します。
単純な条件でない場合は「色付けする条件」を数式で表現して、条件付き書式に設定する必要があります。


2. 条件式の用意

まずは、特定のセルについて、色付けする条件を考えていきます。

例えば、セルC4の場合、

このセルを色付けする必要があるときは、以下の複数の条件を満たしたときになります。

・セルC4は空
・C列(セルC4~C13)に入力されている値の数がセルC3の必要人数を満たしている、もしくは、4行目(セルC4~G4)のいずれかに値がすでに入力されている

この複数の条件を数式で表現すると、以下のようになります。

=AND(C4="",OR(COUNTA(C4:C13)>=C3,COUNTA(C4:G4)>=1))

他のセルについても考えると、以下のようになります。

【セルC5】

=AND(C5="",OR(COUNTA(C4:C13)>=C3,COUNTA(C5:G5)>=1))

【セルC6】

=AND(C6="",OR(COUNTA(C4:C13)>=C3,COUNTA(C6:G6)>=1))

【セルD4】

=AND(D4="",OR(COUNTA(D4:D13)>=D3,COUNTA(C4:G4)>=1))

【セルD5】

=AND(D5="",OR(COUNTA(D4:D13)>=D3,COUNTA(C5:G5)>=1))

ここから分かることは、必要人数を確認する範囲の行番号、各行の値の有無を確認する範囲の列名は、以下のように「$」で固定する必要があるということです。

=AND(C4="",OR(COUNTA(C$4:C$13)>=C$3,COUNTA($C4: $G4)>=1))

3. 条件付き書式の設定

作成した以下の数式は、セルC4を基準にした条件式です。

=AND(C4="",OR(COUNTA(C$4:C$13)>=C$3,COUNTA($C4: $G4)>=1))

そのため、セルC4を基準にした色付けする可能性のある範囲(入力欄)を選択します。

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

条件付き書式の設定画面にて、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にし、テキストボックス内に先ほどの条件式を入力します。

次に、[書式]の[塗りつぶし]タブから色付けする色を指定します。

上記のように設定して、確定することで完成です。


4. 完成

以下のように、役割を割り当てると同時に、割り当て済みの範囲が自動で色付けされます。

必要に応じて、ドロップダウンリストなどで値を入力しやすくすると良いです。

▼サンプルファイル▼

2026/01/02
【ExcelVBA】書類の確認と同時にロックする仕組み

【ExcelVBA】書類の確認と同時にロックする仕組み

以下の営業報告書には、「確認日」という項目とチェックボックスが用意されています。

このチェックボックスをチェックすることで、チェックボックスが「実行時の日付」に置き換わり、シートがロック(保護)され、そのシートの編集ができなくなります。

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

このように、書類の確認と同時にロック(保護)する仕組みの実現方法について紹介していきます。


1. 開発準備

今回は、予め用意したシート内の特定のチェックボックスをチェックすると同時に、そのシートをロック(保護)する仕組みを実現していきます。

チェックボックスは、[挿入]タブの[チェックボックス]を使用しており、チェックボックスが配置されたセルには、「FALSE」という値が入力されています。

チェックボックスをチェックすると、セルの値は「TRUE」に変わります。

このように指定したシートのセルの値が変わると同時に、シートをロック(保護)するなどと何かしらの処理を実行するには、「シートモジュール」「イベントプロシージャ」を活用します。
シートモジュールは、対象シートのタブ上で右クリックし、[コードの表示]を選択することで表示できます。

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

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

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

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

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


2. コードの記述

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    With Range("E5")
        If .Value = True Then
           .Value = Date
           Me.Protect
        End If
    End With
    
End Sub

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

    With Range("E5")
        '省略
    End With

「With」と「End With」で囲むことで、この中では「With」に指定した「Range(“E5”)」を省略して記述することができます。
省略する際は「.」から記述します。

        If .Value = True Then
           .Value = Date
           Me.Protect
        End If

次に、「If」でセルE5(「With」で指定したセル)が「True(チェックボックスがチェックされた状態)」かどうかを確認し、「True」の場合は、そのセルの値を実行時の日付(Date)にし、シートを保護(Me.Protect)しています。


3. 完成

以上の内容で実現できます。
対象シートのセルE5に配置されたチェックボックスをチェックすると同時に、チェックボックスは実行時の日付に置き換わり、シートがロック(保護)されます。

運用時は、作成したシートをテンプレートとし、シートを複製して活用するとよいです。
シートを複製すると、複製元シートのシートモジュールの内容も、複製したシートに反映されます。

▼サンプルファイル▼

2025/12/26
【Excel】特定の条件を満たしたときにメッセージを表示

【Excel】特定の条件を満たしたときにメッセージを表示

特定の条件を満たしたときにメッセージを表示する例として、こちらでは以下のように、金曜日の勤怠を登録するときに「終業時刻」を入力したときのみ、メッセージを表示する方法について紹介します。

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


メッセージの表示方法

メッセージを表示するには「データの入力規則」を活用します。
データの入力規則というと、セルへの入力制限を設ける機能というイメージがありますが、実は単純にメッセージを表示したいときにも活用できます。

今回の場合、以下の表の「終業時刻」の項目がメッセージを表示する可能性のある対象になります。

そのため、「終業時刻」の範囲を選択して、[データ]タブから[データの入力規則]を選択します。

表示される以下の設定画面にて、まずは入力制限を行うのではなく、メッセージを表示する設定をします。

特定の条件を満たしたときに、メッセージを表示するには、[エラー メッセージ]タブにて、[スタイル]を[情報]にします。
そして、表示したいメッセージを[タイトル]と[エラー メッセージ]のテキストボックスに入力します。

これだけで、メッセージの設定は完了です。
後は、[設定]タブにて、メッセージを表示する条件を設定するだけです。

ExcelVBAレベル確認

条件の設定

今回、メッセージを表示する条件は「金曜日の勤怠を登録したとき」になります。
具体的には、「入力したセルと同じ行のA列の日付が金曜日のとき」です。
それを、以下の[設定]タブにて設定していきます。

今回のような、他のセルの値を参照した条件を指定するには、[入力値の種類]を[ユーザー設定]にし、[数式]に条件を指定します。

[数式]に指定する条件は、選択基準のセルに対しての条件になります。
上記の場合は、セルC2が選択基準なので、「A2に入力されている日付が金曜日の場合」という条件になります。

ただ注意しないといけないのは、[数式]に設定した条件は、正しくは「メッセージを表示しないとき」の条件になります。
そのため、設定する条件は、「A2に入力されている日付が金曜日の場合」ではなく「A2に入力されている日付が金曜日でない場合」になります。
この条件を数式で表現すると、以下のようになります。

=WEEKDAY(A2)<>6
// WEEKDAY(A2):指定した日付の曜日を1(日)~7(土)の数値で返す
// <>6:上記の結果が6でないとき=金曜日でないとき

この条件式を[数式]に入力します。

他の選択範囲には、相対参照で反映されます。
セルC3には「A3に入力されている日付が金曜日でない場合」といった感じです。

これで確定することで完成です。

ExcelVBAレベル確認

完成

A列の「日付」の項目に入力した日付が「金曜日以外」の場合は、C列の「終業時刻」の項目に値を入力しても、メッセージは表示されません。

A列の「日付」の項目に入力した日付が「金曜日」の場合は、C列の「終業時刻」の項目に値を入力して確定すると同時に、以下のようにメッセージが表示されます。

メッセージの[OK]を選択すると、メッセージが消えて入力が確定します。

▼サンプルファイル▼

2025/12/19
【ExcelVBA】ボタン1つで完了タスクを別シートに移動

【ExcelVBA】ボタン1つで完了タスクを別シートに移動

以下は、タスク管理表です。

完了したタスクを選択して、「完了」ボタンを押すだけで、そのタスクが「完了」シートに移動します。

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

このような、ボタン1つで完了タスクを別シートに移動する仕組みの実現方法について紹介します。


1. 開発準備

まずは、「未完了」シートと「完了」シートを用意し、「完了」シートには空の表を用意します。

次に、[開発]タブから[マクロ]を選択し、表示された設定画面にて、開発する機能の名前を入力して、[作成]を選択します。
こちらでは、「MoveTask」と入力しています。

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


2. コードの記述

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

Sub MoveTask()
    
    Dim w1 As Worksheet
    Dim w2 As Worksheet
    Set w1 = Worksheets("未完了")
    Set w2 = Worksheets("完了")
    
    Dim r1 As Long
    Dim r2 As Long
    r1 = ActiveCell.Row
    r2 = w2.Cells(w2.Rows.Count, "A").End(xlUp).Row + 1
    
    w2.Range(w2.Cells(r2, "A"), w2.Cells(r2, "C")).Value = _
        w1.Range(w1.Cells(r1, "A"), w1.Cells(r1, "C")).Value
    w1.Rows(r1).Delete
    
End Sub

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

    Dim w1 As Worksheet
    Dim w2 As Worksheet
    Set w1 = Worksheets("未完了")
    Set w2 = Worksheets("完了")

シート情報を割り当てる用の変数(w1とw2)を用意し、それぞれに「未完了」シートと
「完了」シートを割り当てています。

    Dim r1 As Long
    Dim r2 As Long
    r1 = ActiveCell.Row
    r2 = w2.Cells(w2.Rows.Count, "A").End(xlUp).Row + 1

数値を格納する用の変数(r1とr2)を用意し、「r1」にアクティブセル(現在選択している基準のセル)の行番号、「r2」に「完了」シートの表の末尾の行番号を格納しています。

「r2」について詳しく解説すると、「完了」シートのA列の末尾を選択し、Ctrlキーを押しながらカーソルキーの「↑」を押して止まった位置のセルの行番号に1を加えた数値を格納しています。

    w2.Range(w2.Cells(r2, "A"), w2.Cells(r2, "C")).Value = _
        w1.Range(w1.Cells(r1, "A"), w1.Cells(r1, "C")).Value
    w1.Rows(r1).Delete

「完了」シートの表の末尾のA列からC列に、「未完了」シートのアクティブセルの行のA列からC列の値を格納し、「未完了」シートのアクティブセルの行を削除しています。

ExcelVBAレベル確認

3. ボタンの作成

コードが完成したら、実行用のボタンを用意します。

ボタンは、[開発]タブの中の[挿入]から作成することができます。
ボタンには開発した機能「MoveTask」を割り当てます。


4. 完成

以上の手順で完成です。
完了したタスク(同じ行のいずれかのセル)を選択し、「完了」ボタンを押すことで、その行のタスクが「完了」シートに移動します。

注意点として、今回のコードには、移動対象のタスクの行の範囲を指定していません。
そのため、1行目を選択して「完了」ボタンを押してしまうと、見出しが移動してしまいます。

そのため、必要に応じて、コード内で「行番号が2以上のとき」などといった条件分岐を行うとよいです。

▼サンプルファイル▼

2025/12/12
【Excel】文章から特定の値を表形式で抽出

【Excel】文章から特定の値を表形式で抽出

以下のように、メールなどで送られてきた文章(B2:D16)から特定の値を表形式で抽出(F3:G7)する方法について紹介していきます。


簡易的な文章から表形式で抽出

元々の文章が以下の内容の場合、抽出対象(商品名:数量)以外にも不要な文章が含まれています。(赤文字)

〇〇様

お世話になっております。
今月の弊社商品在庫状況を以下の通りご報告いたします。


サウンドビー:5
タイムウォッチ:8
タブレットプロ:15
ビートスタジオ:6
ペンマスター:18

ご確認のほど、よろしくお願いいたします。
何かご不明点や追加のご要望がございましたら、お気軽にお知らせください。

そのため、まずは抽出対象の文章のみをシートに貼り付けて、そこから表形式になるように数式で抽出していきます。

文章を表形式で抽出する場合、抽出するルールを決める必要があります。
今回の場合は、以下のようなルールになります。

・「:」で列を区切る
・「(改行)」で行を区切る

このルール通りに抽出するためには、TEXTSPLIT関数を活用します。
実際に活用した数式は、以下になります。

=TEXTSPLIT(B2,":",CHAR(10))
// B2:抽出元の文章が入力されたセル
// ":":列の区切り文字
// CHAR(10):行の区切り文字(改行はCHAR関数を用いて表現)

上記の数式を抽出先の表の先頭セル(E3)に入力することで、以下のように表形式で抽出することができます。

とはいえ、メールなどの文書から特定の文章を毎回抽出するのは面倒です。
そのため、文章を全て貼り付けるだけで、対象の値を表形式で抽出する方法についても紹介していきます。


本文全体から対象のみを表形式で抽出

本文全体が以下のようにパターン化している場合(赤文字)は、簡単な数式を加えるだけで、対象の範囲の抽出までを自動で行うことができます。

〇〇様

お世話になっております。
今月の弊社商品在庫状況を以下の通りご報告いたします。


サウンドビー:5
タイムウォッチ:8
タブレットプロ:15
ビートスタジオ:6
ペンマスター:18

ご確認のほど、よろしくお願いいたします。
何かご不明点や追加のご要望がございましたら、お気軽にお知らせください。

まずは、この本文のままシートに貼り付けて、先ほどの数式で抽出してみます。

=TEXTSPLIT(B2,":",CHAR(10))

そうすると、以下の赤枠の箇所が不要になります。

抽出された表の上から5行、下から3行が不要になるので、この不要な行を数式で除外します。

表から不要な行を除外する場合、DROP関数を活用すると良いです。
実際に活用した数式は、以下になります。

=DROP(DROP(TEXTSPLIT(B2,":",CHAR(10)),5),-3)
// DROP(…,-3):「…」の末尾から3行を除外
// DROP(…,5):「…」の先頭から5行を除外

上記の数式を抽出先の表の先頭セル(E3)に入力することで、以下のように不要な行を除外した表形式で抽出することができます。

2025/12/07
【業務】収支グラフ付き!シンプルな家計簿アプリ

【業務】収支グラフ付き!シンプルな家計簿アプリ

#家計簿 #グラフ #アプリ

YouTubeで開く

収支グラフ付きの簡易的な「家計簿アプリ」の作成方法について解説しています。
誰でも簡単に、ノーコードで作成できる内容です。

※動画内の警告については、以下の動画の「5:56」あたりで解説しています。
>【業務】繰り返しタスクにも対応!タスク管理アプリ

00:00 はじめに
00:33 完成イメージ
01:13 表の作成
02:25 カテゴリーメニュー作成
05:00 収入・支出メニュー作成
10:20 収支グラフメニュー作成
11:47 外観設定変更
12:02 残高メニュー作成(IT予備メンバー限定)
12:11 まとめ


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

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

収支グラフ付きの簡易的な「家計簿アプリ」の作成方法について解説しています。
誰でも簡単に、ノーコードで作成できる内容です。

※動画内の警告については、以下の動画の「5:29」あたりで解説しています。
>【業務】繰り返しタスクにも対応!タスク管理アプリ

00:00 はじめに
00:33 完成イメージ
01:13 表の作成
02:25 カテゴリーメニュー作成
05:00 収入・支出メニュー作成
10:20 収支グラフメニュー作成
11:47 外観設定変更
12:02 残高メニュー作成(IT予備メンバー限定)
14:49 まとめ

2025/12/05
【Excel】表の順番をローテーション

【Excel】表の順番をローテーション

以下のように、特定の項目の、要素の順番を回転させる方法について、2通りで解説していきます。

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


方法1

1つ目は、末尾のデータを切り取りして、先頭に挿入するという方法です。

まずは、末尾のデータを選択します。

次に、緑の枠の上にカーソルを移動させ、Shiftを押しながら先頭までドラッグすることで、簡単に切り取りと挿入を行うことができます。

しかし、この方法の場合、行数が多い表や複数項目を回転させる必要がある場合に、若干面倒になります。
そんな時は、次の方法が便利です。

ExcelVBAレベル確認

方法2

2つ目は、並べ替え用の数値が入力された項目を用意し、その列を基準に並べ替えるという方法です。
具体的には以下のように、各行の行番号を常に表示し、末尾のみ「1」と表示されるような項目を数式で用意して、対象の項目のみを並べ替えます。

そのような特殊な項目は、以下の数式を入力することで実現できます。

=IF(ROW()=COUNTA($C$3:$C$17)+2,1,ROW())
// ROW()=COUNTA(…)+2:「数式を入力したセルの行番号」と「データの件数+2」が等しい
// 1:先ほどの条件を満たしたときに「1」を表示
// ROW():先ほどの条件を満たさない時に「数式を入力したセルの行番号」を表示

この数式を表の末尾までコピーすることで、各行の行番号、末尾のみ「1」と表示させることができます。

最後に、並べ替える対象の範囲(見出しを含む)のみを選択し、フィルターを設定します。

以上で、準備完了です。
番号が入力された列を基準に、フィルターボタンから昇順にすることで、データを回転することができます。

番号以外の項目に罫線を設定すると、表が見やすくなります。

▼サンプルファイル▼

ExcelVBAレベル確認

方法2の注意点

フィルターを設定せずに、[データ]タブから並べ替えしてしまうと、以下のように、先頭列も並べ替えられてしまいます。

2025/11/28
【Excel】予定表から「次回の予定」を抽出(XLOOKUP)

【Excel】予定表から「次回の予定」を抽出(XLOOKUP)

以下のように、予定表から「次回の予定」と「次回の予定までの日数」をXLOOKUP関数で抽出する方法について紹介していきます。

※上記の「2025/11/17」は基準の日付になります。
※こちらで作成したファイルは、記事の最後にて配布しています。


1. 次回の予定の抽出

まずは、次回の予定を抽出します。
そのために、次回の予定の基準となる日付(本日の日付)をTODAY関数で表示しておきます。

=TODAY()

では、表示した日付を基準に、次回の予定を抽出していきます。

抽出対象の予定は、基準の日付以上で最も近い日付の予定になります。
その内容を、以下のようにXLOOKUP関数で指定します。
※以下の数式では、抽出した予定に「まで」という文字列を加えています。

=XLOOKUP(B2,予定表!A:A,予定表!B:B,"",1)&"まで"
// B2:検索値(日付のセル)
// 予定表!A:A:予定表の日付の列
// 予定表!B:B:予定表の予定の列
// "":対象の予定が見つからない時に表示する値(空)
// 1:一致モード(完全一致または次に大きい項目)
// &"まで":抽出された予定に「まで」という文字列を加える

このように抽出することができます。
基準の日付をセルに表示したくない場合は、検索値の「B2」に直接TODAY関数を指定してもよいです。

=XLOOKUP(TODAY(),予定表!A:A,予定表!B:B,"",1)&"まで"
ExcelVBAレベル確認

2. 次回の予定までの日数

次に、次回の予定までの日数を抽出します。
しかし、予定表の中には、次回の予定までの日数が表示されていないため、少し計算が必要です。

そのため、まずは、以下のように次回の予定の日付を抽出します。

=XLOOKUP(B2,予定表!A:A,予定表!A:A,"",1)
// 予定表!A:A:検索範囲と戻り範囲を同じにする

また、上記のように、日付ではなくシリアル値として表示します。
日付が表示された場合は、表示形式を「標準」に戻すことでシリアル値になります。

次回の予定までの日数は、抽出されたシリアル値から基準の日付のシリアル値を引いた数になります。
そのため、先ほどの抽出された数値からセルB2の日付を引きます。
※以下の数式では、求めた日数の前後に「残り」と「日」という文字列を加えています。

="残り"&XLOOKUP(B2,予定表!A:A,予定表!A:A,"",1)-B2&"日"
// "残り"&:求めた日数の先頭に「まで」という文字列を加える
// XLOOKUP(…)-B2:次回の予定までの日数
// &"日":求めた日数の末尾に「日」という文字列を加える

このように、求めることができます。
基準の日付をセルに表示しない場合は、「B2」を引くのではなく直接TODAY関数を引いてもよいです。

="残り"&XLOOKUP(B2,予定表!A:A,予定表!A:A,"",1)-TODAY()&"日"

まとめ

以上の手順で、予定表から「次回の予定」と「次回の予定までの日数」を抽出することができます。

▼サンプルファイル▼

2025/11/21
【ExcelVBA】円グラフでルーレットを実現

【ExcelVBA】円グラフでルーレットを実現

以下のような「円グラフを活用したルーレット」を作成する方法について紹介していきます。

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


1. 準備

以下の円グラフは、上の表(「はずれ」と「あたり」の割合)をもとに作成しています。
また、「▼」は別で作成した図形を重ねています。

上の表の「あたり」の割合は、以下のような数式で求めています。

=1-C3
// 1と「はずれ」の割合の差

そのため、「はずれ」の割合を変更するだけで、「あたり」の割合が自動で設定されます。


2. 実現方法

今回は、円グラフの「グラフの基線位置」を活用して、ルーレットを実現していきます。

円グラフは、「データ系列の書式設定」にある「グラフの基線位置」を変更することで回転させることができます。

こちらの値を、マクロで操作することで実現していきます。


3. コードの記述

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

Option Explicit

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Sub Roulette()
    
    Dim ch As Chart
    Set ch = Worksheets("ルーレット").ChartObjects("グラフ 1").Chart
    
    Dim startN As Long, lastN As Long
    startN = ch.ChartGroups(1).FirstSliceAngle
    lastN = Int((360 + 1) * Rnd) + 360 * 6
    
    Dim n As Long
    n = startN
    Do While n < lastN
        DoEvents
        ch.ChartGroups(1).FirstSliceAngle = n Mod 360
        Sleep 5
        If lastN - n > 360 * 3 Then
            n = n + 10
        Else
            n = n + 10 - Int((n - 360 * 3) / (lastN - 360 * 3) * 10)
        End If
    Loop
    
End Sub

では、コードについて解説していきます。
※複雑なコードのため簡単に解説します。

Option Explicit

変数宣言を強制する際に記述するものです。
変数宣言を省略したい場合は、記述する必要はありません。

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Windows APIにある「Sleep」というプロシージャを使えるようにするための宣言です。

    Dim ch As Chart
    Set ch = Worksheets("ルーレット").ChartObjects("グラフ 1").Chart
    
    Dim startN As Long, lastN As Long
    startN = ch.ChartGroups(1).FirstSliceAngle
    lastN = Int((360 + 1) * Rnd) + 360 * 6

対象のグラフを変数「ch」に割り当てて、そのグラフの基線位置を変数「startN」に格納しています。
変数「lastN」には、6周分の角度に、ランダムな角度を加えた角度を格納しています。
変数「lastN」が、回転を止める位置になります。

    Dim n As Long
    n = startN
    Do While n < lastN
        '省略
    Loop

変数「n」に変数「startN」の値を格納し、その変数「n」の値が変数「lastN」の値より小さい間、「Do」から「Loop」の中を繰り返し実行します。

        DoEvents
        ch.ChartGroups(1).FirstSliceAngle = n Mod 360
        Sleep 5
        If lastN - n > 360 * 3 Then
            n = n + 10
        Else
            n = n + 10 - Int((n - 360 * 3) / (lastN - 360 * 3) * 10)
        End If

繰り返しの中では、変数「n」の値を徐々に増やしています。
処理の流れは、以下になります。

1.変数「n」の値(角度)をグラフの基線位置に反映(0~359の間になるように360で割った余りを活用)
2.5ミリ秒(0.005秒)停止

この次が少しだけややこしくなります。
ルーレットでは、回転が徐々に減速する演出にするために、以下のような処理にしています。

残りの回転角度が3周より多い場合は、変数「n」に10を加算
そうでない場合は、徐々に加算する数を減らす
ExcelVBAレベル確認

4. ボタンの作成

記述したプロシージャ(Roulette)を割り当てたボタンを作成します。
こちらでは、立体的な見た目の図形(四角形:角度付き)を挿入して、その図形に割り当てています。


5. 完成

以上の手順で完成です。
作成したボタンをクリックすることで、円グラフが回転します。

▼サンプルファイル▼

2025/11/14
【Excel】抽出データの増減に合わせて罫線を自動設定

【Excel】抽出データの増減に合わせて罫線を自動設定

以下のように、FILTER関数などを用いた数式でデータを抽出し、その抽出された表のサイズに合わせて罫線を設定してしまうと、抽出されるデータの件数が変わった時に罫線が合わなくなってしまいます。

そこで今回は、数式でデータを抽出する際に、その抽出されたデータの件数に合わせて罫線を自動で設定する方法について紹介していきます。

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


1. データの間の罫線を点線にする

こちらでは、以下のように、データの間の罫線を点線に、末尾の罫線を実線にしていきます。

まずは、データの間の罫線を点線していきます。

データの増減に合わせて罫線などの書式を自動で変更するには、「条件付き書式」を活用します。

はじめに、見出し以外の罫線が設定されていない状態にし、今後データが追加されることを考慮したデータの範囲のみを選択します。

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

表示された以下の設定画面で、[ルールの種類]を[数式を使用して、書式設定するセルを決定]にします。

次に、表示されたテキストボックスに、点線の罫線を設定する条件式を入力します。

今回の表では、「No」の値の有無で判断していきます。
点線の罫線を設定するときとは、「No」が表示されているときになります。
そのため、以下の条件式を入力します。

=$A5<>""
// A5は選択基準のセル
// 他の選択範囲に反映する際に、A列を固定するため、Aに「$」を指定

次に、[書式]を選択し、[罫線]タブから下側の罫線を点線にします。

上記の内容で確定することで、データが存在する行の下側に点線の罫線を設定することができます。

ExcelVBAレベル確認

2. データの末尾の罫線を実線にする

次は、データの末尾の罫線を実線にしていきます。

初めに、先ほどと同じ範囲を選択し、条件付き書式の設定画面を開きます。

次は、罫線を実線にする条件式を入力します。

こちらも先ほどと同様に、「No」の値の有無で判断していきます。
実線の罫線を設定するときとは、「No」が表示されていて、かつ、その次の行の「No」が表示されていないときになります。
そのため、以下の条件式を入力します。

=AND($A5<>"",$A6="")
// A5は選択基準のセル
// A6は選択基準の下のセル
// 他の選択範囲に反映する際に、A列を固定するため、Aに「$」を指定

次に、[書式]を選択し、[罫線]タブから下側の罫線を実線にします。

上記の内容で確定することで、表の末尾に実線の罫線を設定することができます。

ExcelVBAレベル確認

3. 完成

以上の内容で完成です。
数式によって抽出されたデータの増減に合わせて、罫線が自動で設定されます。

▼サンプルファイル▼