YouTubeで開く
1つの数式で「セル結合を含む表」を「セル結合を含まない表」に変換する方法について解説しています。
00:00 挨拶
02:13 SCAN関数とは
04:25 SCAN関数を使う方法
08:31 SCAN関数を使わない方法
09:35 まとめ
10:32 プレゼントについて
▼準備ファイル▼
IT予備
業務効率化のコツが無料で学べる!Excelなどの解説&配布サイト

1つの数式で「セル結合を含む表」を「セル結合を含まない表」に変換する方法について解説しています。
00:00 挨拶
02:13 SCAN関数とは
04:25 SCAN関数を使う方法
08:31 SCAN関数を使わない方法
09:35 まとめ
10:32 プレゼントについて
▼準備ファイル▼

数量を管理している表で、よく数量に1を加えたり、1を減らしたりと作業をしている場合、数量のセルに数値を毎回、直接入力するのは大変です。
数量の項目が少ない場合は、スピンボタンなどを活用するのも1つの手ですが、項目数が多い場合は、スピンボタン1つ1つにセルを割り当てるのは大変になります。
ということで、今回は、数量の隣のセルを直接クリックするだけで、数量に1を加えたり、1を減らしたりすることができる仕組みの作り方について解説していきます。

※こちらで開発したファイルは、記事の最後にて配布しています。
今回は、数量の隣のセルを右クリックすることで、該当行の数量のセルの値を更新するという仕組みを実装していきます。
まずは、以下の左側の表の、数量の隣のセルにボタンのようなデザインのセルを用意します。

上記では、「セルの書式設定」より罫線と背景色などを設定しています。
また、E列には「<」、F列には「>」という文字を直接入力しています。
ボタンのデザインの用意ができましたら、右クリックすると同時に数量を更新する仕組みを実装していきます。
特定のシートの特定のセルを右クリックすることで何かしら処理を実行するには、該当するシートのシートモジュールを活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

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

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

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

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

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

以下のコードを記述します。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.CountLarge = 1 And _
Target.Row >= 3 And _
Target.Row <= 21 And _
Target.Column >= 5 And _
Target.Column <= 6 Then
Cancel = True
Select Case Target.Column
Case 5:
Cells(Target.Row, "D").Value = _
Cells(Target.Row, "D").Value - 1
Case 6:
Cells(Target.Row, "D").Value = _
Cells(Target.Row, "D").Value + 1
End Select
End If
End Sub
では、コードについて解説していきます。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.CountLarge = 1 And _
Target.Row >= 3 And _
Target.Row <= 21 And _
Target.Column >= 5 And _
Target.Column <= 6 Then
'省略
End If
End Sub
「Worksheet_BeforeRightClick」というプロシージャの引数の「Target」に、右クリックされたセルの情報が渡されるため、そのセルの情報から、対象の範囲内が右クリックされたかどうかを確認しています。
こちらでは、「右クリックされたセルが単体で、3行目以上21行目以下、5列目以上6列目以下のセル」と、対象の範囲内の単体のセルが右クリックされたかどうかを確認しています。

この条件を満たした場合に関してのみ、Ifの中の処理を実行します。
Cancel = True
Select Case Target.Column
Case 5:
Cells(Target.Row, "D").Value = _
Cells(Target.Row, "D").Value - 1
Case 6:
Cells(Target.Row, "D").Value = _
Cells(Target.Row, "D").Value + 1
End Select
先ほどの条件を満たした場合は、「Cancel = True」で右クリック時のメニューが表示されないようしています。
その次に、右クリックされたセルが5列目(E列)なのか、6列目(F列)なのかによって、処理を分岐しています。
5列目(E列)の場合は、その右クリックされたセルと同じ行のD列の値(数量)に対し1を引き、6列目(F列)の場合は、その右クリックされたセルと同じ行のD列の値(数量)に対し1を足しています。
先ほどのコードを記述したら完成です。
「<」もしくは「>」が入力された以下の赤枠内のセル上で右クリックすることで、対象行の数量に対し、1を加えたり、1を減らしたりすることができます。

▼サンプルファイル▼

QRコードでの商品読み込みに対応した「消耗品管理(在庫管理)アプリ」の作成方法について解説しています。
誰でも簡単に、ノーコードで作成できる内容です。
00:00 挨拶
01:02 完成イメージ
02:35 表の作成
04:38 データ設定変更
12:50 外観設定変更
14:02 QR読取り設定
15:46 アプリの色・アイコン変更
16:19 在庫減・入庫出庫フォーマット設定(IT予備メンバー限定)
16:27 まとめ
16:52 プレゼントについて
IT予備メンバーに加入して連携すると、メンバー限定動画に切り替わります。
※サイト内の限定動画です。
QRコードでの商品読み込みに対応した「消耗品管理(在庫管理)アプリ」の作成方法について解説しています。
誰でも簡単に、ノーコードで作成できる内容です。
00:00 挨拶
00:35 完成イメージ
02:07 表の作成
04:10 データ設定変更
12:22 外観設定変更
13:34 QR読取り設定
15:19 アプリの色・アイコン変更
15:51 在庫減・入庫出庫フォーマット設定(IT予備メンバー限定)
17:14 まとめ

まず前提として、可能ならば1行1データの表に変換した方が良いです。
しかし、いろんな理由(入力しやすさ、見やすさなど)で、以下のような複数行1データの表で管理することがあります。

このような複数行1データの表から、特定の項目で検索して値を抽出する方法について、以下の表の「会員番号」で検索し、「氏名」を抽出する数式を例に解説していきます。

理想の値を抽出するためには、まずは法則性を見つける必要があります。
以下の表の場合は、次のような法則性があります。
・「会員番号」の下のセルが「氏名」

そのため、該当する「会員番号」の行番号が分かれば、その1つ下の行番号の、同じ列のセルの値を抽出すれば良いです。

特定の値が入力されているセルの行番号を取得するには、MATCH関数が便利です。
MATCH関数を使った以下のような数式で、行番号を取得することができます。
=MATCH(F3,C:C,0)
// F3:検索値
// C:C:検索範囲
// 0:検索方法(完全一致)
// 指定した「検索範囲」の先頭から指定した「検索値」と完全一致する値の位置情報を返す

上記では、「C:C」と列全体を指定していますが、表の先頭からの相対的な行番号でも問題ないです。
表の先頭からの相対的な行番号を取得する場合、以下のような数式になります。
=MATCH(F3,C4:C21,0)

次は、先ほど取得した行番号に1を加えた行番号の、同じ列のセルの値を抽出します。
指定した範囲の相対的な行番号のセルの値を抽出するには、INDEX関数が便利です。
先ほど抽出した行番号に1を加えた行番号に位置するセルの値を抽出する場合、以下のような数式になります。
=INDEX(C4:C21,G3+1)
// C4:C21:抽出対象となる範囲
// G3+1:指定した範囲から抽出する値の位置情報
// 指定した「抽出対象となる範囲」の先頭から指定した「位置情報」の位置にある値を返す

ちなみに、考え方によっては、MATCH関数で取得した行番号に1を加えなくても、相対的な範囲を1つ下に移動することでも抽出することができます。
=INDEX(C5:C21,G3)

ただ、前者の以下の数式の方が直感的に分かりやすく感じます。(好みに合わせてください)
=INDEX(C4:C21,G3+1)
最後に、MATCH関数の数式とINDEX関数の数式を、以下のように組み合わせることで完成です。
=INDEX(C4:C21,MATCH(F3,C4:C21,0)+1)

今後の保守を考えると、データを管理する表は1行1データに揃えた方がよいです。
しかし、一時的な表や見やすさを重視した表で、集計する必要のない表の場合は、今回のような複数行1データの表で管理しても問題になることは少ないです。
そのような表形式を保ったまま、特定の値を検索&抽出する際は、今回のように法則性を見つけることが大切になります。
※法則性がない場合は、数式での抽出は困難です。
ぜひ試してみてください。

複数選択可能なリストボックスで、セルに値を入力することができる仕組みについて解説しています。
複数選択した各要素は、カンマ区切りでセルに入力されます。
また、要素の順番は固定で、「A,B」と「B,A」といった不規則な順番にならないようになっています。
00:00 挨拶
01:12 完成イメージ
01:36 準備
02:04 作成(フォームのデザイン)
04:37 作成(フォームの初期値の設定)
12:20 作成(リストボックスの値を反映)
17:00 作成(リストボックス自動立ち上げ)
19:57 完成
21:11 プログラムの全体
24:40 プレゼントについて
▼準備ファイル▼

以下のように、棒グラフの一番大きい棒のみを自動で色付けする方法について紹介していきます。

残念ながら、標準の機能には「特定の棒のみを自動で色付けする機能」は用意されていません。
そのため、少し工夫が必要です。
そこで今回は、棒グラフを積み上げ棒グラフにし、片方の棒グラフの色を変更して対応していきます。
要するに、積み上げ棒グラフの片方の参照データを、最大値が「0」の表にし、もう片方はその逆で、最大値以外が「0」の表にします。
具体的には、以下のイメージです。

そのようにして、2つの表を積み上げることで、常に片方のグラフのみを表示することができます。

まずは、最大値が「0」の表と、最大値以外が「0」の表を用意します。
これらは数式で簡単に用意することができます。
具体的には、最大値はMAX関数で取得することができるので、IF関数で最大値かどうかで抽出値を変更するという以下のような数式になります。
▼最大値が「0」の表▼
=IF(MAX($C$3:$C$6)<>C3,C3,0)
// MAX($C$3:$C$6):最大値の取得(表の範囲は固定)
// <>C3:対象行の値と等しくない場合
▼最大値以外が「0」の表▼
=IF(MAX($C$3:$C$6)=C3,C3,0)
// MAX($C$3:$C$6):最大値の取得(表の範囲は固定)
// =C3:対象行の値と等しい場合

それぞれの数式を先頭に入力したら、後は末尾までコピーすることで、表の完成です。

次に、グラフを用意します。
表の中を選択し、[挿入]タブから[積み上げ縦棒]を選択します。

必要に応じて、グラフのサイズなどを修正し、グラフのデータ範囲を先ほど作成した表のみに変更することで、グラフの完成です。

標準設定のままですと、作成した表を非表示にするとグラフのデータが消えてしまいます。

作成した表を非表示にしたい場合は、グラフを選択して、[グラフのデザイン]タブから[データの選択]を選択します。

表示された画面で[非表示および空白のセル]を選択して、次に表示された画面で[非表示の行と列のデータを表示する]にチェックし、確定します。

以上の設定を行うことで、作成した表を非表示にしたとしても、グラフのデータは表示されたままになります。


以下の表では、セルB2に指定した人数を超えて、セルB5以降の範囲に氏名が入力できないようになっています。

今回は、上記のような指定したセル数までしか値を入力できないようにする仕組みの作り方について解説していきます。
※こちらで作成したファイルは、記事の最後にて配布しています。
特定の条件を満たしている状態でないと入力することができないセルを用意するには、「データの入力規則」を活用します。
今回は、以下のセルB2に入力されている人数分のセルだけ、セルB5以降の範囲に、値(氏名)の入力を許可するという設定になります。

これを条件式で表すと、以下のような式になります。
=COUNTA($B$5:$B$1000)<=$B$2
// COUNTA(…):セルB5以降(仮で1000行目まで)の空でないセルの数を取得
// <=$B$2:COUNTAで取得した数がセルB2に入力されている数値以下である
上記の条件式を満たしているときだけ、セルB5以降への値の入力を許可するといった設定を行います。
セルB5以降だと範囲が広すぎるため、今回は、仮でセルB5からセルB1000までに設定します。
まずは、入力を制限するセルB5からセルB1000を選択します。
広範囲を選択するときは「名前ボックス」を活用するとよいです。
以下では、「名前ボックス」に「B5:B1000」と入力してEnterで確定することで、対象の範囲を選択しています。

次に、[データ]タブから[データの入力規則]を選択します。

データの入力規則の設定画面が表示されたら、[入力値の種類]を[ユーザー設定]にし、先ほどの条件式を入力します。
=COUNTA($B$5:$B$1000)<=$B$2

次に、[エラーメッセージ]タブを選択し、以下のように設定します。

ここでは、先ほど設定した条件を満たさなかったときに表示するメッセージを設定しています。
上記の設定で確定することで完成です。
以上の手順を行うことで、セルB2に指定した人数までしか、セルB5以降に値(氏名)を入力することができなくなります。

▼サンプルファイル▼

罫線の設定方法について解説しています。
また、罫線を設定するショートカットについても解説しています。
>効率的に罫線を操作する方法
>文字の入力・削除・書式設定・配置
>テーブルの活用方法
00:00 挨拶
00:48 基本の罫線の設定方法
08:34 より高度な罫線の設定方法
11:15 実践(社員表の作成)(IT予備メンバー限定)
11:25 まとめ
11:50 プレゼントについて
IT予備メンバーに加入して連携すると、メンバー限定動画に切り替わります。
※サイト内の限定動画です。
罫線の設定方法について解説しています。
また、罫線を設定するショートカットについても解説しています。
>効率的に罫線を操作する方法
>文字の入力・削除・書式設定・配置
>テーブルの活用方法
00:00 挨拶
00:20 基本の罫線の設定方法
08:06 より高度な罫線の設定方法
10:47 実践(社員表の作成)(IT予備メンバー限定)
15:28 まとめ

「セルにフォーカス」という機能の使い方について解説しています。
また、この機能が使えない環境でも使えるように、模倣した機能を自作する方法についても解説しています。
00:00 挨拶
00:49 セルにフォーカス
02:45 自作:アクティブセルと同じ行と列のセルを色付け
05:51 自作:アクティブセルは色付けしない
06:52 自作:注意点
09:11 プレゼントについて
▼準備ファイル▼

「セルにフォーカス」という機能の使い方について解説しています。
また、この機能が使えない環境でも使えるように、模倣した機能を自作する方法についても解説しています。
00:00 挨拶
00:49 セルにフォーカス
02:45 自作:アクティブセルと同じ行と列のセルを色付け
05:51 自作:アクティブセルは色付けしない
06:52 自作:注意点
09:11 プレゼントについて
準備ファイルと完成ファイルは、こちらの記事からダウンロードできます。

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


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

※こちらで実現したファイルは記事の最後にて配布しています。
まず初めに、[開発]タブを選択し、[マクロ]を選択します。

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

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

以下のコードを記述します。
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の値を手動で変更する必要があります。
そこで、次のように修正します。
以下のように修正します。
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」の引数に指定して実行するという処理を繰り返します。

そこで、次のようなプロシージャを用意します。
以下のプロシージャを用意します。
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」という値でも実行しています。
以上の手順で完成です。
作成した「ExportAll」を実行するだけで、以下のように複数のPDFファイルが出力されます。

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

以下のように、「指定した表」から「指定した項目」のみを『XLOOKUP関数』を用いて抽出する方法について解説していきます。

※こちらで実現したファイルは、記事の最後にて配布しています。
まずは、抽出先のシートに、抽出対象の項目名を入力します。
以下のシートでは、項目名を簡単に変更できるようにドロップダウンリストにしています。

次に、先頭の項目名の下のセルに以下の数式を入力します。
=XLOOKUP(A1,顧客管理!$A$1:$I$1,顧客管理!$A$2:$I$21)
// A1:抽出対象の項目名のセル
// 顧客管理!$A$1:$I$1:抽出対象の表の見出しの範囲(絶対参照)
// 顧客管理!$A$2:$I$21:抽出対象の表のデータの範囲(絶対参照)

XLOOKUP関数では、縦方向の検索だけではなく、横方向の検索にも対応しています。
そのため、上記の数式を入力するだけで、該当する項目のデータを全て抽出することができます。
検索値のセルの参照のみを相対参照(「$」がない参照)にしているため、セルA2に入力した数式を横方向に必要な列数分コピーするだけで、複数項目でも瞬時に抽出することができます。

XLOOKUP関数では、指定した検索範囲に合わせて、縦方向だけではなく横方向にも検索することができます。
また、その検索方向に合わせて、抽出範囲(戻り範囲)から縦方向や横方向の複数の値を一括で抽出することができます。

▼サンプルファイル▼