2024/08/16
【ExcelVBA】選択セルの列幅を自動調整

【ExcelVBA】選択セルの列幅を自動調整

セルの列幅に収まらない値が入力されている場合、その値はセルからはみ出してしまいます。
右隣りのセルにも値が入力されている場合は、はみ出した値が見えなくなってしまいます。
その対策として、セル内の値を[折り返して表示する]や、セルの列幅を広げるといった方法がありますが、以下のような予定表などの場合は、見た目が悪くなってしまいます。

そのため今回は、選択したセルの列幅を自動で調整し、他のセルを選択すると同時に列幅が元に戻る仕組みを、VBAを用いて実現していきます。

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


仕組み

今回の仕組みは以下のようになります。

①セルを選択すると同時に、選択しているセルを基準に列幅を自動調整
②他のセルを選択すると同時に、列幅を元に戻す

「①」に関しては、予定表の中が選択された時のみに適用します。

「②」に関しては、曜日の列を基準に列幅を調整することで、元の状態に戻していきます。

特定のシート上のセルを選択すると同時に何かしらの処理を実行するには、シートモジュールを活用します。


1. 開発準備

シートモジュールを開くには、対象のシートタブの上で右クリックし、[コードの表示]を選択します。

表示された画面がシートモジュールの編集画面になります。

次に、編集画面の上部にあるリストから[Worksheet]を選択します。

選択すると「Worksheet_SelectionChange」というイベントプロシージャが表示されます。
万が一、異なるイベントプロシージャが表示された場合は、先ほどのリストの右隣りのリストから「SelectionChange」を選択してください。
※「Option Explicit」は環境設定によっては表示されません。

このイベントプロシージャは、該当するシートのセルの選択位置が変更されると同時に実行されるものになります。

ExcelVBAレベル確認

2. コードの記述

SubからEnd Subの間に、以下のコードを記述します。

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

「Worksheet_SelectionChange」の引数である「Target」には、選択されたセルの情報が渡されます。
先頭行の「If Target.CountLarge = 1 Then」から末尾の「End If」の中に関しては、「Target.CountLargr = 1」の条件を満たしている時のみ、要するに選択しているセルが複数ではなく1つの時のみに実行されます。

先ほどの条件を満たしている場合は、「Range(“C4:AF4”).Columns.AutoFit」が実行されます。
この処理は、「Range(“C4:AF4”)」を基準に列幅を自動調整するというものです。
「Range(“C4:AF4”)」は曜日が入力されているセルのため、この処理で、予定表全体が曜日のセルを基準とした列幅で自動調整されます。

次に、以下のIFの処理です。

こちらの内容は、以下の条件が書かれています。

・選択されたセルの行番号が5以上、かつ、19以下、かつ、列番号が3(C列)以上、かつ32(AF列)以下

つまり、予定を入力する範囲の中になります。

この範囲の中のセルが選択された場合に関してのみ、Ifの中の「Target.Columns.AutoFit」が実行されます。
「Target.Columns.AutoFit」は選択したセルを基準に列幅を自動調整するというものです。


3. 完成

以上の内容をシートモジュールに記述することで、機能としては完成です。
こちらの内容を実装したサンプルファイルは以下になります。

▼サンプルファイル▼

2024/08/02
【Excel】単位をセルの端に表示する

【Excel】単位をセルの端に表示する

以下のように、セルの値に対し単位をセルの端に表示する方法について解説していきます。

表示されている単位は、表示形式の設定による見た目のみで、セルの中身に関しては変わっていません。
そのため、単位を表示させたからといって、集計などに影響が出ることはありません。


単位を右端に表示する

まずは単位を右端に表示させます。
該当するセルを選択し、[ホーム]タブの[表示形式]の設定より[その他の表示形式]を選択します。

表示された書式設定の画面にて、[ユーザー定義]を選択し、[種類]のテキストボックス内に好みの表示形式を指定します。
こちらでは、カンマ区切りの数値を表示するため「#,##0」という書式記号を入力しています。

書式記号についての説明は、以下の記事をご確認ください。

>セルの表示形式の基礎から応用 ※メンバー限定
>セルの表示形式の設定方法


次に単位を設定します。
単位を表示する場合は、単位をダブルクォーテーションで囲って直接右端に入力します。
※表示する文字によってはダブルクォーテーションを省略することができるものも存在します。(「¥」、「$」、「+」、「-」、「=」、「(」、「)」、「:」、「’」、「>」、「<」、「/」)

また、その単位の左隣りに「*_(_は半角スペース)」を入力します。

「*」は直後の文字を繰り返して表示するという書式記号になります。
その後に「_(_は半角スペース)」を加えることで、半角スペースを右端まで繰り返して表示することができます。
その結果、以下のように単位を右端に表示することができます。

ちなみに、文字に対して「様」などを表示する場合は、文字をそのまま表示する書式記号「@」に「*_”様”(_は半角スペース)」を加えることで表示することができます。


単位を左端に表示する

次に単位を左端に表示する方法について解説していきます。

単位を左端に表示する時とは、以下のように「¥」を表示する時などになります。

上記の内容は、「¥」の後に半角スペースを繰り返して表示させ、最後に「#,##0」形式で表示させています。
そのため、書式記号で表現する場合、以下のような設定になります。

「¥」はダブルクォーテーションで囲む必要のない記号になるため、そのまま入力しています。
上記の設定を行うことで、単位のみを左端に表示することができます。

2024/07/26
【Excel】条件を満たしたセルに連番を入力

【Excel】条件を満たしたセルに連番を入力

以下の表の「作業内容」の項目に値を入力すると同時に「No」の項目に連番を表示する方法について解説していきます。


自動で連番を表示する

まずは準備段階として、「No」の項目の先頭に「1」のみを入力します。
次に、セルB6以降に「No」を表示する数式を入力していきます。

セルB6以降に入力する数式は、以下のような式になります。

・該当する行に関して、C列「作業内容」に値が入力されている場合に、B列「No」に連番を表示する
・「No」に表示する番号は、「No」を表示する行よりも上の範囲の最大値に1を加えた番号になる

この内容を満たした数式は、以下になります。

=IF(C6="","",MAX($B$5:B5)+1)
// セルB6に入力する数式

MAX関数で指定した範囲の最大値を取得することができるため、IF関数で該当する行のC列に値が入力されている場合に関してのみ、MAX関数で取得した値に1を加えた値を表示しています。

MAX関数の引数に設定している範囲($B$5:B5)は、該当する行よりの上の範囲になります。
セルB6の場合はセルB5~B5の範囲、セルB7の場合はセルB5~B6の範囲、セルB8の場合はセルB5~B7の範囲、という感じになります。

範囲の始まりのセル(B5)に関しては固定し、終わりのセル(数式を入力したセルの真上)に関しては相対的に変化させる必要があるため、「$B$5:B5」のように始まりのみを絶対参照($)にして終わりは相対参照にしています。

この数式を、連番を表示させたい範囲の最後までコピーすることで、「作業内容」の項目の値の有無に応じて連番を表示することができます。


注意点

この方法を活用する場合、行の挿入時に注意すべき点があります。
行を挿入した場合、挿入した範囲には数式が表示されません。
そのため、挿入した範囲内の「作業内容」の項目に値を入力してしまうと、間違った連番になってしまいます。

また、挿入したセルの次の行(B12)の数式に関しては、以下のように参照範囲がずれてしまいます。

=IF(C12="","",MAX($B$5:B8)+1)
// 理想はMAX($B$5:B11)となるべき

そのため、挿入した範囲にも数式を反映させる場合は、挿入した行の一つ上のセル(B8)の数式を、挿入した行の一つ下のセル(B12)までコピーする必要があります。

この数式の場合、上記の点が少しややこしいので、参照範囲がずれない別の数式についても解説していきます。


参照範囲がずれない数式

参照範囲がずれない数式とは、以下のような数式になります。

=IF(C5="","",COUNTA($C$5:C5))

この数式は、「No」の先頭の項目であるセルB5に入力します。

この数式は、数式を入力した行までの「作業内容」の項目に値が入力されているセルの数を表示するといったものなります。
指定した範囲内に値が入力されているセルの数を取得するためにCOUNTA関数を活用しています。
COUNTA関数に指定する範囲に関しては、セルB5に入力する数式の場合はセルC5~C5の範囲、セルB6の場合はセルC5~C6の範囲、セルB7の場合はセルC5~C7の範囲と、終わりの位置のみを相対参照で反映する必要があります。

そのため、「$C$5:C5」と始まりを絶対参照($)にして終わりを相対参照にしています。

こちらの数式を先ほど同様にコピーすることで、連番を表示することができます。

この数式の場合は、COUNTA関数の参照範囲の終わりの位置を、数式を入力している行と同じにしているため、行を挿入した場合に関しても、連番がずれてしまうことはありません。

挿入した行にも連番を表示させるには、「No」の項目に入力されている数式をコピーするだけで表示することができます。
最初に解説した数式とは異なり、挿入した行の一つ下のセル(B12)までコピーする必要はありません。

2024/07/19
【Excel】シフト表への入力を爆速にする

【Excel】シフト表への入力を爆速にする

以下のシフト表のように、「休」「早」「遅」といった文字を入力する際、毎回、直接入力するのは大変になります。
データの入力規則によりドロップダウンリストを活用した場合に関しても、1つ1つを選択して入力するのは大変です。

今回紹介する方法を使うことで、「1」を入力したら「休」、「2」を入力したら「早」を表示するなどと、1つのキーでシフト表に入力することができるようになります。

ExcelVBAレベル確認

数値に対して割り当てる

まずは、「1」には「休」などと、数値に対して特定の文字を割り当てる方法について解説していきます。

そのような場合は、条件付き書式を活用します。

初めに、「休」などといった文字を入力する可能性のある範囲を全選択し、[ホーム]タブより[条件付き書式]の[新しいルール]を選択します。

次に以下の画面にて、[指定の値を含むセルだけを書式設定]を選択し、「セルの値、次の値に等しい、1(直接入力)」となるように指定します。

次に書式を設定します。
[書式]を選択し、表示された画面の[表示形式]タブより[ユーザー定義]を選択して、テキストボックス内に「”休”」と入力します。

表示形式の設定が出来ましたら、[塗りつぶし]タブを選択し、好みの色を設定しておくと、「1」が入力されたセルの背景色を変更することができます。

これで確定し、条件付き書式の設定画面を閉じることで、「1」という数値に対して「休」という文字を割り当てることができます。

セルの背景色に関しても、[塗りつぶし]にて設定した色が反映されます。
ただ注意点として、この「休」という文字は見た目のみになります。
そのため、COUNTIF関数などで集計する際は、元の値の「1」に対して集計する必要があります。

他の「早」や「遅」に関しても、同様の手順で設定することができます。


文字に対して割り当てる

先ほど紹介した方法では、「1」や「2」などといった数値に対してしか設定することができません。
シフト表などに入力する文字に、「休」「早」「遅」以外にも沢山のパターンが存在する場合は、数値ではなくアルファベットの頭文字に割り当てた方が、入力が楽になる可能性があります。

数値ではなく、文字に対して割り当てる場合は、条件付き書式の設定画面にて、「セルの値、次の値に等しい、a(aに対して割り当てる場合)」までは同じ手順になります。

[書式]の設定画面により、[塗りつぶし]を設定する方法に関しても同様なのですが、[表示形式]の設定のみ異なります。

先ほどは、「”休”」と入力したのに対し、文字に対して割り当てる場合は、「;;;”休”」と先頭に「;」を3つ加える必要があります。

以上の手順で設定することにより、文字に対して文字を割り当てることができます。

表示形式の意味について知りたい場合は、下記の記事が参考になります。

>【1-04】セルの表示形式の基礎から応用

2024/07/05
【Excel】重複入力できないリストを作成

【Excel】重複入力できないリストを作成

以下の「役割のドロップダウンリスト(プルダウン)」に関しては、一度選択して入力した値が、リストの選択肢に表示されなくなります。

また、未割当の値に関しては、「未割当」という項目にて確認することができます。
この仕組みの作成方法について、解説していきます。


1. リストの作成

まずは、以下の表の「役割」の項目に、「未割当」の範囲を参照したリストを作成します。

リストを表示させる対象の範囲を選択し、[データ]タブの中の[データの入力規則]を選択します。

表示される以下の設定画面にて、[入力値の種類]を[リスト]にし、[元の値]に「未割当」の範囲を指定します。
[元の値]を設定する場合は、テキストボックス内を選択し、その状態で、「未割当」のセルD3からD7を直接選択することで、「=$D$3:$D$7」と入力することができます。

この内容で確定することで、「未割当」の項目の内容をリスト上に表示することができます。
「未割当」の項目に、仮の値を入力することで、反映内容の確認がしやすくなります。

「未割当」の項目には空白のセルを含むため、未入力のセルがある場合は、空白が表示されてしまいます。
こちらの内容は、後に対応していきます。


2. 数式で「未割当」を抽出

次に、数式を用いて、「未割当」の項目に表示する値を抽出していきます。
そのためには、まずは、リストの選択肢(役割)の一覧を用意する必要があります。
こちらでは、表の隣に一覧を用意しています。

どのように「未割当」を抽出するのかというと、用意した選択肢の一覧の内容と、リストを作成した「役割」の項目の内容を繋げてから、重複のない値のみを表示するという手順で抽出します。

イメージがしやすいように、一度、「役割」のリストの項目に、選択肢のいずれかを入力します。
直接入力してしまうと、前半で設定した[データの入力規則]の設定によっては、エラーになってしまいます。

そのため、選択肢の一覧の一部のセルを「Ctrl + C」などでコピーし、リストのセルに値のみを貼り付けて入力します。
値のみの貼り付けは、「Ctrl + Shift + V」で行えます。
万が一、このショートカットが使えない場合は、右クリックのメニューからでも、値のみを貼り付けることができます。

いくつか入力することができましたら、「役割」の項目の内容と、選択肢の一覧の内容を繋げた複数の値を、「未割当」の項目に数式で表示させます。

縦向きの表を縦方向に繋げるには、「VSTACK関数」を活用します。
この関数は、2022年の夏ごろに追加された関数になります。
Excelのバージョンによっては、活用できない可能性がございます。

VSTACK関数の使い方は、以下の通りです。

=VSTACK(表1, [表2], [表3], … )
// 指定した表を縦方向(垂直方向)に繋げた表を返す

実際に活用すると、以下のようになります。

=VSTACK(F3:F7,C3:C7)

数式は、セルD3にしか入力していませんが、スピルという機能により、自動で拡張されて表示されます。

ただ、この状態ですと、空白のセルが存在する場合は、「0」が表示されてしまいます。
空白のセルを「0」として表示したくない場合は、空白を含む範囲に関して、空白(””)を「&」で結合します。
今回の場合は、セルC3からC7に空白が存在する可能性があるため、その範囲に対して、「&””」を加えます。

=VSTACK(F3:F7,C3:C7&"")
ExcelVBAレベル確認

次に、この抽出した値から、重複のない値のみを抽出する必要があります。
重複のない値のみを抽出するには、「UNIQUE関数」を活用します。
UNIQUE関数の使い方は、以下の通りです。

=UNIQUE(表, 行/列, 表示内容)
// 指定した表から重複を除いた表を返す
// [表]:対象の表
// [行/列]:重複を確認する方法を指定(TRUE:一意の列、FALSE:一意の行)
// [表示内容]:表示する値を指定(TRUE:1回だけ出現する値、FALSE:全ての値)

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

=UNIQUE(VSTACK(F3:F7,C3:C7&""),FALSE,TRUE)
// 一意の行の対し、1回だけ出現する値を抽出

以上の設定にて、ほぼほぼ完成になります。


3. リストから空白を除外する

この状態では、リストに未入力のセルがある場合は、以下のように、空白が表示されてしまいます。

この空白が表示されないようにする方法として、「未割当」の項目に入力した数式により、スピルによって拡張された範囲のみをリストに表示させていきます。

まずは、リストを設定した範囲を選択し、[データ]タブの中の[データの入力規則]を選択します。

表示された設定画面にて、[元の値]に入力した「=$D$3:$D$7」を「=$D$3#」に修正します。
「#」というのは、基準となるセル(D3)からスピルにより拡張された範囲を指定するというものです。

これで確定することにより、スピルで拡張された範囲のみをリストに表示することができます。
そのため、最後の1つの項目のみになった時に関しては、リストに空白が表示されてしまうのですが、それ以外では、空白が表示されなくなります。

最後の1つの項目に関しても、空白を表示させないためには、VSTACK関数で空白を繋げる必要があります。
空白を繋げることで、残り1つになった場合に関しても、空白が重複し、表示されなくなります。

空白を繋げた数式は、以下になります。

=UNIQUE(VSTACK(F3:F7,C3:C7&"",""),FALSE,TRUE)

このように修正することで、最後の1つの項目に関しても、空白が表示されなくなります。

また、最後に空白を繋げることによって、リストの値が埋まった場合に関しても、空白が1つ「未割当」の項目に残るようになります。

スピルにより抽出された値に対して、表示する値が1つもない場合は、エラーになってしまうのですが、空白を1つ繋げることで、空白が表示され、エラーにならなくなります。

そのため、リストの値が埋まった場合に関しては、リストに1つの空白のみが表示されます。

リストから選択した値を変更する際は、リストの値をDeleteキーなどで削除することで、リストの選択肢が再度表示されるようになり、リストから値を変更することができます。

2024/07/05
【便利】開くと同時に対象シートの最終行を選択

【便利】開くと同時に対象シートの最終行を選択

#getNextDataCell #activate #onOpen

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

Googleスプレッドシートを開くと同時に、指定したシートの最終行のセルを瞬時に選択する方法について解説しています。

複数のシートが存在する場合は、それぞれの表の最終行を選択し、最後に指定したシートが開かれます。
一部のシートの自動選択を除外することもできます。

00:00 挨拶
00:49 完成イメージ
01:55 準備
02:35 作成(表の最終行の選択)
09:33 完成
09:59 プログラムの全体
11:29 まとめ

▼準備ファイル▼

2024/06/28
【ExcelVBA】ダブルクリックでデータを移動

【ExcelVBA】ダブルクリックでデータを移動

以下の「未完了の表」の中にあるタスク名をダブルクリックすることで、瞬時に、「完了の表」に該当するタスクを移動させる仕組みの実現方法について、解説していきます。

今回の仕組みを実現したサンプルファイルは、記事の最後にて配布しています。


1. 開発準備

特定のシート内の特定のセルをダブルクリックした時に、何かしらの処理を実行させる場合は、「シートモジュール」を活用します。
シートモジュールは、[開発]タブの中の[Visual Basic]を選択し、表示されたVBEの画面内の[プロジェクト]から、該当するシートをダブルクリックすることで、開くことができます。

他の方法ですと、該当するシートタブ上で右クリックし、表示されたメニューから[コードの表示]を選択することでも、シートモジュールを開くことができます。


次に、「セルをダブルクリックした時に実行されるイベントプロシージャ」を用意する必要があります。
そのため、シートモジュール上の[General]と書かれたリストから[Worksheet]を選択します。

恐らく、「Worksheet_SelectionChange」というイベントプロシージャが表示されるかと思います。

次に、隣のリストから[BeforeDoubleClick]を選択します。

そのようにすると、「Worksheet_BeforeDoubleClick」というイベントプロシージャが表示されるため、このプロシージャのみを残し、他は削除しても問題ございません。

この「Worksheet_BeforeDoubleClick」というイベントプロシージャが、シートモジュールが属するシート上のセルをダブルクリックした時に実行されるイベントプロシージャになります。


2. コードの記述

次に、SubからEnd Subの間に、以下のコードを記述します。

コードの内容について解説します。

「Worksheet_BeforeDoubleClick」では、引数である「Target」にダブルクリックされた対象のセルの情報が渡されます。
そのため、「If Target.Row >= 4 And Target.Column = 2 And Target.Value <> “” Then」にて、ダブルクリックされた対象が、4行目以上であり、2列目(B列)であり、空白でない場合に「If」から「End If」の間の処理が実行されるようにしています。
※1行のコードを改行する場合は、「(半角スペース)_」を入力します。

「4行目以上、2列目」というのは、該当するシート上の「未完了の表」の中を指します。

次に、「Worksheet_BeforeDoubleClick」の引数の「Cancel」を更新します。
[Cancel]の値を「True」にすることで、ダブルクリック後の動作(セル内にカーソルが表示され、編集モードに切り替わる)を中断することができます。

今回の目的は、タスク名が入力されたセルを移動させることになるため、「Cancel = True」と記述し、ダブルクリック後の動作を中断しています。

最後に以下の内容です。

「Target.Copy」にて、ダブルクリックされたセル自体をコピーし、「Range(“D4”).Insert xlDown」にて、セルD4の位置に、コピーしたセルを挿入しています。
「xlDown」では、セルの挿入後に、セル全体が下方向に移動するように指定しています。

そして、「Target.Delete」にて、元のセルを削除することで、未完了タスクを上に詰めています。

「Target.Delete」に関しては、「Target.Delete xlShiftUp」のように「xlShiftUp」と記述し、「上方向にシフト」と指定することもできますが、省略時は「xlShiftUp」が適用されるため、こちらでは省略しています。

以上で完成になります。
実装したサンプルファイルは、以下になります。

▼サンプルファイル▼

2024/06/21
【Excel】存在しているシートのみ目次にリンクを表示

【Excel】存在しているシートのみ目次にリンクを表示

以下のように、予め、[目次]シートに追加する予定のシート名一覧表を作成し、存在しているシートのみに、そのシートへ遷移するリンクを表示する方法について解説していきます。


1. シートへのリンクを作成する

初めに、以下のようなシート名一覧表を作成し、今後追加する予定のシート名を入力します。
また、シート名一覧表には、[リンク]という項目を用意します。

まずは、それぞれのシートのセルA1に遷移するリンクを、HYPERLINK関数を用いて作成していきます。
この関数の使い方は、以下になります。

=HYPERLINK(リンク先, [別名])
// 指定したリンク先に遷移するリンクを作成する
// リンク先:リンク先の情報を指定
// [別名]:セルに表示させる文字を指定(省略時は引数[リンク先]に指定した値を表示する)

HYPERLINK関数を用いて、特定のシートのセルに遷移するリンクを作成する場合は、引数[リンク先]に、「#セルのアドレス」と指定する必要があります。

例えば、「ABC」というシートのセルA1に遷移する場合は、「#ABC!A1」になります。
「!」などの特殊な文字が含まれるシート名「!ABC」のシートに遷移する場合は、「#!ABC!A1」などと、シート名を「」で囲む必要があります。
そのため、予め「’」で囲んだシート名を指定しておくと良いです。

今回の場合、シート名は、表の中のセルの値を参照する必要があるため、「&」を活用し、以下のような数式を入力します。

=HYPERLINK("#'"&B4&"'!A1","●")
//「#’」とセルB4の値、「’!A1」を「&」で文字結合

後は、こちらの数式を表の最後までコピーすることで、リンクを作成することができます。

ただ、このままですと、存在していないシートに関してもリンクが表示されてしまいます。
存在していないシートを選択すると、以下のように、エラーが表示されてしまいます。

ということで、次は、存在しないシートに関しては、リンクを表示させない仕組みを実現していきます。


2. 存在しないシートへのリンクを非表示にする

HYPERLINK関数のみですと、常にリンクが表示されてしまうため、他の関数を組み合わせる必要があります。
まずは、シートの存在の有無を数式で求めていきます。

シートの存在の有無を求めるには、INDIRECT関数が便利です。
この関数の使い方は、以下になります。

=INDIRECT(参照文字列)
// 指定した参照文字列を参照した値を返えす
// 参照文字列:参照先の情報

INDIRECT関数を活用して、引数にリンク先のアドレスを指定することによって、そのリンク先が存在しない場合にエラーを返すことができます。

試しに、表の隣にINDIECT関数を入力して、シートの存在の有無を確認していきます。

=INDIRECT("'"&B4&"'!A1")

数式を入力して表の最後までコピーすると、存在しているシートの場合は、そのシートの指定したセルの値が表示され、存在していない場合は、「#REF!」というエラーが表示されます。

ExcelVBAレベル確認

次に、エラーの場合はTRUE、エラー出ない場合はFALSEを返すISERROR関数で囲みます。(ISERROR関数で囲むだけなので、関数の解説は省略します)

=ISERROR(INDIRECT("'"&B4&"'!A1"))

このようにTRUEとFALSEを表示することができました。
後は、TRUEの場合のみに、HYPERLINK関数の内容を表示すればよいので、IF関数を活用します。
この関数の使い方は、以下になります。

=IF(論理式, 値が真の場合, 値が偽の場合)
// 論理式の値に応じて返す値を変更する
// 論理式:TRUEもしくはFALSEを返す式
// 値が真の場合:論理式がTRUEの時に返す値
// 値が偽の場合:論理式がFALSEの時に返す値

実際に、INDIRECT関数、ISERROR関数、IF関数をHYPERLINK関数の数式に組み合わせると、以下のようになります。

=IF(ISERROR(INDIRECT("'"&B4&"'!A1")),"",HYPERLINK("#'"&B4&"'!A1","●"))

このようにして、シートが存在している行のみにリンクを表示させることができます。
リンクの色が青色にならない場合は、手動で書式を設定すると良いです。

この作成方法の場合、リンクが表示されていない空白のセル上にカーソルを移動した時に関しても、カーソルが指マークになってしまいます。
ただ、リンクとしては機能せず、クリックしてもセルが選択されるだけなので、そこまで問題ではないです。
該当するシートが追加された時に、自動でリンクが表示されます。

2024/06/14
【Excel】条件付き書式で二重の罫線を設定

【Excel】条件付き書式で二重の罫線を設定

以下の表では、日付が変わる位置を二重の罫線にしています。
この罫線は、条件付き書式により、自動で設定されます。

しかし、条件付き書式で設定できる罫線には、二重の罫線は存在していません。

通常の機能としては用意されていないのですが、とある方法により、二重の罫線を条件付き書式で表現することが可能になります。
今回は、その方法について解説していきます。


通常の罫線

まずは、二重の罫線ではなく、通常の罫線を設定する方法について解説していきます。

こちらでは、以下の表を元に、日付が変わる位置に罫線を設定する条件付き書式を設定していきます。

まずは、罫線を設定する可能性がある対象の範囲(条件付き書式を設定する範囲)を選択します。
こちらでは、A~C列全体を選択し、その後にCtrlキーを押しながら、セルA1~C2を選択して、以下のように対象の範囲のみを選択します。

対象の範囲の選択ができましたら、[ホーム]タブより[条件付き書式]の[新しいルール]を選択します。

表示された条件付き書式の設定画面にて、[ルールの種類]を[数式を使用して、…]にし、条件式を入力していきます。

条件式は、選択基準のセルに対しての数式になります。
こちらの場合は、セルA3が選択基準のため、「セルA3の場合、どのような時に罫線を設定するのか」を考えていきます。
その条件とは、以下のようになります。

・セルA3とA4が一致しない場合

数式にすると「=A3<>A4」になります。
また、この条件式は、他の選択している範囲にも相対的に反映されます。

今回罫線を設定する範囲は、A~C列になるため、B列とC列の場合を考慮する必要があります。
こちらでは、日付が不一致の場合という条件を指定する必要があるため、B列やC列であっても、必ずA列を確認する必要があります。
そのため、以下のように、A列に「$」を加え、絶対参照にして、条件式を設定します。

=$A3<>$A4

設定後は、[書式]を選択し、[罫線]タブより、下側の罫線のみを指定します。

以上の設定を行ってから確定することで、以下のように、罫線を設定することができます。


二重の罫線

では次に、二重の罫線を設定する方法について解説していきます。
先ほどの罫線とは違い、二重の罫線は、設定画面には表示されません。
そのため、考え方を変える必要があります。

別の考え方とは、「予め、二重の罫線を設定しておき、日付が同じ場合に、通常の罫線に戻す」というものです。
条件付き書式で、二重の罫線が設定できないため、二重の罫線を設定するのではなく、二重の罫線を通常の罫線に戻す方向で考えていくと、実現することが可能になります。

そのため、まずは、表全体の罫線を二重の罫線にします。

次に、二重の罫線を設定した範囲を選択している状態で、[条件付き書式]の[新しいルール]を選択します。

表示された条件付き書式の設定画面にて、[ルールの種類]を[数式を使用して、…]にし、条件式を入力していきます。

こちらでは、二重の罫線を通常の罫線に戻す条件式を入力する必要があるため、以下のような、先ほどとは逆の条件式になります。

=$A3=$A4

この条件式を設定し、以下のように、[書式]にて通常の罫線を設定します。

以上の設定を行ってから確定することで、以下のように、二重の罫線を設定することができます。
(正確には、対象外の二重の罫線を通常の罫線に戻すことができます)


補足

同じ理屈で、太い罫線などといった他の罫線でも設定することができるので、こちらの方法を覚えておくと役立ちます。

2024/06/07
【Excel】リンク付きの目次を簡単に作成

【Excel】リンク付きの目次を簡単に作成

複数のシートが存在するブック関して、シートの目次を簡単に作成する方法について解説していきます。

ExcelVBAレベル確認

ハイパーリンクの作成

通常、シートへのリンクを作成する場合は、以下の手順になります。

① リンクを作成したいセルの上で右クリックし、[リンク]を選択

② 設定画面にて、[このドキュメント内]から対象のシート名を選択

この手順を行うことで、以下のようにリンクを作成することができます。

ただ、このリンクの作成方法の場合、他のシートに対しても1つ1つ設定する必要があるため、シートの数が多いブックの場合は、若干大変になります。

この目次のリンクを作成する作業を、もう少し効率的に行う場合は、HYPERLINK関数を用いて、数式で作成する方法がオススメです。

ExcelVBAレベル確認

HYPERLINK関数で作成

一度、HYPERLINK関数を用いてリンクを作成してしまえば、今後は数式を修正することなく、他のシートへのリンク作成時にも繰り返し活用することができます。

まずは、HYPERLINK関数の使い方から確認していきます。
HYPERLINK関数の使い方は、以下になります。

=HYPERLINK(リンク先, [別名])
// [リンク先]に指定したアドレスに、遷移するリンクを作成
// [別名]に、リンクに表示させる文字を指定(省略時は[リンク先]に指定したアドレスが表示される)

HYPERLINK関数を用いて、特定のシートの特定のセルに遷移するリンクを作成する場合は、セルのアドレスの先頭に「#」を加えたアドレスを引数[リンク先]に指定します。

例えば、「田中太郎」というシートのセルA1に遷移するリンクをHYPERLINK関数で作成する場合は、以下のようになります。

=HYPERLINK("#田中太郎!A1")

※シート名に「!」などの文字が含まれる場合は、以下のように「’」でシート名を囲む必要があります。

=HYPERLINK("#'田中太郎'!A1")

また、引数[別名]に好みの文字を指定することで、表示させる文字を変更することができます。

=HYPERLINK("#田中太郎!A1","開く")

後は、この数式の「田中太郎」という文字をB列のセルの値を参照するように修正します。
B列のセルの値を参照したアドレスを指定するには、以下のように「&」を活用します。

=HYPERLINK("#"&B5&"!A1","開く")

※今後、シート名に「!」などの文字が含まれる可能性がある場合は、以下のように、シート名を「’」で囲んだ数式にしておくと良いです。

=HYPERLINK("#'"&B5&"'!A1","開く")

このような数式を1度作成することによって、他のシートへのリンクは、数式をコピーするだけで作成することができます。

シート名が変更された場合に関しても、数式を直接修正することなく、表の中のシート名を修正するだけで、リンクに反映させることができます。

2024/06/01
【業務】ユーザーフォームで画像管理

【業務】ユーザーフォームで画像管理

#従業員管理 #画像 #Kill #GetOpenFilename #FileCopy #Path #Dir #LoadPicture #シートモジュール #ユーザーフォーム #Worksheet_BeforeDoubleClick #UserForm_Initialize

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

従業員管理システムとして、従業員の顔写真をユーザーフォーム上で管理する方法について解説しています。
画像の削除や変更などを簡単に行うことができます。

また、画像は特定のフォルダの中で管理されるため、画像の枚数が増えてもExcelファイルのサイズが大きくなることはありません。

00:00 挨拶
00:36 完成イメージ
02:40 準備
04:32 作成(ユーザーフォーム)
08:52 作成(初期化)
20:54 作成(画像削除機能)
24:47 作成(画像選択機能)
30:50 作成(フォーム表示)
34:11 完成
35:11 プログラムの全体
43:00 まとめ

▼準備ファイル▼

2024/05/31
【ExcelVBA】数式「AND(3,4)」とVBA「3 And 4」は違う!?

【ExcelVBA】数式「AND(3,4)」とVBA「3 And 4」は違う!?

IF関数などに設定する倫理式(TRUEもしくはFALSEを返す式)に関して、Excelの数式やVBAでは、「0」がFALSE、「0」以外の数値がTRUEという意味として扱われます。

しかし、AND条件にすると、VBAでは、以下の黄色のセルのように、理想通りの結果にならないことがあります。

「3」と「4」では、ともに「0」以外の数値であるため、AND条件ではTRUEになるかと思うのですが、VBAではFALSEになってしまいます。
今回は、「なぜVBAのAND条件では理想通りの結果を返さなかったのか」について解説していきます。


原因と対策

結果に違いが発生する理由は、Excelの数式での判定方法とVBAでの判定方法が異なるためです。
そのため、判定方法の違いについて確認していきます。

Excelの数式での判定方法は、条件1つ1つに対し、TRUEかFALSEかを判定して、AND条件の場合は、複数の条件がTRUEなのかを判定しています。
そのため、「3」と「4」の比較では、「3」がTRUEで「4」もTRUEのため、「AND(3,4)」ではTRUEという結果になります。

それに対しVBAでは、1つ1つの条件に対し、ビット単位で演算しています。
具体的には、二進数のビット単位(各桁同士)での演算になります。

「3」という数値を二進数で表現すると「0011」になり、「4」という数値を二進数で表現すると「0100」になります。

AND演算とは、「0」と「1」では「0」になり、「1」と「0」でも「0」となり、「1」と「1」の場合に関してのみ「1」となるような演算になります。

そのため、「0011」と「0100」をビット単位でAND演算すると、右から1桁目は「1」と「0」で「0」、2桁目も「1」と「0」で「0」、という感じで「0000」という結果になります。
「0000」という二進数は「0」という数値を意味するため、FALSEという結果になったということになります。

もし、数値同士をVBAで比較したい場合は、以下のように「0でない場合」という条件を加えると良いです。