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条件では理想通りの結果を返さなかったのか」について解説していきます。

ExcelVBAレベル確認

原因と対策

結果に違いが発生する理由は、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/30
【業務】対象の住所の地図を自動表示

【業務】対象の住所の地図を自動表示

#シートモジュール #ユーザーフォーム #Worksheet_SelectionChange #地図 #住所 #緯度 #経度

YouTubeで開く

※2025年現在、Bingマップの仕組みが新しくなったため、VBAのWebブラウザでは表示できなくなりました。

住所一覧表のいずれかのデータを選択すると同時に、対象の住所の地図が自動で表示される機能になります。

00:00 挨拶
00:45 完成イメージ
01:31 準備
02:02 開発方法
03:46 作成(ユーザーフォーム)
06:04 作成(地図の表示)
11:38 作成(フォーム自動立上げ)
18:21 完成
19:15 プログラムの全体
23:52 まとめ

▼準備ファイル▼

2024/05/29
【Excel】空白のセルが上になるように並べ替え

【Excel】空白のセルが上になるように並べ替え

以下の表の[進捗]の項目には、「済」という文字が入力されているセルと空白のセルがあります。

この項目を基準に、昇順や降順に並べ替えしても、どちらも「済」が上になってしまい、空白のセルを上にすることができません。

今回は、このような表に対し、空白のセルが上になるように並べ替えする方法について解説していきます。


条件付き書式の設定

この表のままですと、何回昇順や降順に並べ替えしたとしても、空白のセルを上にすることはできません。
そんな時は、色で並べ替えします。

とは言え、「進捗」の項目には色が設定されていません。
そのため、今回は、空白のセルに色を設定することで、空白のセルを上に並べ替えできるようにしていきます。

毎回、空白のセルに色を設定するのは大変ですので、条件付き書式を活用すると良いです。
以下の表の場合は、「進捗」の範囲であるセルC3からC12に対し、条件付き書式を設定していきます。

まずは、対象の範囲(セルC3からC12)を選択し、[ホーム]タブの中の[条件付き書式]より[新しいルール]を選択します。

次に、[ルールの種類]を[指定の値を含むセルだけを書式設定]を選択し、下に表示されるリストより[空白]を選択します。

上記のように設定することができましたら、[書式]を選択し、好みの色で塗りつぶしをします。
こちらでは、[塗りつぶし]タブより白色を選択しています。

これで、表の中の[進捗]の項目に対し、セルの値が空白の場合に、白色の背景色を設定することができました。


色で並べ替え

空白のセルに色を設定することができたため、空白のセルが上になるように色で並べ替えしていきます。
そのため、フィルターボタンより[色で並べ替え]の白色を選択することで、以下のように空白のセルを上にすることができます。

ExcelVBAレベル確認

補足

先ほどは、フィルター機能の中の並べ替えを活用していますが、[データ]タブの中の[並べ替え]機能でも、フィルター機能の中の並べ替えと同様に、色で並べ替えることができます。

2024/05/27
【Excel】数式の引数に途中の行から最終行までを指定

【Excel】数式の引数に途中の行から最終行までを指定

以下の参加者名簿から参加人数を数式で求める方法の1つとして、COUNTA関数を用いて、セルB5以降の値の入力されているセルを数えるという方法があります。

しかし、Excelには、現時点でセルB5から最終行までという指定方法がありません。
そのため、通常であれば、「B5:B100」などと仮の最終行で、以下のように指定することが多いかと思います。
※Googleスプレッドシートでは、「B5:B」と指定することで、最終行まで指定することができます。

今回は、比較的新しい関数であるDROP関数を組み合わせて、セルB5から最終行までを指定する方法について解説していきます。

ExcelVBAレベル確認

途中の行から最終行までを指定する

まず初めに、DROP関数の使い方から解説していきます。
DROP関数の使い方は、以下の通りです。

=DROP(範囲, 行数, [列数])
// 指定した[範囲]の先頭から、指定した[行数]や[列数]を取り除いた範囲を返す
// 列を取り除く必要がない場合は、[列数]を省略できる

以下の表の場合、指定したい範囲はセルB5以降になります。
そのため、DROP関数を用いて、次のように指定することができます。

=DROP(B:B,4)
// B列の上から4行を取り除く

この範囲をCOUNTA関数で集計することで、以下のように、セルB5以降を指定することができます。

=COUNTA(DROP(B:B,4))
ExcelVBAレベル確認

スピルとの組み合わせ

データの増減を考慮した数式を作成する際に、DROP関数を覚えておくと便利かと思います。
また、スピルにより抽出した範囲の一部を除外する、以下のような場合にも役立ちます。

=COUNTA(DROP(B3#,2))
// セルB3の数式により展開された範囲の先頭から2行を取り除く
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/22
【Excel】項目を瞬時に選択するリンクを作成

【Excel】項目を瞬時に選択するリンクを作成

項目数の多い表の場合、特定の項目をスクロールして探すのは大変になります。
そんな時は、項目名のリストを作成し、リストから項目名を選択することで、その項目に遷移できる機能を作成してみるのも良いかと思います。

こちらでは、セルA1に項目名のリストを作成し、セルA2にリストで指定した項目の位置に遷移するリンクを、数式で作成する方法について解説していきます。

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


1. 項目名のリスト

初めに、項目名のリストをセルA1に作成していきます。

今回使用するファイルは、以下のように、リストとリンクを配置できるようにA列を開けています。

まずは、セルA1を選択し、[データ]タブの中の[データの入力規則]を選択します。

表示される以下の画面にて、[入力値の種類]を「リスト」にし、[元の値]に表の見出しの範囲を指定します。

設定できましたら、[OK]を選択して確定することで、以下のようなリストを作成することができます。

ExcelVBAレベル確認

2. 項目に遷移するリンク

次に、リストで指定した項目に遷移するリンクを作成していきます。

まずは、遷移先のアドレスを求める数式を作成する必要があります。
例えば、該当する項目の2行目に遷移したい場合は、「B2」や「D2」などといったアドレスになります。

このアドレスを求めるには、ADDRESS関数とMATCH関数を活用します。
まずは、MATCH関数を活用して、対象の項目の列番号を取得していきます。
MATCH関数の使い方は、以下の通りです。

=MATCH(検査値, 検査範囲, 照合の種類)
// 指定した[検査値]が[検査範囲]内に存在する場合、先頭からの位置情報を番号で返す
// [照合の種類]では、検索方法を指定する

今回は、MATCH関数の[照合の種類]では、「0」の完全一致という設定のみを活用していきます。
[検査値]がリストによって指定された項目名で、[検査範囲]が表の見出しになるため、以下のような数式になります。

=MATCH(A1,B2:L2,0)

ただ、この数式の場合、B列からの列番号になってしまうため、実際の列番号とは異なります。
上記の画像の場合に関しても、本来は「5」という番号が理想なのですが、「4」となってしまいます。
そのため、A列分の「1」を加えた以下のような数式に修正します。

=MATCH(A1,B2:L2,0)+1

では、列番号を求めることができたため、2行目の指定した列番号のアドレスを、ADDRESS関数を活用して取得していきます。
ADDRESS関数の使い方は、以下の通りです。

=ADDRESS(行番号, 列番号, [参照の種類], [参照形式], [シート名])
// 指定した情報のアドレスを返す

今回は、ADDRESS関数の[行番号]と[列番号]の引数のみを設定します。
他の「[ ]」で囲まれている引数に関しては、省略することができるため、こちらでは省略します。

[行番号]に関しては「2」、[列番号]に関しては先ほどのMTACH関数の内容を指定することで、以下のようにアドレスを求めることができます。

=ADDRESS(2,MATCH(A1,B2:L2,0)+1)

表示されたアドレスに関しては、「$」が付いている絶対参照になっていますが、このままでも問題ございません。


最後に、ADDRESS関数で求めたアドレス先へ遷移するリンクを、HYPERLINK関数を活用して作成していきます。
HYPERLINK関数の使い方は、以下の通りです。

=HYPERLINK(リンク先, 別名)
// [リンク先]に指定したアドレスへ遷移するリンクを作成する
// [別名]に指定した値をリンクに表示させる

HYPERLINK関数を活用して、特定のセルへ遷移するリンクを作成する場合は、先ほどのアドレスの先頭に「#」を加える必要があります。
特定の文字を加えるには「&」を活用して、以下のように「#」を加えたアドレスを求めることができます。

="#"&ADDRESS(2,MATCH(A1,B2:L2,0)+1)

では、このアドレスをHYPERLINK関数の[リンク先]に設定し、[別名]に関しては、「選択」という文字を設定して求めていきます。


以上の手順で、以下のように、リストで指定した項目へ遷移するリンクを作成することができました。


補足

必要に応じて、ウィンドウ枠を固定すると、より快適に場合があります。
今回の場合は、常にA列のリストとリンク、2行目の見出しを表示した方が操作しやすいかと思うので、セルB3を選択し、[表示]タブの中の[ウィンドウ枠の固定]の[ウィンドウ枠の固定]を選択して固定すると良いです。

▼サンプルファイル▼

2024/05/20
【Excel】取り消し線を瞬時に設定

【Excel】取り消し線を瞬時に設定

以下のような取り消し線を瞬時に設定する方法について解説していきます。


一般的な方法

取り消し線を設定する場合、一般的な方法ですと、対象の範囲を選択し、[右クリック]のメニューから[セルの書式設定]にて行うかと思います。

取り消し線の設定は、[セルの書式設定]の画面の中の[フォント]タブの中にある[取り消し線]のチェックボックスになります。

ただ、取り消し線をよく設定する場合、[セルの書式設定]から毎回行うのは大変になります。
よく設定する場合は、次のショートカットがオススメです。


ショートカット

取り消し線を設定するショートカットは「Ctrl + 5」になります。
この「5」はテンキーではなく、キーボードの上に「1~9,0」と並んでいる中の「5」になります。

対象の範囲を選択して、Ctrlキーを押しながら5のキーを押すだけで、以下のように、取り消し線を設定することができます。


補足

取り消し線だけですと、あまり目立たないため、活用する場合は、セルの背景色に関しても変更すると良いです。

2024/05/18
【番外-032】「文字列の数字」を「数値」に変換

【番外-032】「文字列の数字」を「数値」に変換

#SUM #VALUE #文字列 #数値

YouTubeで開く

「文字列の数字」を瞬時に「数値」に変換する方法について解説しています。

00:00 挨拶
00:12 文字列の数字が混ざっているとダメな理由
01:08 一括で数値に変換する方法
04:31 まとめ

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キーで次の行の開始列のセルを選択するという手順を行うことで、効率的に、表に値を入力することができます。

ExcelVBAレベル確認

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つ目の方法が特におすすめになります。


補足

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

2024/05/15
【便利】シート内に他のシートを表示

【便利】シート内に他のシートを表示

#INDIRECT #HYPERLINK #名前の定義 #スクロールバー #ダッシュボード

YouTubeで開く

シート内に他のシートを表示させる方法について解説しています。
また、表示させたシートに関しても、行の移動が行える仕組みになっています。
ダッシュボードとして、複数のシートの一部を1つのシートにまとめる際にも活用できます。

00:00 挨拶
00:48 完成イメージ
01:40 準備
02:08 作成(シートの表示)
11:39 作成(リンク)
13:09 完成
15:02 まとめ

▼準備ファイル▼

2024/05/15
【Excel】隣接したセルの書式を自動反映させない

【Excel】隣接したセルの書式を自動反映させない

以下のような表があります。

この表の下のセルB8に値を入力すると、以下のように、自動で書式が設定されてしまいます。

このような機能は、場合によっては、迷惑に感じられることがあるかと思います。
今回は、特別な設定をせずに、書式の自動反映を無効にして値を入力する方法について解説していきます。


隣接したセルの書式が自動反映される理由

まずは、隣接したセルの書式が自動で反映される理由について解説していきます。

自動で反映される理由は、Excelのオプションにて、[データ範囲の形式および数式を拡張する]という設定がされているためになります。

【設定手順】

1.[ファイル]タブから[オプション]を選択する

2.Excelのオプションにて、[詳細設定]の中の[データ範囲の形式および数式を拡張する]にチェックし、[OK]を選択して確定する

この設定がされている場合、以下の条件を満たす時に、自動で書式が反映されるようになっています。

[条件]
数値(文字列)なら数値(文字列)というように同じ形式の値で、尚且つ、同じ書式が3行(列)以上続いている時

そのため、先ほどの例では、「太文字の背景色が黄色」という書式が3行以上続いているので、同じ書式が反映されました。


特別な設定をせずに書式の自動反映を無効にする方法

次に、特別な設定をせずに、書式の自動反映を無効にする方法について解説していきます。

それは、値を入力した後にCtrlキーを押しながらEnterキーで確定するという方法になります。
こちらの方法の場合、確定後に選択しているセルの位置が変わらなくなってしまいますが、書式を反映せずに以下のように入力することができます。


まとめ

Excelの標準設定ですと、自動反映する機能が有効になっているため、意図的に無効にしている方は少ないかと思います。
そのため、ご自身の環境で自動反映の機能を無効にしている場合に関しても、上記の方法を覚えておくと役立つかと思います。