エクセル

Excel用2020年(令和2年)の祝日

この記事は自分用の覚書です。

■MacBook Pro macOS Catalina
バージョン 10.15.1

■Office365 Business サブスクリプション
Excel for Mac バージョン 16.31 (19111002)

H.K さん。
2020年の祝日の一覧です。そのままエクセルのシートにコピー貼り付けできます。

NETWORKDAYS 関数などで、引数の [祭日] を指定する際に使ってください。

・NETWORKDAYS 関数の書式(Excel for Mac ヘルプ より)
NETWORKDAYS(開始日, 終了日, [祭日])

NETWORKDAYS 関数は、引数「開始日」から「終了日」までの期間で、土曜、日曜、「祭日」を除く日が何日あるかを返します。「何営業日あるか」ということですね。

日付と曜日を表示したければ、セルの書式の「日付」のところを変えるか、ユーザー定義書式で、

yy年m月d日(aaa)

とか打ってください。
この場合は、20年1月1日(水) といった表示になります。

くれぐれも、セルの中に曜日を入れないように。
それをやったら、もうただの文字列です。日付はシリアル値のまま扱うのが鉄則です。

2020/1/1 元日
2020/1/13 成人の日
2020/2/11 建国記念の日
2020/2/23 天皇誕生日
2020/2/24 振替休日
2020/3/20 春分の日
2020/4/29 昭和の日
2020/5/3 憲法記念日
2020/5/4 みどりの日
2020/5/5 こどもの日
2020/5/6 振替休日
2020/7/23 海の日
2020/7/24 スポーツの日
2020/8/10 山の日
2020/9/21 敬老の日
2020/9/22 秋分の日
2020/11/3 文化の日
2020/11/23 勤労感謝の日

| | コメント (0)

Excel for macでセルの値を削除できなくして、オートフィルタは使えるようにしておく。

この記事は自分用の覚書です。

■MacBook Pro macOS Catalina
バージョン 10.15.1

■Office365 Business サブスクリプション
Excel for Mac バージョン 16.31 (19111002)

K.Y さん。

Excel for macでセルに入っている大事な値を消せなくして、オートフィルタは使えるようにしておく手順です。

■課題
オートフィルタで値を絞り込んで平均を求めるなどの作業をする。その途中でセルの値を消せないようにしておく。

■課題の実現のためにすることについて
一言でいえば、「シートの保護」です。
「シートの保護」で次の2つを行います。

・「ロックされたセルの選択」を禁止。
・「フィルター」の実行を許可。

「"ロックされたセルの選択を禁止" ってなんだ? セルがロックされていたら、もう何もすることはないだろう。」と感じるかもしれませんが、そこは慣れてください。
文字でうまく説明できません。ごめんなさい。

「シートの保護」という表現に、「シートが変更されないように守る」という印象をもつかもしれませんが、少し違います。
「"シート上で、できることとできないこと" を選択する」のが「シートの保護」機能だと思ってください。

課題を実現するために、「シートの保護」を実行する前に「コピーしたり、フィルタをかけたりできるようにしておくセルを決める」操作をします。

コピーしたり、フィルタをかけたりできるようにしておくセルを決める。

1.「シートの保護」の実行後に選択できるようにしておきたいセルを選択する。
コピーしたいセル、フィルタをかけるために使う列の1行目のセルなど。

2.「セルの書式設定」で「保護」タブをクリック

3.「ロック」のチェックを外してOKをクリック
これで、コピーしたり、フィルタをかけたりできるようにしておくセルを決めたことになります。

Cell_syosiki_hogo

「保護」タブの「ロック」にチェックが入っているのは、セルの標準の状態です。

「ロックにチェックが入っているのに、いままで入力したり削除できていたのか?」と感じるかもしれませんが、今はそのあたりも深く考えないで「そういうものだ」と思ってください。うまく説明できないです。ほんと、ごめんなさい。
どうしても気になるようでしたら、今度会ったときに聞いてください。口頭でなら説明できそうな気がします。

大事な値が入ったセルを削除できなくして、オートフィルタは使えるようにする。

1.表にオートフィルタを表示させておく。

2.メニューの「ツール」の「保護」から「シートの保護」を選択。

3.「ロックされたセルの選択」のチェックを外す。
「保護」タブでロックにチェックが入っているのは、セルの標準の状態です。
なので、ここのチェクを外すのは、それらのセルを選択できなくするということです。

そもそも選択できなければ、削除できないということですね。

4.「ロックされていないセルの選択」と「フィルタ」にチェックが入った状態にする。
先に、ロックのチェックを外したセルを選択できるようにするためと、オートフィルターを使えるようにするためです。

5.「OK」をクリック。
これで、そのシートでコピーしたり、フィルタをかけたりしたいセルは選択できるようになっています。
それら以外の大事な値が入ったセルは選択できなくなったので、削除できなくなっています。

Sheet_no_hogo

なお、「シートの保護」が実行してあるシートには、シート名の横に錠前のマークが表示されます。

Sheet_no_hogo2

| | コメント (0)

Excel で「上位○位」「下位○位」「それら以外」をわかるようにする。

この記事は自分用の覚え書きです。

■MacBook Pro macOS Mojave
バージョン 10.14.6

■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.29(19090802)

I.E さん。

Excel で「上位○位」「下位○位」「それら以外の点数」がわかるようにするやり方を考えてみました。
あれこれと関数を使わないで、誰でもさわれるようにしておきたい。——ということだったので、関数1つとあとはオートフィルタで対応するやり方です。

手順さへわかれば「エクセルを使うのは初めて」という人にもやっていただけると思います。

■課題
データ数は1万2千件数百。
氏名の「ヨミ」で「昇順」に並び替えてあるので、「点数」の列は何の順にもなっていなくて、大小の点数が散らばっている。
そのままの状態で、「上位2千人」「下位2千人」「それら以外の点数」がわかるようにしておきたい。

■手順

以下の例では、わかりやすくするためにデータ数を15件にしてあります。
抜き出すのは、上位5位と下位5位にしてみました。
実際のデータ数は1万2件越えだそうですが、何件あってもやることは同じです。

こういう表ですよね。「ヨミ」の昇順で並べてあるので、点数は何の順にもなっていません。
(ネット上にある人名を生成してくれるサービスで、氏名をつくっています。)

00yomi_syoujun

やることは大きく3つです。

  1. 作業列を2つ追加して、点数について「高い方から数えた場合の順位」と「低い方から数えた場合の順位」を求める。
    使う関数は、RANK.EQ 関数だけです。
  2. 「高い方から数えた場合の順位」について、オートフィルタで1位から5位までを抜き出してセルに色をつける。
  3. 「低い方から数えた場合の順位」について、同じく1位から5位までを抜き出して、別の色をセルにつける。

「上位」と「下位」のセルに色をつけておけば、「それら以外」も見た目でわかります。

では、手順の詳細です。

1.「高い方から数えた場合の順位」と「低い方から数えた場合の順位」を求める。

上位○位と下位○位を見つけるために、RANK.EQ 関数を使って点数の順位をまず求めます。

順位を求めるために昔からあるのは RANK 関数ですが、現在は RANK.EQ 関数の利用をマイクロソフトは推奨しています。
互換のために RANK 関数は残っていますが、将来的にいつ廃止されてもおかしくありません。 ヘルプの RANK 関数の説明にもそんな風に書いてますから、これからは RANK.EQ 関数を使っておくのがよいと思います。

元の表に作業列を追加して、各人の点数について「高い方から数えた場合の順位」と「低い方から数えた場合の順位」を求めます。
D列とE列が作業列です。それらのセルに数式を入れています。

01koujunn_syoujun

RANK.EQ 関数の書式は次のようです。

RANK.EQ(数値,範囲,[順序])

引数「順序」に 0 (ゼロ) を指定するか、順序を省略すると、引数「範囲」のなか「数値」について、高い方から数えた順位が表示されます。
上図では、D列の数式内で 0 を指定しています。

セル D2 の数式は、=RANK.EQ(C2,$C$2:$C$16,0) になります。
引数「順序」は省略してもよいのですが、引数があることを一応示しておきたくて 0 を入れました。

D2 を下にコピーするので、「点数」の範囲が変わらないように絶対参照にしておくのが大事です。
セル C6 の 100 が、C列の中では一番大きいので、D6 に 1 が表示されています。

次は、E列のセルの数式です。セル E2 の数式は、=RANK.EQ(C2,$C$2:$C$16,1) です。
「順序」に 0 以外の数値(ここでは 1にしています。0 に対して 1 としておくのが考えやすいと思ったからです。 )を指定すると、「範囲」のなかの「数値」について、 低い方から数えた順位が表示されます。
上の図ではセル C15 の 39 が、C列の中で一番小さいので、E15 に 1 が表示されています。

なお、1万2千を超える行数だと数式をコピーするのは大変です。
図のような表だと、D2 に数式を入れたら、セルの右下角にカーソルを合わせて、パッドを2本指で2回タップすると、D列の一番最後の行まで数式が入力されます。
D列を入力したあとならE列でも同じことができます。

Fillhandl02

2.「高い方から数えた場合の順位」について、オートフィルタで1位から5位までを抜き出す。

順位を求めたら、「高い方から数えた順位」について上位5位を抜き出します。
D列でオートフィルタの「指定の範囲内」を選んで、「1以上5以下」を指定します。
(実際には、ここで「1以上2000以下」を指定ですね。)

データ件数がいくつかあるか(この場合は5つに決まってますが)は、ステータスバーに表示されます。
(図ではステータスバーは載せていません。)

02joui5nin01

上位5位が表示されます。

「点数」の列のセルに色をつけておきます。ここでは、薄い青にしてあります。

実際は2000件ですから、control+shift+↓で、一番下のセルまで一気に選択できます。
下図でいえば C4 をクリックしてから control+shift+↓ です。

03joui5nin02

RANK.EQ 関数は、同点の場合は同じ順位をちゃんとふってくれます。
上図では、セル D4 と D16 のどちらも 90点 で2位なので、2 が表示されています。

3.「低い方から数えた場合の順位」について、1位から5位までを抜き出す。

オートフィルタをクリアして、今度は「低い方から数えた順位」——下位5位までのデータを抜き出します。
することはD列のときと同じです。
E列でオートフィルタの「指定の範囲内」を選んで、「1以上5以下」を指定します。
(実際は、ここでも「1以上2000以下」を指定)

04kai5nin01

下位5位が表示されるので、「点数」の列のセルに先とは異なる色をつけます。
ここでは、薄いオレンジにしてあります。

05kai5nin02

これで「上位5位」と「下位5位」、「それら以外の点数」がわかるようになっています。

オートフィルタをクリアして全体を見てます。
下図のC列で薄い青がついているセルが上位5位、薄いオレンジがついているセルが下位5位です。
色がついていないセルが、それら以外の点数です。

06tensu_irodukego01

| | コメント (0)

「アクティブ列との相違」を使って、他のセルとは異なっている数式を見つける。

この記事は自分用の覚え書きです。

■macOS Mojave
バージョン 10.14.6

■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.28(19081202)

「アクティブ列との相違」について。

「アクティブ列との相違」の実行にはショートカットキーが用意されている。
数式が入っているセルを選択しておいて、control + shift + ¥ を押す。

Active_retutonosoui01

他のセルと違っている数式が入っているセルが選択される。

Active_retutonosoui02

セルを選択する際に、どのセルがアクティブになっているかが大事。
上記の図では、E1 がアクティブになっている。
そのセルと比較して異なっているセルを選択することになるので。

範囲選択してからアクティブなセルを変更するには、Tab(shift + Tab)を押す。

上図のような表の場合、列の中の他のセルと違った数式が入っているセルがあると、そのセルには「矛盾した数式」のエラー表示がされるので、見た目で何か違っていることがわかる。

行数の少ない表ならそれで間に合うが、行数が多くなってくると、その中からエラー表示されているセルを視認するのは難しくなる。
そんなときに、このやり方が便利。

選択されたセルの数を確認する。

選択されているセルの個数は、ステータスバーに表示される。

Sentaku_cellnokazu

選択されたセルの数式を修正する。

セルが選択されている状態で、 F2 キーを押す。

一番上にあるセルが編集モードになるので、数式を修正する。

Cell_syuusei

修正が終わったら、command キーを押しながら Enter キーを押す。

修正した内容が他のセルにも適用される。

| | コメント (0)

Excel for Mac で、ふりがなが入力できない現象の回避

この記事は自分用の覚え書きです。

■macOS Mojave
バージョン 10.14.3
標準の日本語入力。

■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.23(190309)

■起きている現象
option + shift + ↑ で、ふりがな編集の状態にできるが、ふりがなの入力ができない。
ひらがなを入力する状態にしてあるのに、英字しか入力できない。
ふりがなの領域をクリックしても、カーソルがそこにいかない。

Hurigana1

■回避策
option + shift + ↑ で、ふりがな編集の状態にしたら、なんでもいいのでいったん英字を打つ。
そうすると、ふりがなの領域をクリックできるようになり、ひらがなも打てるようになる。

Hurigana3

Hurigana4

Hurigana5

| | コメント (0)

Excel のソルバーで制約条件を整数にしてあっても少数になる。

この記事は自分用の覚え書きです。

■macOS Mojave
バージョン 10.14.3
■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.22(190211)

ソルバーを使えるようにする。

メニューの「ツール」から「Excel アドイン」を選択。

「Solver Add-in」にチェックを入れて、OKをクリック。
これでソルバーが使える。

課題

ソルバーを実行すると、変数として指定したセルの制約条件を「整数」に指定してあるのに少数が入ってしまう。(下図:B列のセルが少数になっている。)

次の制約条件を守りながら、人数を変えていって総計金額が最大になるところを探っている。

・人数のセル( B2 から B4)は整数。(人数なので)
・総人数10名以下。
・各金額ごとに1名以上。(0名は無し。)
・総計金額30万円以下。

Solver_jikkougo1

原因

ソルバーの「オプション」で「整数制約条件を無視する」にチェックが入っている。

「オプション」を変更してソルバーを実行する。

メニューの「ツール」から「ソルバー」を選択。

「ソルバーのパラーメーター」の画面になるので、「オプション」をクリック。

Solver_option1

「整数制約条件を無視する」のチェックを外してOKをクリック。

Solver_option2

「ソルバーのパラメーター」の画面に戻るので、「解決」をクリックすると計算が始まる。

「ソルバーの結果」が表示されたら、変数として指定したセルに入っているソルバーの結果を確認。

ソルバーの結果がそれでよければ、「ソルバーの解の保持」にチェックを入れてOKをクリック。
(「計算前の値に戻す」にチェックを入れると、ソルバーの結果をセルに入れない。)

Solver_kaiketu

「整数制約条件を無視する」のチェックを外したので、変数として指定したセルに整数が入力される。(B列のセルが整数になっている。)

Solver_jikkougo2

| | コメント (0) | トラックバック (0)

セル内改行ごとに文章を分ける。

この記事は自分用の覚え書きです。

■macOS Mojave
バージョン 10.14.3
■ Office365 Business サブスクリプション
Excel for Mac バージョン 16.22(190211)

M.K さん。

職場に Mac が入ってきましたね。慣れていないので、使っているとなんか変な気分です。
いろいろ話を聞いていると、どうも今後は Mac になっていくような……。

うちの社内でバリバリとエクセルを使うというのなら、Windows版エクセルのほうがよいと思うのですが。

社内のPCがどうなるかなんて僕らにはどうにもならない話です。不平不満は飲み込んで、粛々と従うしかないですね。

とはいえ、愚痴を言いたくなるもので——Mac版エクセルは、致命的ではないですがどこか雑な感じがします。
なにより、Windows版には実装されている「データの取得」がありません。

これには驚きました。
Excel for Mac のユーザーはずっとこの環境を強いられていたんですね。今もまだ……。

米マイクロソフトのサイトにある "excel.uservoice" の "Add PowerPivot to Mac excel" というカテゴリーには、「早く実装してください!」といった声がたくさん寄せられています。
「データの取得」が実装されるのはいつになるやら——です。

そういえば、Office365サブスクリプションですよ。お金を定期的に取っておいて今まで放置——実装されるのはいつになるかわからない——なんていうのは……マイクロソフトもなかなか太いことをするなあと思います。

大人の事情がいろいろあるんでしょうね。

とまあ、セル内改行をしている文章を、それぞれ別のセルに分ける件です。
1つの段落内に「。」が複数箇所あるので、「。」を区切り文字付きの「。/」といった感じに置換するやり方では、改行ごとに分けることはできません。

Hukusuumaru_wo_kugirimojituki_ni_ku

■考え方
Windows版でもそうですが、セル内改行は改行コードを伴っています。目には見えませんが。
だとしたら、改行コードそのものを区切り文字に置き換えてやれば、エクセルの「区切り位置」の機能を使って、セル内改行ごとに分けることができます。

■手順
ここでは、CHAR 関数と SUBSTITUE 関数を使っています。

Cellnai_kaigyouwo_tikan

1. CHAR 関数で改行コードを生成
=CHAR(10) の数式で改行コードを生成できます。
Windows版エクセルと同じです。

Excel for Mac では「CHAR(13) が改行コードになる」との記述がネットでは見当たりますが、私の手元では CHAR(10) で改行コードを生成できています。

Excel for Mac のバージョンによって違うのかもしません。そのあたりは私にはわかりません。

2. SUBSTITUE 関数でそれを区切り文字(上図では半角の / )に置換
何をしているかがより理解しやすいように、作業列で CHAR 関数と SUBSTITUE 関数を分けました。(セル B2 と C2 )

セル A2 のなかにある改行コードが、セル C2 では / になっています。

区切り文字として使える字数は1文字。
仮に、SUBSTITUE 関数で改行コードを // に置き換えても、「区切り位置」の機能では使えない。

3. SUBSTITUE 関数が返してきた結果( C2 )をコピーして、任意のセルに「値貼り付け」。
C2 のままでは「区切り位置」の機能は使えないので、隣のセル( D2 )に値貼り付けしています。

4. セル D2 を選択しておいて、「データ」タブの「区切り位置」をクリック

5. 「区切り記号付き」にチェックを入れて「次へ」

01kugiriiti

6. 「その他:」をチェックして隣の欄に区切りとして使う文字を入力し、「次へ」
区切り文字は全角と半角を区別する。
SUBSTITUE 関数で改行コードを半角の / に置換しているので、ここでは 半角の / を入力している。

02kugiriiti

7. 今回扱っているのは単なる文字列なので、列のデータ形式は「標準」のままでよい。
「表示先」で任意のセル参照を入力。(図では E2 )

03kugiriiti

8. 「完了」をクリックするとセル D2 の文字列が別々のセルに分かれる。

| | コメント (0) | トラックバック (0)

Excel for Mac の VBE で変数の宣言を強制する。

この記事は自分用の覚え書きです。
(MacBook Pro (macOS Mojave 10.14.1) + Excel for Mac 16.19(181109) Office365 Business サブスクリプション)

Excel を起動したら、option + F11 で VBE を起動する。
(Touch Bar にファンクションキーが表示されていないときは、fn キーを押しながら、option + F11 を押す。)

画面上部にあるメニューバーの「Excel」から「環境設定」を選択。

「変数宣言が必要です」にチェックを入れて、OKをクリック

S20181124_125926

これで、変数を必ず宣言して使う状態になっている。

| | コメント (0) | トラックバック (0)

Excel で第二月曜日は何日かを求める。

この記事は自分用の覚書です。
(Windows 10 Pro 64ビット + Excel2016 Office365 Business サブスクリプション  バージョン1810(ビルド11001.20074)

H.K さん。

ある月の第二月曜日は、何日になるかを求めるやり方です。
月曜日を対象にしていますが、何曜日であっても基本的な考え方、やり方は同じです。

日数や曜日を扱う計算については、インターネット上でたくさんの方々がいろいろな解説をしてくれています。

もっとわかりやすい説明があるかと思います。見つけたら私にも教えてくださいね。

考え方

以下、当たり前の話ですが大事なところなのであらためてふれておきます。

第二月曜日というのは、その月で二度目の月曜日です。
「ある日が二度目の月曜日」なのは、一度目の月曜日が過ぎてから初めておとずれた月曜日だからです。

一週間は七日あります。

ということは、「第一月曜日の日付(シリアル値)」がわかれば、それに 7 を足すと第二月曜日の日付を求めることができます。

たとえば、2018年11月なら、第一月曜日が 11月5日 だとわかれば、2018/11/5 + 7 の計算で、第二月曜日である 2018/11/12 を求めることができます。

そして、「ある日付が第一月曜日である」とわかるには、その月の「一日は何曜日か」がわからなければなりません。

一日が日曜日なら第一月曜日は翌日の2日だとわかります。
一日が火曜日なら第一月曜日は7日です。

「その月の一日の曜日」を求めることが最初にすることです。

「すること」を順番で並べると――

1.「その月の一日は何曜日か」を調べる。

2.1 の答えをもとに、「第一月曜日の日付(シリアル値)」を求める。

3.2 の答えである日付に 7 を足して「第二月曜日」を求める。

となります。

ちょっと話がそれますが、曜日を考えるとき、横軸上に左から右に順に並んでいるものとしてイメージしませんか? 
日・月・火・水・木・金・土――このように曜日を捉えると、今回の処理は考えづらいかと思います。

曜日が円形につながっているものとして捉えると、今回の処理は考えやすいと私には思えました。

週の始めを日曜日からとしたほうが考えやすい人もいるでしょうし、月曜日からにしたほうが考えやすい人もいるでしょう。
一週間の曜日を円形に並べて捉えれば、どちらの考え方をする人でも、今回の処理は少しでも考えやすくなると思うのですが、どうでしょうか。

Shitiyou_2

その月の一日の曜日を 1 として時計回りに数えてください。

一日が日曜なら、日曜を 1 として時計回りに数えると、第一月曜日は2日です。一日が火曜なら、火曜を 1 として 2,3,4,5,6,7 と数えて第一月曜日は7日……というふうに。

一つひとつの処理を作業列に分けて行う。

話を元に戻します。上記の3つを一つのセルでやろうとすると、数式がネストされたややこしいものになってしまいます。

仕事でつくるファイルは、できるかぎり、誰が見てもわかりやすくつくるべきです。
そういう意味で、作業列を使って処理の過程を分けるのが望ましいです。作業列で過程を分ければ全体として何をしているかを理解しやすいです。

仕事でつくるファイルでは、ネストしなければならない具体的な理由がない場合は、数式のネストは避けるのが望ましいと私は思っています。

1.「その月の一日は何曜日か」を調べる。

全体としては、次の図のようにしてみました。

01dainangetuyoubi

A列からD列で、「その月の一日は何曜日か」を調べています。

C列では、DATE 関数で一日の日付をつくっています。
もともとは年と月しか入っていない表だということでしたので、そこからそれぞれの月の一日を求めています。

また、C列のセルの書式を yyyy/m/d(aaa) にして、何曜日であるかが見た目でもわかりやすいようにしてみました。

一日の日付をつくったら、何曜日かを求めます。それがD列です。

C列はセルの書式で曜日を表示していますが、書式は計算につかえる値にはなりません。
曜日を、計算で使える値にしてやる必要があります。

WEEKDAY 関数でそれができます。書式は次のようです。

WEEKDAY(シリアル値,[週の基準])

D列で使っている WEEKDAY 関数では、引数「週の基準」を省略しているので、日付が日曜だったら 1 を返します。

月曜なら 2 を、火曜は 3 というように返してきます。土曜なら 7 が返ってきます。
一週間の曜日を表す数字なので、返ってくる値は 1 から 7 までです。

・引数「週の基準」を省略した際に WEEKDAY 関数が返す値
日曜日→1
月曜日→2
火曜日→3
水曜日→4
木曜日→5
金曜日→6
土曜日→7

2.「第一月曜日の日付(シリアル値)」を求める。

一日が何曜日かを表す数字ができたので、それをもとに第一月曜日が何日かを求めます。
E列とF列でそれをやっています。

なお、図では、少しでもわかりやすくなるかと思って、E列にはセルの書式設定で「日」を表示するようにしてあります。

ここで、冒頭の円の図をもう一度見てみてください。
一日が何曜日かによって変わってくる「第一月曜日が何日か」の確認です。

一日が日曜だったら、時計回りに 1,2 と数えて第一月曜日は2日です。
一日が月曜なら第一月曜日は当日です。
一日が火曜なら第一月曜日は7日になります。
水曜なら6日です。
木曜なら5日です。
金曜なら4日です。
土曜なら3日です。

――というように、一日の曜日によって、第一月曜日が何日なのかが変わってきます。

どんな数式をつくればよいかというと、

WEEKDAY 関数が返す値が、

・ 1 (一日が日曜)なら 2 を返す。
・ 2 (一日が月曜)なら 1 を返す。
・ 3 (一日が火曜)なら 7 を返す。
・ 4 (一日が水曜)なら 6 を返す。
・ 5 (一日が木曜)なら 5 を返す。
・ 6 (一日が金曜)なら 4 を返す。
・ 7 (一日が土曜)なら 3 を返す。

ができればいいわけです。
返ってきた値が、第一月曜日は何日かを示しています。

02dainangetuyoubi

Office365サブスクリプションの Excel2016 には、こういうときに最適な関数が実装されています。 SWITCH 関数です。

円の次の図では、セル E2 にはこういう数式が入っています。

=SWITCH(D2,1,2,2,1,3,7,4,6,5,5,6,4,7,3)

SWITCH 関数の書式は次のようです。

SWITCH(式, value1, result1, [既定値または value2, result2],…[既定値または value3, result3])

SWITCH 関数は、(式と呼ばれる) 1 つの値に対して値の一覧を評価し、最初に一致する値に対応する結果を返します。
(出典:Excel「ヘルプ」)

上記の式でいうと、( )のなかで最初は D2,1,2, になっています。
D2 の値が 1 の場合は、2 を返すという指定です。

その月の一日が日曜(D2 が 1)なら、第一月曜日は2日ということです。

その次を見ると、D2,1,2,2,1, になっていますから、一日が月曜(D2 が 2)なら、返す値は 1 です。当日が月曜なので。

その次は、3,7 が続きます。一日が火曜(D2 が 3)なら 7 を返します。第一月曜日は7日です。

そうやって残りも、4 なら 6、5 なら 5 、6 なら 4 、7 なら 3 を返すというように指定しています。

実際には、E列のセルは次のように入力しています。
2行目以降ではスペースを入れて頭をそろえています。

=SWITCH(D2,1,2,
                   2,1,
                   3,7,
                   4,6,
                   5,5,
                   6,4,
                   7,3)

こうしておけば、「(D2が)1 なら 2 を返す、2 なら 1 を返す、3 なら 7 を返す……」といった組み合わせが理解しやすいですよね。

03dainangetuyoubi_switch

なお、Office365サブスクリプションではない Excel では、CHOOSE 関数で対応できます。

CHOOSE 関数の数式は、

=CHOOSE(D2,2,1,7,6,5,4,3)

となります。

D2 に入るのは、1 から 7 です。
2,1,7,6,5,4,3 の部分は、D2 の値によって返す順番に並べています。

D2 が 1 なら、2 を返します。(並びの一番目を返す)
D2 が 2 なら、1 を返します。(並びの二番目を返す)
D2 が 3 なら、7 を返します。(並びの三番目を返す)……

書き方が違うだけで、 SWITCH 関数も CHOOSE 関数も結果は同じです。

IF 関数でも可能ですがお勧めしません。その理由は想像すればわかりますよね。
「IF 関数ならこうなります」という例を作ろうとしたくもありません。かなり面倒です。

=IF(D2=1,2,IF(D2=2,1,""))

2つだけやってみました。2つ目のIFを入力したときにもうやりたくなくなりました。

E列で第一月曜日は何日なのかがわかったので、それをもとにF列では、 DATE 関数で第一月曜日の日付をつくっています。

3.第一月曜日の日付に 7 を足して「第二月曜日」を求める。

G列が第二月曜日の日付です。
F列の第一月曜日の日付に 7 を足しています。

F列の時点で、 =DATE(A2,B2,E2)+7 というように 7 を足せば、F列で第二月曜日を求められますが、ここでは、「第一月曜日の日付(シリアル値)がわかれば、それに 7 を足すことで第二月曜日を求めることができる」という思考の過程がよりわかりやすいように分けてみました。

これで作業終了です。
こうやって作業列で処理を分けると全体で何をやっているかが理解しやすくないですか。

仕事でつくるファイルでは、作業列を積極的に使ってください。

別の曜日について

なお、別の曜日でも考え方は同じです。
違ってくるのは、この例でいうなら SWITCH 関数の引数です。

また、第三○曜や第四○曜日を求めるには、第一月曜日の日付に 7 を足して第二月曜日を求めたように、処理を分けて 7 を足していけばいいです。

| | コメント (0) | トラックバック (0)

Excel for Mac でも VBA で日本語が使える。

この記事は自分用の覚書です。
・Windows 10 Pro 64ビット バージョン:1803 OSビルド:17134.345
Excel2016 Office365 Business サブスクリプション  バージョン1809(ビルド10827.20150)
・MacBook Pro (High Sierra 10.13.6)
Excel for Mac 16.18(181014) Office365 Business サブスクリプション

N.T さん。

Windows 側でつくったマクロですが、H.K さんに手伝ってもらって Excel for Mac で正常に動くことを確認できました。

マクロ名や変数名が日本語でも問題なく動きました。
少なくとも、試した環境においては日本語を含むという理由で正常に動かないことはないといえます。
標準モジュール上での日本語の入力も問題なくできましたよ。

試した流れは次のようです。

1. Windows 版 Excel のほうでコードを書く。

2. 拡張子xlsm で保存してからファイルを Mac 側に渡す。

3. Excel for Mac でファイルを開いてもらってマクロを実行

テストに使ったプロシージャは以下のようです。
ちょっとだけひねくれた書き方をしてみました。この程度で不具合が起きるなんてありえんだろうと思いましたが、テストなのであまりしない書き方を。

このプロシージャなら、普通なら For の行を For i = 2 To 11 にして、 Cells プロパティでは i に 1 は足さないですよね。

■試したプロシージャ

Sub サンプル()
Dim i As Long
Dim 連番用足し込み As Long

For i = 1 To 10
    連番用足し込み = 連番用足し込み + 1
    Cells(i + 1, "A").Value = 連番用足し込み
Next i
'
'セル A2 から A11 に、1 から 10 までの連番を入力する。
'
End Sub

| | コメント (0) | トラックバック (0)

より以前の記事一覧