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つのキーでシフト表に入力することができるようになります。


・数値に対して割り当てる

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

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

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

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

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

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

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

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

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

・文字に対して割り当てる

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

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

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

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

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

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

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

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

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



YouTubeで開く

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

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

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

▼準備ファイル▼

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

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

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

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

・リストの作成

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

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

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

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

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

・数式で「未割当」を抽出

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

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

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

そのため、選択肢の一覧の一部のセルを「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&"")

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

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

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

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

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

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

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

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

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

表示された設定画面にて、[元の値]に入力した「=$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/06/28
【ExcelVBA】ダブルクリックでデータを移動

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

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

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


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

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


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

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

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

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

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


次に、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】存在しているシートのみ目次にリンクを表示

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


・シートへのリンクを作成

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

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

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

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

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

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

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

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

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

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

ExcelVBAレベル確認

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

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

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

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

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

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

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

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

次に、エラーの場合は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】リンク付きの目次を簡単に作成

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

・ハイパーリンクの作成

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

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

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

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

ただ、このリンクの作成方法の場合、他のシートに対しても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

YouTubeで開く

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

また、画像は特定のフォルダの中で管理されるため、画像の枚数が増えても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でない場合」という条件を加えると良いです。

2024/05/24
【Excel】指定した年月の第3水曜日の日付

【Excel】指定した年月の第3水曜日の日付

以下のように、年月を指定することで、その年月の第3水曜日の日付を取得する方法について解説していきます。

こちらでは、第3水曜日の日付を求めていきますが、同じ理屈で、他の週の他の曜日の日付なども求めることができます。


・求め方

まず初めに、求め方について考えていきます。
2024年の4月の第3水曜日の場合、2024年4月17日になります。
この日付を数式で求めるのは、若干難しそうですが、考え方次第では簡単に求めることができます。

まずは、指定した年月の第3水曜日という見方を変えてみます。
他の見方ですと、「水曜日以外が定休日で、前月末から3日後の営業日」ということもできます。

この理屈の場合は、指定した年月を基準とした前月末の日付をDATE関数で求め、3日後の営業日をWORKDAY.INTL関数で求めることで、第3水曜日の日付を求めることができます。


・実践

では実際に、DATE関数とWORKDAY.INTL関数を用いて、第3水曜日の日付を求めていきます。

まずは、指定した年月を基準とした前月末の日付を、DATE関数を活用して求めていきます。
DATE関数の使い方は、以下の通りです。

=DATE(年, 月, 日)
// 指定した[年],[月],[日]の日付を返す

このDATE関数を用いて、指定した年月を基準とした前月末の日付を求める場合は、以下のようになります。

=DATE(C2,C3,0)

なぜ、[日]に「0」と指定することで求めることができるのかというと、DATE関数の月と日に関しては、桁上がり桁下がりに対応しているためになります。
0日ということは、1日の1日前になるため、前月末の日付が求められたということになります。


次に、この前月末から3日後の営業日を、WORKDAY.INTL関数を活用して求めてきます。
WORKDAY.INTL関数の使い方は、以下の通りです。

=WORKDAY.INTL(開始日, 日数, [週末], [祭日])
// 指定した[開始日]から指定した[日数]後の営業日の日付を返す
// [週末]に定休日、[祭日]に不定期の休みを指定する

「[ ]」で囲まれている引数は省略することができます。
今回は、[祭日]を考慮する必要がないため、[祭日]の引数に関しては、省略します。

[週末]にて、水曜日以外を定休日という設定を行います。
ただ、[週末]の項目を選択した時に表示されるリストの中には、「水曜日以外を定休日」とする項目は存在しません。

そのため、リストに表示された番号からではなく、直接指定する必要があります。
直接指定する場合は、月曜日から日曜日に関して、「0:営業日」と「1:定休日」を並べた文字列を入力します。
そのため、水曜日以外を定休日とする場合の設定値は、「”1101111”」になります。

実際に、[開始日]にDATE関数で求めた前月末の日付、[日数]に「3」、[週末]に「”1101111”」を指定して、第3水曜日の日付を求めると、以下のようになります。

=WORKDAY.INTL(DATE(C2,C3,0),3,"1101111")

このようにして、指定した年月の第3水曜日の日付を求めることができました。
年月に関しては、セルの値を参照しているため、セルの値を変更することで、他の年月に関しても求めることができます。

2024/05/17
【Excel】表に値を効率的に入力

【Excel】表に値を効率的に入力

以下の表のようなフォーマットがあり、赤枠の中に値を入力する作業があるとします。

値を入力する際に、1行入力したら、次の行の先頭列を選択する必要があります。
先頭列を選択する際に、毎回、カーソル(矢印)キーやマウスで選択するのは大変です。

今回は、1行入力したら一瞬で次の行を選択することができる方法について3通りで解説していきます。


(1)TabとEnterで移動

1つ目は、TabキーとEnterキーで移動する方法です。
通常、Tabキーを押すと、右隣りにカーソルが移動し、Enterキーを押すと下にカーソルが移動します。

Tabキーで右隣りへ移動した場合は、移動する前の開始の位置が記録されます。
そのため、以下のように、セルB8を基準にTabキーでセルD8まで移動した場合に関しては、開始の位置がセルB8だと記録されています。

Enterキーでの下へ移動は、記録されているセルを基準に下へ移動します。
そのため、上記の状態ですと、セルD8が選択されていますが、Enterキーでの移動先はセルB9になります。

そのため、値を入力する際に、初めに先頭列のセル(セルB8)を選択し、1行(1データ)に関しては、入力してTabキーで次の項目へ移動し、1行(1データ)の入力を終えたら、Enterキーで次の行の開始列のセルを選択するという手順を行うことで、効率的に、表に値を入力することができます。

(2)Tabキーのみで移動

2つ目は、Tabキーのみで移動する方法です。
先ほどの方法ですと、1行(1データ)の入力後にEnterキーで確定する必要がありましたが、こちらの方法では、Tabキーのみに統一することができます。
Tabキーのみに統一する場合は、初めに入力対象の範囲全体を選択する必要があります。
そのため、表の場合は以下のように選択します。

このように選択することで、Tabキーのみで移動することができるようになります。

ちなみに、このように選択すると、Enterキーでは開始の列に戻れなくなります。
Enterキーの役割としては、下へ移動、一番下まで移動した場合は、次の列の先頭行のセルへ移動となります。

TabキーとEnterキーに関して、最後のセル(右下)まで移動した場合、次にキーを押した際には、先頭のセル(左上)に移動します。

他にも、以下のコマンドが使用できるので、セットで覚えておくと役立ちます。

・Shift + Tab:左隣へ移動
・Shift + Enter:上へ移動

(3)範囲を選択せずにTabキーのみで移動

先ほどの方法では、範囲を選択する必要がありましたが、最後、3つ目に、範囲を選択せずにTabキーのみで移動する方法について解説していきます。

選択せずにTabキーで移動するには、表をテーブルにする必要があります。
ただ、テーブルにするだけですと、元々のデザインが壊れてしまうため、必要に応じてデザインを修正する必要があります。

テーブルにする場合は、対象の表を、表の見出しを含め全選択し、[挿入]タブの中の[テーブル]を選択します。

次の画面が表示されましたら、選択範囲の先頭行が見出しとなるため、[先頭行をテーブルの見出しとして使用する]の項目にチェックをしてから[OK]で確定します。

以上の作業で、表をテーブルにすることができます。
ただ、表にフィルターが設定されたり、縞模様になったりとデザインが変わってしまいます。
作成されたテーブルを選択すると[テーブル デザイン]タブが表示されるため、そのタブからデザインを修正します。
こちらでは、[フィルター ボタン]と[縞模様(行)]の表示を解除しています。

デザインを修正することで、元の見た目に近づけることができます。

テーブルにすることで、Tabキーのみで移動することができるようになります。

手前のセルに戻る場合は、Shift + Tabで行えます。

また、こちらの方法では、1つ目の方法と同様に、Tabキーで移動して、最後にEnterキーで先頭に移動するということもできます。

・それぞれの方法の欠点

1つ目の方法の欠点は、途中の項目から値を入力した時に活用できないという点です。
途中から開始してしまうと、そのセルが開始の位置として記録されてしまうため、先頭の項目にEnterキーで移動することができません。

2つ目の方法の欠点は、表の範囲を選択した後に、入力したいセルまで移動する必要があるという点です。
小さな表であれば、そこまで大変ではありませんが、項目数が多い表の場合などは、入力したい位置まで移動するのが大変になります。

3つ目の方法の欠点は、テーブルにするため、テーブルの終端に括弧のマークが表示されてしまうという点です。
ただ、このマークはテーブルの最後の位置を示しているだけなので、印刷時には影響ありません。

それぞれの欠点を考慮した上で、3つ目の方法が特におすすめになります。

【補足】

テーブルにした場合、スクロール時に見出しが見えなくなると、列名の部分に見出しが表示されるようになります。
このような機能を含め、基本、表はテーブルにするのが良いかと思います。