2025/04/04
【ExcelVBA】シートの「表示・非表示」を瞬時に切り替える

【ExcelVBA】シートの「表示・非表示」を瞬時に切り替える

以下のようにシートの数が増えすぎると、シートの移動が面倒になりますよね。

シートの一覧を表示して対象のシートを選択するということもできますが、毎回一覧を表示するというのも面倒になります。

そのような時は、不要なシートを非表示にすると思いますが、このシートを非表示にしたり再表示にしたりする作業も地味に面倒ですよね。

ということで今回は、シート名の一覧シートを用意し、そのシートで対象のシート名をダブルクリックするだけでシートの「表示・非表示」を切り替えることができる仕組みを実現していきます。

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

ExcelVBAレベル確認

1. 開発準備

まず初めに、シート名の一覧シートを用意します。
こちらでは、以下のようなシート名と表示の有無(●なら表示)を管理した表を、シートを追加して用意しています。

次は、用意したシートの「表示」の項目をダブルクリックすることで、対象シートの「表示・非表示」を切り替える仕組みを実現していきます。

「特定のセルをダブルクリックすると同時に、何かしら処理を実行する」という仕組みは、該当するシートモジュールイベントプロシージャを活用することで実現できます。

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

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

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

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

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

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

ExcelVBAレベル確認

2. コードの記述

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

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        Cancel = True
        
        Dim wsName As String
        wsName = Cells(Target.Row, "B").Value
        
        On Error Resume Next
        If Target.Value = "" Then
            Target.Value = "●"
            Worksheets(wsName).Visible = True
        Else
            Target.ClearContents
            Worksheets(wsName).Visible = False
        End If
        
    End If
    
End Sub

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

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    If Target.Row >= 3 And _
        Target.Column = 3 Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_BeforeDoubleClick」というプロシージャの引数の「Target」に、ダブルクリックされたセルの情報が渡されるため、そのセルの情報から、表の対象の範囲内がダブルクリックされたかどうかを確認しています。
こちらでは、「3行目以上、尚且つ、3列目のセル」と「表示」のセルの範囲内がダブルクリックされたかどうかを確認しています。

この条件を満たした場合に関してのみ、Ifの中の処理を実行します。

        Cancel = True
        
        Dim wsName As String
        wsName = Cells(Target.Row, "B").Value

セルをダブルクリックすると、通常、セルが編集モードになるのですが、引数の「Cancel」をTrueにすることで、編集モードにならなくなります。
その次に、ダブルクリックされた行と同じ行のB列の値(シート名)を変数(wsName)に格納しています。

        On Error Resume Next
        If Target.Value = "" Then
            Target.Value = "●"
            Worksheets(wsName).Visible = True
        Else
            Target.ClearContents
            Worksheets(wsName).Visible = False
        End If

次に、ダブルクリックされたセルの値の有無を確認しています。
値が空の場合は、ダブルクリックされたセルに「●」を入力し、先ほど取得したシート名(wsName)のシートを表示しています。
値が空でない場合は、ダブルクリックされたセルの値をクリアし、先ほど取得したシート名(wsName)のシートを非表示にしています。

先頭の「On Error Resume Next」はエラー対策です。
変数(wsName)に格納されているシート名のシートが存在しない場合に、エラーにならないように、エラーの場合は無視をして続行するという記述になります。


3. 完成

以上の内容で実現できます。
シートの「表示・非表示」を切り替えたい対象のシート名が入力されている行のC列のセルをダブルクリックすることで、そのシートの「表示・非表示」を切り替えることができます。

▼サンプルファイル▼

2025/04/01
【Excel】VLOOKUP関数で複数の表から検索

【Excel】VLOOKUP関数で複数の表から検索

通常、VLOOKUP関数では、1つの表から検索して値を抽出します。
しかし、以下の表のように、複数に分かれた表で管理されていることもあるかと思います。

今回は、VLOOKUP関数を活用して、複数に分かれた全ての表から検索して値を抽出する方法について2通りで解説していきます。


方法1

VLOOKUP関数を活用して、1つの表から検索して値を抽出する場合の数式は以下のようになります。

=VLOOKUP(B3,B6:C20,2,FALSE)

ただ、この数式のままですと、対象が見つからない場合にエラーになってしまいますよね。

そのため、まずはエラー対策としてIFERROR関数を組み合わせます。
IFERROR関数の使い方は、以下になります。

=IFERROR(値, エラーの場合の値)
//指定した[値]がエラーの場合は、指定した[エラーの場合の値]を返す

実際に組み合わせると、以下のようになります。

=IFERROR(VLOOKUP(B3,B6:C20,2,FALSE),"")
// エラーの場合は何も表示しない("")

これで、エラーの場合は何も表示されなくなりました。

後は、もう片方の表から抽出する数式を、以下のように「&」で文字結合するだけで、複数の表から検索して値を抽出することができます。

=IFERROR(VLOOKUP(B3,B6:C20,2,FALSE),"")&IFERROR(VLOOKUP(B3,E6:F20,2,FALSE),"")

複数の表に重複した検索値が含まれていない場合は、いずれか1つのVLOOKUP関数の数式でしか値が抽出されず、他のVLOOKUP関数の数式ではエラーとなり、IFERROR関数で空が返されます。
そのため、上記のように、1つの値のみが抽出されます。


方法2

次の方法は、VSTACK関数を活用する方法になります。
VSTACK関数を活用することで、複数の表を縦に結合することができるため、離れている複数の表を縦に結合した表をVLOOKUP関数の範囲に指定することができます。
VSTACK関数は、現時点では365のバージョンでないと活用することができません。
VSTACK関数の使い方は、以下になります。

=VSTACK(範囲1,範囲2,範囲3,…)
// 指定した[範囲]を縦に結合して返す

VLOOKUP関数の範囲を指定する際に、VSTACK関数を組み合わせて指定することで、複数の表を縦に結合した範囲から検索して値を抽出することができます。
実際に組み合わせた数式が以下になります。

=VLOOKUP(B3,VSTACK(B6:C20,E6:F20),2,FALSE)

上記の数式では、IFERROR関数を使用していないため、対象が見つからない時にエラーになってしまいます。

必要に応じて、以下のようにIFERROR関数を組み合わせると良いです。

=IFERROR(VLOOKUP(B3,VSTACK(B6:C20,E6:F20),2,FALSE),"")
2025/03/28
【ExcelVBA】完了タスクを非表示にして着手中タスクを上位表示する

【ExcelVBA】完了タスクを非表示にして着手中タスクを上位表示する

以下のようなタスク管理表で、完了したタスクを非表示にして、着手中のタスクを上位に表示するという作業があるとします。
この作業をタスクの進捗を更新する度、手動で行うのは大変ですよね。

そこで今回は、「着手日」または「完了日」を入力すると同時に、これらの操作を自動で行う仕組みの実現方法を解説していきます。
※こちらで開発したファイルは記事の最後にて配布しています。


1. 開発準備

今回は、以下の表の「着手日」もしくは「完了日」の項目に値が入力されると同時に処理を実行します。

そのように、特定のシートで特定のセルが編集された時に処理を自動で実行するには、「シートモジュール」の「イベントプロシージャ」を活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

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

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

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

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

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


2. コードの記述

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
       Target.Column >= 4 And _
       Target.Column <= 5 Then
        
        Range("B2").AutoFilter _
            Field:=4, _
            Criteria1:=""
        
        Range("B2").Sort _
            Key1:=Range("D2"), _
            Order1:=xlAscending, _
            Header:=xlYes
        
    End If
    
End Sub

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

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Row >= 3 And _
       Target.Column >= 4 And _
       Target.Column <= 5 Then
        
        '省略
        
    End If
    
End Sub

「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが編集されたかどうかを確認しています。
こちらでは、Targetの行番号が3以上、尚且つ、列番号が4以上、5以下の時、要するに「着手日」もしくは「完了日」の項目が編集されたかどうかを判定しています。

この条件を満たした場合に、Ifの中の処理を実行します。

        Range("B2").AutoFilter _
            Field:=4, _
            Criteria1:=""

まずは、絞り込みです。
セルB2を含む表の先頭から4列目の項目「完了日」に対し、空白のセルで絞り込みをしています。

        Range("B2").Sort _
            Key1:=Range("D2"), _
            Order1:=xlAscending, _
            Header:=xlYes

次に、並べ替えです。
セルB2を含む表を、セルD2の列の項目「着手日」を基準に昇順(xlAscending)にしています。
表には見出し(項目名)が含まれるため、「Header:=xlYes」と指定しています。

ExcelVBAレベル確認

3. 完成

以上の内容で実現できます。

「完了日」に値を入力すると同時に、そのタスクが非表示になります。

また、「着手日」を入力すると同時に、「着手日」を基準に昇順で並べ替えられます。

▼サンプルファイル▼

2025/03/25
【Excel】スクロールバーを活用して行の色付け

【Excel】スクロールバーを活用して行の色付け

以下のように、スクロールバーを操作するだけで、表の行の色付け位置を変更することができる仕組みの実現方法について解説していきます。


1. 条件付き書式で特定の行を色付け

今回は、以下の表に対して行の色付けを行います。

まずは、色付けの対象となる行の行番号を表の上のセルに入力します。
※セルに入力した値は最終的にスクロールバーで見えなくなります。

こちらでは、セルB2に「5」と入力しています。

次に、表の範囲の先ほど指定した行番号の行を自動で色付けする設定を『条件付き書式』にて行います。

まずは、表の要素全体を選択し、[ホーム]タブの中の[条件付き書式]から[新しいルール]を選択します。

表示された条件付き書式の設定画面で、[ルールの種類]を[数式を指定して、書式設定するセルを決定]にし、以下の条件式を入力します。

=ROW()=$B$2
// 対象のセルの行番号とセルB2の値が同じ場合
// 「B2」は「$B$2」と絶対参照にする

次に、[書式]から好みの書式を設定します。
こちらでは、[塗りつぶし]タブから黄色を指定しています。

上記の手順で確定することによって、以下のように指定した行が自動で色付けされます。


2. スクロールバーを使って色付けする行を変更

続いて、スクロールバーを作成します。

まずは、[開発]タブの中の[挿入]の[フォームコントロール]から[スクロールバー]を選択し、表の上に作成します。
※Altキーを押しながら作成すると、セルの幅に自動で調整されます。

次に、作成したスクロールバー上で右クリックし、[コントロールの書式設定]を選択します。

表示された書式設定の画面で必要な設定を行います。
こちらでは、以下のように設定しています。

現在値:5
最小値:4(表が4行目から用意されているため)
最大値:23(表が23行目まで用意されているため)
変化の増分:1(スクロールバーの縁を押した時に動かす量)
スクロールバー シャフトの増分:5(スクロールバーの中の隙間を押した時に動かす量)
リンクするセル:B2(行番号を入力したセルのアドレス)

以上の設定で完成です。
以下のように、スクロールバーを操作するだけで、表の行の色付け位置を変更することができます。

2025/03/21
【Excel】6桁の年月を簡単に入力

【Excel】6桁の年月を簡単に入力

「202501、202502…」のように6桁の年月を並べたい時に、通常のドラッグ操作ではうまくいかないことがあります。

ということで、こちらでは6桁の年月を簡単に入力する方法について解説していきます。


数式の入力

まずは、入力したい先頭の6桁の年月を数式で求めていきます。
その際に、ROW関数DATE関数TEXT関数を活用します。
それぞれの関数の使い方は、以下になります。

=ROW(参照)
// 参照したセルの行番号を返す
=DATE(年, 月, 日)
// 指定した年月日から該当する日付を返す
// 指定した月や日が存在しない数値の場合は桁上げ桁下げした日付を返す
=TEXT(値, 表示形式)
// 指定した値に対し、指定した表示形式を適用した文字列を返す

まずはROW関数とDATE関数を組み合わせて、先頭の年月の1日を求めていきます。
※1日でなくても、全ての年月に存在する日付なら問題ございません。

日付に関しては、下の行へコピーすることで、1月、2月と翌月の日付にする必要があるため、月はROW関数でセルの行番号を活用して求めます。
例えば、2025年1月から入力したい場合は、以下のような数式になります。

=DATE(2025,ROW(A1),1)

次は、この数式にTEXT関数を組み合わせて年月のみを表示させます。
年月のみを6桁で表示する表示形式は「yyyymm」になるため、以下のような数式になります。

=TEXT(DATE(2025,ROW(A1),1),"yyyymm")

以上の手順で、年月のみを表示することができます。

ただ、この状態のままですと、表示された6桁の年月は文字列として扱われます。
数値として扱いたい場合は、更にVALUE関数で囲むことで数値に変換できます。
VALUE関数で囲んだ数式は以下になります。

=VALUE(TEXT(DATE(2025,ROW(A1),1),"yyyymm"))

VALUE関数で囲んだ結果、以下のような変な日付が表示される場合は、表示形式を「標準」に戻すとよいです。

ExcelVBAレベル確認

数式のコピー

先頭の年月を求める数式の入力ができましたら、後は必要な行までドラッグしてコピーするだけです。

これだけで、6桁の年月を必要な数分入力することができます。


まとめ

この方法を使えば、6桁の年月を簡単に連続で入力できます。

1. 以下の数式を入力する
※数値として扱いたい場合はVALUE関数で囲む

=TEXT(DATE(年, ROW(A1), 1), "yyyymm")
// 年:開始の年を指定
// A1:開始の月と同じ行番号のセルを指定

2. 必要な行までドラッグしてコピーする

横向きに入力したい場合は、ROW関数ではなくCOLUMN関数を活用します。
COLUMN関数の使い方は、以下になります。

=COLUMN(参照)
// 参照したセルの列番号を返す

実際にCOLUMN関数を活用すると、以下のような数式になります。

=VALUE(TEXT(DATE(2025,COLUMN(A1),1),"yyyymm"))
2025/03/18
【Excel】シートの追加と削除を一瞬で行うショートカット

【Excel】シートの追加と削除を一瞬で行うショートカット

作業中に簡単なメモや計算をするために、一時的にシートを追加することがあります。
しかし、不要になったシートを削除する際に、シートタブの上で右クリックして削除するのは少し面倒です。

そこで今回は、シートの追加と削除を一瞬で行うショートカットを紹介します。


シートの追加

シートを追加するには、以下のショートカットを使用します。

「Shift + F11」もしくは「Alt + Shift + F1」
他にも、「Alt → H → I → S」「Alt → I → W」でも追加できます。

「Alt → H → I → S」は以下のように[ホーム]タブから順にキーで指定しています。

「Alt → I → W」は古いバージョンのショートカットですが、最新のバージョンでも使うことができます。
※Altの後にIを押すと、「Officeのアクセスキー」の画面が表示されます。


シートの削除

不要になったシートを削除するには、以下のショートカットを使います。

「Alt → H → D → S」もしくは「Alt → E → L」

「Alt → H → D → S」は以下のように[ホーム]タブから順にキーで指定しています。

「Alt → E → L」は古いバージョンのショートカットですが、最新のバージョンでも使うことができます。
※Altの後にEを押すと、「Officeのアクセスキー」の画面が表示されます。

シートに情報が含まれている場合は、上記のショートカットを入力した後に、以下のような画面が表示されます。
その際は、Enterを押すことで「削除」が選択され、シートを削除することができます。

複数シートを選択している状態で上記のショートカットを入力することで、複数シートを同時に削除することもできます。

2025/03/14
【ExcelVBA】不要なシートの見出しの色を自動変更

【ExcelVBA】不要なシートの見出しの色を自動変更

使わなくなったシートの管理方法として、シート名の先頭に「_」を加えて、シート見出しの色をグレーにすることがあります。

毎月のように、この作業を行う場合、地味に面倒ですよね。

そこで今回は、シート名の先頭に_を加えるだけで、自動でシート見出しの色をグレーにする仕組みの実現方法について解説していきます。
※こちらで開発したファイルは記事の最後にて配布しています。


1. 開発準備

今回は、シート名の先頭に「_」を加えてから、他のシートに切り替えた時に、自動で対象のシート見出しの色をグレーにする仕組みを実現します。

そのような、シートが切り替わったタイミングに処理を自動で実行するには、「ブックモジュール」の「イベントプロシージャ」を活用します。
「ブックモジュール」は、[開発]タブから[Visual Basic]を選択し、[プロジェクトエクスプローラー]から[ThisWorkbook]をダブルクリックすることで表示することができます。

「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、シートが切り替わったタイミングに処理が自動で実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、ブックモジュールの左上のリストから「Workbook」を選択します。

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

ただ、今回使用するイベントプロシージャは、シートが切り替わったタイミングに処理が実行されるものになります。
そのため、右上のリストから「SheetDeactivate」を選択します。

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

ExcelVBAレベル確認

2. コードの記述

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

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    
    If Left(Sh.Name, 1) = "_" Then
        Sh.Tab.Color = RGB(180, 180, 180)
    End If
    
End Sub

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

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    
    '省略
    
End Sub

「Workbook_SheetDeactivate」というプロシージャの引数の「Sh」に、アクティブでなくなったシートの情報が渡されます。

    If Left(Sh.Name, 1) = "_" Then
        Sh.Tab.Color = RGB(180, 180, 180)
    End If

対象のシート(Sh)の名前の先頭に「_」がある場合に、対象シートの見出しの色(Sh.Tab.Color)をグレー(RGB(180, 180, 180))にしています。


3. 完成

以上の内容で実現できます。
シート名の先頭に「_」を加えて他のシートを選択するだけで、シート見出しの色が自動でグレーになります。

▼サンプルファイル▼

2025/03/11
【Excel】入力した数値を0埋め4桁にする

【Excel】入力した数値を0埋め4桁にする

管理している番号を「0001」「0023」などのように0埋めの4桁表記にしたい場合、直接0を入力すると、勝手に先頭の0が消えてしまいます。

先頭の0を残すために、表示形式を「文字列」にして対応することもありますが、毎回0から入力するというのも手間になります。

そこで、簡単に0埋めの4桁に統一する方法を紹介します。

ExcelVBAレベル確認

設定手順

1.対象のセル範囲を選択する

以下のように対象のセル範囲を選択します。

2.「セルの書式設定」を開く

選択した範囲の上で右クリックし、[セルの書式設定]を選択します。

3.表示形式を設定する

[表示形式]タブを選択し、[ユーザー定義]を選択します。
表示された[種類]のテキストボックスの中に「0000」と入力します。
※今回は0埋め4桁なので「0」を4つ並べていますが、必要に応じて桁数は調整してください。

4.設定を確定する

[OK]を選択することで設定が完了します。

ExcelVBAレベル確認

設定完了

以上の設定を行うだけで、今後は数値を入力すると同時に0埋めの4桁表記になります。

ただ、この設定は見た目を0埋め4桁にしているだけなので、実際の値には先頭の0は含まれません。

2025/03/07
【ExcelVBA】選択データの全項目を一括表示

【ExcelVBA】選択データの全項目を一括表示

以下のように、項目数の多い表の場合、対象データの内容を確認するのが大変だったりします。

そこで今回は、「対象データのいずれかのセルを選択してボタンを押すことで、全項目の値をメッセージボックスで表示することができる機能」の開発方法について解説していきます。

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


1. 開発準備

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

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

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


2. コードの記述

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

Sub 一覧表示()
    
    Dim r As Long
    r = ActiveCell.Row
    
    Dim c As Long, msgStr As String
    For c = 1 To 18
        msgStr = msgStr & _
            Cells(1, c).Value & ":" & _
            Cells(r, c).Text & vbCrLf
    Next c
    
    MsgBox msgStr
    
End Sub

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

    Dim r As Long
    r = ActiveCell.Row

こちらで、選択されているセル(アクティブになっているセル)の行番号を取得して、変数rに代入しています。

    Dim c As Long, msgStr As String
    For c = 1 To 18
        msgStr = msgStr & _
            Cells(1, c).Value & ":" & _
            Cells(r, c).Text & vbCrLf
    Next c

表の先頭列(A列:1列目)から表の最終列(R列:18列目)までを1列ずつ繰り返し、変数msgStrに、「対象列の項目名:1行目のc列目」と「:」、「対象列の対象データ:r行目のc列目」、「改行コード」を加えています。
項目名は「.Value」に対し、データの値は「.Text」を使用しています。
通常、セルの値の取得は「.Value」で問題ないのですが、データの値に関しては表示形式が設定された見た目のままの文字列を取得するために「.Text」を使用しています。

【注意】

「.Text」はセルに表示されたままのテキストを取得します。
そのため、日付や金額のセルなどで列幅が狭く「####」と表示されている場合は、「####」のままで取得されてしまいます。

    MsgBox msgStr

最後に、繰り返し処理で作成した文字列(変数msgStr)をメッセージボックスで表示しています。


3. ボタンの作成

コードが完成しましたら、実行用のボタンを用意します。
ボタンは、[開発]タブの中の[挿入]から作成することができます。


4. 完成

以上の手順で完成です。
表示したいデータのいずれかのセルを選択して、作成したボタンを押すだけで、全項目の値をメッセージボックスで表示することができます。

▼サンプルファイル▼

2025/03/04
【Excel】マクロ不要!セルの内容でメール送信!

【Excel】マクロ不要!セルの内容でメール送信!

特定のシート上の表の内容を元にメールの本文を作成している場合などで、数式を用いて、シート内にメールの送信内容を用意することがあります。
その場合、手動でメールソフトを立ち上げてから、その送信内容をコピー&ペーストして送信している方が多いと思いますが、繰り返し作業の場合は、結構大変になります。

そんな時に、今回紹介する方法を活用することで、クリック1つでメールソフトが立ち上がり、宛先・件名・本文が自動入力された状態で送信画面を開くことができるようになります。

ExcelVBAレベル確認

1. 改行コードの入力

まずは準備として、本文の改行したい位置に、以下の特殊コードを入力します。

・行内改行(同じ段落内で改行する場合):%0A
・段落改行(新しい段落を作成する場合):%0D%0A

入力する位置は同じセル内でなくても、以下のように同じ行のセルであれば問題ございません。

ExcelVBAレベル確認

2. mailtoスキームの作成

次に、以下の構成の文字列になるように数式でセルの値を繋げます。

mailto:宛先?subject=件名&body=本文

セルの値と固定の文字列を繋げる場合は、「&」を活用します。
具体的には、以下のような数式になります。

="mailto:"&C2&"?subject="&C3&"&body="&CONCAT(C5:G11)
// CONCAT関数で本文の範囲の文字列を一括で結合しています。
ExcelVBAレベル確認

3. ハイパーリンクの作成

最後に、先ほど数式で作成したmailtoスキームをハイパーリンクにしていきます。
ハイパーリンクにする場合は、HYPERLINK関数を活用します。
この関数の使い方は、以下になります。

=HYPERLINK(リンク先, [別名])
// リンク先:ハイパーリンクにしたい文字列を指定(URLやmailtoスキームなど)
// [別名]:表示する文字列を指定(省略時はリンク先に指定した文字列が表示される)

実際に活用した数式の例は、以下になります。

=HYPERLINK("mailto:"&C2&"?subject="&C3&"&body="&CONCAT(C5:G11),"メール送信")

4. 完成

以上の手順でハイパーリンクの完成です。
今後は、作成したハイパーリンクをクリックするだけで、以下のように本文などが入力済みの送信画面を立ち上げることができます。

ExcelVBAレベル確認

5. 補足

HYPERLINK関数の引数に設定する文字列の長さは255文字以内にする必要があります。
そのため、長文を指定したい場合などは、ExcelVBAで開発するなどと別の方法で実現する必要があります。

ExcelVBAで実現する場合は、以下の記事が参考になります。
>【業務】自動メール送信

2025/02/28
【Excel】選択している行のデータを縦向きに抽出

【Excel】選択している行のデータを縦向きに抽出

Excelで選択している行のデータを縦向きに抽出する方法について解説します。

実は、マクロを使用せずに簡単な数式のみで実現できます。
順番に手順を解説していきます。


1. 先頭行のデータを縦方向に抽出

まずは、先頭行(No.1)のデータをB列のセルに抽出していきます。

抽出する際に、横方向のデータを縦方向に転置する必要があります。
転置するには、TRANSPOSE関数を活用します。

抽出する先頭のセルB3に以下の数式を入力します。

=TRANSPOSE(D3:M3)
// D3:M3:先頭行(No.1)のデータ

数式を入力して確定することで、以下のように先頭行のデータを縦方向に変換して抽出することができます。


2. 抽出する行番号を数値にする

現状の数式は、抽出するデータが「D3:M3」と参照になっています。

=TRANSPOSE(D3:M3)

最終的には選択している行のデータを抽出する必要があるため、1行目、2行目と行番号を変更するだけで抽出対象のデータが変更できるように修正します。

こちらでは、OFFSET関数を活用して行番号で指定できるように修正します。
OFFSET関数とは、指定した範囲から指定した行数、列数移動した位置の範囲を取得することができる関数です。
OFFSET関数を活用して1行移動した先がセル「D3:M3」になるように、以下のような数式にします。
※No.1のデータが1行移動した先になるようにします。

=TRANSPOSE(OFFSET(D2:M2,1,0))
// D2:M2:移動する前の範囲
// 1:1行下へ移動
// 0:0列右へ移動

数式を入力して確定することで、以下のように抽出することができます。

OFFSET関数で指定した行数を以下のように修正するだけで、抽出するデータの行を変更することができます。

=TRANSPOSE(OFFSET(D2:M2,2,0))
// 2:2行下へ移動

3. 行番号を自動取得する

最後に、OFFSET関数で指定している行数を自動で取得する仕組みを実現します。
実は、この仕組みも数式のみで実現できます。

選択しているセルの行番号を取得するには、CELL関数を活用します。
CELL関数に、以下のように「row」と指定することで、数式を更新する度、選択しているセルの行番号を取得することができます。

=CELL("row")

数式は、[数式]タブの中の[再計算実行]を選択、もしくは、F9キーを押すことで更新できます。

毎回、[数式]タブから[再計算実行]を選択するのは大変ですので、F9キーを活用した方がよいです。

では、先ほどの数式のOFFSET関数に指定した行数をCELL関数に置き換えます。
OFFSET関数の行数が1の時に、先頭行(3行目)のデータが抽出されるため、CELL関数で取得した行番号から2を引く必要があります。
そのため、以下のような数式になります。

=TRANSPOSE(OFFSET(D2:M2,CELL("row")-2,0))
// CELL("row")-2:選択しているセルの行番号から2を引いた数値を取得

数式を入力して確定することで完成です。

いずれかのセルを選択して、F9キーを押して数式を更新するだけで、以下のように選択しているセルの行のデータを抽出することができます。

▼サンプルファイル▼

2025/02/25
【Excel】2行1データの表を1行1データに変換

【Excel】2行1データの表を1行1データに変換

Excelを使っていると、2行1データの形式になっている表を1行1データに変換したい場面がありますよね。
実は、簡単な数式だけで、瞬時に変換することができます。
今回は、TOROW関数とWRAPROWS関数を活用する方法を解説します。


TOROW関数を使ってデータを1行に並べる

まず、TOROW関数を使って、2行1データの表を1行に並べます。
TOROW関数は、指定した範囲を1行に並べる関数です。

1.抽出先の先頭のセルを選択

2.以下の数式を入力

=TOROW(B2:D23)
// B2:D23:元となる2行1データの表の範囲を指定

以上の手順で、以下のように1行に変換することができます。


WRAPROWS関数を使って1行のデータを複数行で表示する

次に、WRAPROWS関数を使って、1行のデータを折り返して複数行で表示します。
WRAPROWS関数は、指定した1行もしくは1列の範囲を指定した要素数単位で折り返して複数行で表示する関数です。

先ほどの数式を、以下のようにWRAPROWS関数で囲みます。

=WRAPROWS(TOROW(B2:D23),6)
// 6:折り返す要素数(項目数)

これだけで、以下のように1行1データの表に変換することができます。


まとめ

この方法を使うことで、複雑な手作業をせずに、2行1データの表を瞬時に1行1データの表に変換できます
1つの数式だけで簡単に変換できるので、ぜひ試してみてください。