ぼくLog

子持ち、車持ち、マンション持ちの僕の日常を綴ります。車と、ラクをしたい一心で覚えたエクセルVBAを中心になりそうです。

宮古島の海はめちゃくちゃ綺麗!まさにシュノーケリング天国|シギラビーチ

f:id:yt4u:20170719225903j:plain

行ってきました宮古島。ぼく人生初の宮古島です。

もうね、海がめちゃくちゃ綺麗。

子どもと一緒にシュノーケリングするぞ!って宮古に行ったわけですけど、ほ~んと、ひたすらシュノーケリング三昧でした。
アッチのビーチに行ってはシュノーケリング、コッチのビーチに行ってはシュノーケリング。我ながらよく飽きずにそんなにやっていられるな、ってくらいシュノーケリングをやりましたよ、ハイ。


ということで、シュノーケリングをした宮古島のビーチを紹介していきます。


シギラビーチでウミガメに遭遇!

まず最初に行ったのがシギラビーチ。

だって、今回はちょっと奮発してシギラベイサイドスイート アラマンダに泊まったんだもん。


シギラビーチの醍醐味はなんと言ってもウミガメ!
宮古島周辺の海域はウミガメの生息地だということで、各所でウミガメに出会えるらしいです。

その中でシギラビーチは、サンゴで囲まれたインリーフ。波も穏やかな中で、近くでウミガメに逢えるのが魅力です。

ウミガメに遭うアクティビティツアーも複数の業者が扱っています。


そんなツアーに参加しなくてもウミガメに遭えることを期待してLet’s シュノーケリング

足がつかない海に少しビビリ気味の6歳の息子の手を引いて、あちこち探し回りました。


まぁ、なかなか見つかりません。ウミガメ。

でも時々、ウミガメがいると自然とそこに人だかりが出来るんですよね。

なので、そこを目指して泳いでいくと、、、

いましたっ!ウミガメ!!

f:id:yt4u:20170726213318j:plain


この時ばかりはビビリ息子も我を忘れてウミガメに大興奮。
ウミガメの横に並んでみたり、後ろからついて行ってみたりと夢中で海の中を泳ぎまくってました。


シギラビーチは、子どもと一緒にウミガメと泳ぐのを目的として行ったわけですが、宮古島初日から幸先よく目的達成です。
遭遇できなかったらツアーに参加するつもりでいましたが、わりとあっさり出会えちゃいましたね。


ただちょっと残念だったのが2つ。

ひとつが、サンゴの死滅している割合が多かったこと。
これは1年前の2016年夏に台風が少なく、海水温が上がり過ぎてサンゴに大きなダメージになったためですが、やっぱり1年では簡単にサンゴは復活できないものですね。


もうひとつが海の濁り。
宮古島は海が綺麗だという評判を聞いていたのでクリアブルーな海を期待していたのですが、先のウミガメの写真のとおり濁り気味。

後日聞いたところでは、ちょうどその日は大潮。そしてシギラビーチに行ったのは干潮時。かつ宮古島の南に位置するシギラビーチに海洋から南風が吹いてくる。
このタイミングではシギラビーチは結構濁るらしいです。

旅程を考える際に、さすがに潮汐、風向きまでは思いが至りませんでしたよ。

潮汐に関しては別エントリーでも触れたいと思いますが、他のビーチに行った際も考慮すべき事項として強く認識させられましたので、次回の宮古島旅行では潮汐にも気を配りたいと思います。

ルルドプレミアム マッサージクッション ダブルもみVW が最高に気持ちいいらしい

f:id:yt4u:20170525222545j:plain

気持ちいいらしいというのは、ぼくはこれを使っていないからです。
使っているのはヨメで、気持ちいいというのはヨメの感想なんです。ハイ。

如何せんぼくはマッサージなるものが非常に苦手。
くすぐったくなることはあっても気持ちよくなることはありません。
凝りとかいう類のものとは無縁なんです。いいでしょ。



そんな中、このマッサージクッションを買うきっかけとなったのは「母の日」。

ぼくは「母の日」の存在をすっかり忘れていたのですが、5歳の息子が「母の日だからお母さんに何か買ってあげようよ」と言うじゃありませんか。
それまで自分からそんなことを言い出すことなんてなかった息子からの突然の提案に、子ども成長を感じざるを得ませんでした。
それはそれはぼくの瞳には涙が浮かんでいたことでしょう。


早速、ヨメには「子どもと公園で遊んでくる~」と言って、息子と一緒にプレゼント探しにGO!

そしたら立ち寄ったFrancfrancにあったんですね。このマッサージクッションが。



目に入った瞬間「これだ!」と思ったわけです。
ヨメは日ごろから「腰が痛い」だの「首が凝った」だの「凝りが目に来た頭痛がしてきた」とぼくには耳タコ状態。
さすがにマッサージチェアを置くようなスペースはぼくのおうちにはありませんが、クッションならNP・・・No Problem。

そう思って、ぼくはマッサージ苦手ながらも、店頭でとりあえずマッサージクッションを腰に当ててみる。
そしたら結構グリグリくるじゃありませんか。
マッサージ苦手のぼくにも「なんか効きそ~」と思わせる力、ありました。

息子の提案から始まったプレゼント探しだったので、もう少し子ども目線のプレゼントの方がいいかな~とは思いつつ、息子に「これどう?お母さん、いつも”腰痛い”って言ってるから喜ぶと思うよ」と問うと息子も完全同意。
どうやら息子にもヨメの「腰痛い~」が耳タコだった模様。
当初の想定よりも多少値が張るものになってしまいましたが、息子の初提案から始まったプレゼント探しに気をよくしていたぼくは一念発起してお買い上げ~。


おうちに持ち帰って早速、息子経由でヨメにマッサージクッションをプレゼント。

ヨメは喜んですぐにお試しでマッサージスタート。
お試し・・・のはずが、あまりの気持ちよさにクッションから離れられないと言い始める始末。
どうやら相当気に入ってくれたらしい。


ということで、マッサージクッションを手に入れたヨメは大満足。
お母さんにプレゼントできた息子も大満足。
ふたりを見たぼくも大満足、と久々にいい買い物ができました。


エラー値を含む計算はAGGREGATEを使え!|エクセル関数

f:id:yt4u:20171223173316j:plain

複数のセルに数値が入っていて、その合計を求めたいときはSUM関数を使いますよね。

でも、その集計対象の中にエラー値が入っていたらどうなるでしょうか?


例えば、こんな状態です。

f:id:yt4u:20170503200853j:plain

合計対象の中に「#N/A」というエラー値が含まれていますよね。


エラー値を含むセル範囲に対してSUMを実行すると、

f:id:yt4u:20170503200909j:plain

はい。エラーが返ってきます。


では、合計対象のセル範囲にエラー値が含めまれている時、そのエラーを無視して合計を求めるにはどうすればいいのでしょうか?



その答えが、このエントリのタイトルにあるAGGREGATE関数です。


では早速、AGGREGA関数を使って計算してみます。

f:id:yt4u:20170503200838j:plain


エラー値を含む範囲を指定した状態で計算を実行すると、

f:id:yt4u:20170503200846j:plain


はい。見事に計算できました。


。。。
と、AGGREGATE関数の使い方、特に引数について一切の説明を飛ばしてしまってますので、改めて説明すると、、、


まず、第一引数(上図では9となっているところ)では集計方法を指定しています。

集計方法は下表の19パターンが用意されています。


集計方法 関数
1 AVERAGE
2 COUNT
3 COUNTA
4 MAX
5 MIN
6 PRODUCT
7 STDEV.S
8 STDEV.P
9 SUM
10 VAR.S
11 VAR.P
12 MEDIAN
13 MODE.SNGL
14 LARGE
15 SMALL
16 PERCENTILE.INC
17 QUARTILE.INC
18 PERCENTILE.EXC
19 QUARTILE.EXC


第一引数の9はSUMすることを表していたのです。



次に、第二引数(上図では7となっていたところ)は集計時のオプションを指定します。
ここがエラー値を除いて計算する際のポイントです。


用意されているオプションは下表のとおり。


オプション 動作
0 または省略 ネストされた SUBTOTAL 関数と AGGREGATE 関数を無視します。
1 非表示の行、ネストされた SUBTOTAL 関数と AGGREGATE 関数を無視します。
2 エラー値、ネストされた SUBTOTAL 関数と AGGREGATE 関数を無視します。
3 非表示の行、エラー値、ネストされた SUBTOTAL 関数と AGGREGATE 関数を無視します。
4 何も無視しません。
5 非表示の行を無視します。
6 エラー値を無視します。
7 非表示の行とエラー値を無視します。


上の例では7を指定して、非表示の行とエラー値を無視して計算するようにしていました。



そして、第三引数で集計対象のセルを指定しています。



今回の例ではセル範囲を合計していましたが、第一引数の表のとおり、計算方法は合計(SUM)だけではなくAVERAGE等、普段使うことの多い集計関数が網羅されています。


そして第二引数の表のとおり集計オプションが用意されていますので、それを使ってエラー値を無視して計算することが可能になるわけです。

第二引数でおおよそ使うことになるのは、5・6・7の3パターンになると思います。
(4を指定するならAGGREGATE関数使わずに、従来からある関数使いますよね。)


外資系投資銀行がやっている 最速のExcel

外資系投資銀行がやっている 最速のExcel



ということで、エラー値を含むセル範囲の計算にはAGGREGATE関数を使うのがベストチョイス。
さらに非表示行を集計対象に含めいないようにすれば、例えばオートフィルタを掛けたときに、表示されているセルだけを集計する、といったことにも対応できるわけです。


一昔前であれば、エラー値を集計対象から除くために「=SUMIF(集計範囲, "<>#N/A")」なんてやっていました。
これだとエラーの種類が「#N/A」の時だけ集計対象から除くことになるので、そのほかのエラー値も除きたいとなると非常にややこしいことになっていました。


それがAGGREGATE関数であれば一発で解決できるワケです。


非常に便利、この上ないですねー。

セルには出来る限り名前を付けるべし!|エクセルVBA

f:id:yt4u:20170523232355j:plain

結論はタイトルの通り、セルには出来る限り名前を付けるべし!ということです。

すべてのセルに名前を付ける必要はありませんが、データ表のテッペン(特にTopLeft)やデータエリアそのもの、VBAで引数として扱われるような値、あるいはグラフのデータ範囲など、データの起点となるセルや、データのひとかたまりとなるセル範囲に名前を付けてあげると、VBAでのセルおよび値の操作が非常にラクになります。

この「名前の定義」は、数式バーが表示されているのであれば、その左側に表示されている「名前ボックス」に付けたい名前を入力することで定義可能です。 その他、リボンの「数式」→「名前の定義」でもOK。

定義済みの名前は、リボンの「数式」→「名前の管理」で確認することが可能。
ショートカットで開く場合は「Ctrl+F3」です。

ワークシートってどうやって選択すればいいの?Worksheets("Sheet1")?Worksheets(1)?Sheet1?|エクセルVAB

f:id:yt4u:20170318221759j:plain

ワークシートの特定にはCodeName(コードネーム)を使った方がいいというエントリーを書きました。

yt4u.hatenablog.com


CodeNameを使え!なんてエラそうなこと言ってますが、実はぼくはずっとCodeNameの存在を知りませんでした。
ホントにずぅーーーーっと知りませんでした。

そしてCodeNameの存在を知ったときは、あまりの感動に暫く絶句した記憶がございます。はい。


その感動の大部分は「これでワークシート名の変更に左右されずシートを扱える」というもの。

そしてもう一つが、ぼくにとって長年の謎であったことが解決したからです。


ワークシートを特定する3つの方法

とあるブックに3つのワークシートがあったとして、その一番左端のワークシート名が「Sheet1」だったとします。

このとき、「Shee1」シートを選択する方法として、次の2つの方法をよく見かけます。

  1. Worksheets(“Sheet1”).Select
  2. Worksheets(1).Select

(ワークシートをSelectすることなんてほとんどないと思いますが、分かりやすいメソッドなので以下Selectを前提に書いています。)


1は単純に「Sheet1」というワークシート名を拠り所に指定する方法です。

2はワークシートの集合体であるワークーシートコレクションの中から、各ワークシートに振られたインデックス番号を使って呼び出す方法です。
これは、ワークシートの複数枚ある場合、自動的に左端のワークシートを1として順にインデックスが割り振られていく、という特性を利用したものです。

ちなみに、2がワークシートコレクションというCollectionオブジェクトなんだという観点に立つと、実は1もCollectionオブジェクトらしい挙動だということが分かってきます。
つまり、Collectionの中から1つ取り出すときにインデックスを使って取り出すほか、Keyを使って取り出す方法があるわけですが、1の方法はまさしく後者に他ならないのです。

このときのKeyは何かというと、ワークシート名(=Sheet1)そのものですよね。


なお、Collectionについてはコチラのエントリーを参考にしてみてください。

yt4u.hatenablog.com


話が少し逸れてしまいましたが、長年の謎は上の2つではありません。

もうひとつワークシートを指定する方法で、なぜそれで指定できるのか長きに亘って謎だったのはこれです。

  Sheet1.Select


これで前述の例で状態だと「Sheet1」という名前のワークシートが選択できてしまうんですよね。

これで軽く混乱することになります。

「Sheet1」で選択できるなら、「Worksheets(1)」とかする必要ないんじゃないの?
だってその方が打ち込む文字数が少なくて済むし。、、、と。

そう思って「Sheet1」を使い始めると、さらに混乱が襲ってきます。

それは例えば、先に挙げた「Sheet1」という名前のワークシートをひとつ右に移動した場合、「Worksheets(1).Select」では「Sheet1」シートは指定できなくなります。
「Sheet1」シートを選択するためには「Worksheets(2).Select」とする必要があるんですよね。
でも相変わらず「Sheet1.Select」で「Sheet1」(という名前の)ワークシートを選択することができます。

「Sheet1」はOKだけど「Worksheets(1)」はダメで、でもそのシートが左端ならOKで、、、って何が何だか状態必至。
似たようなコードなのに挙動は全く変わってくるので混乱せずにはいられないですよね。


まさにぼくは長年に亘り「Worksheets(1)」と「Sheet1」の立ち位置の違いを理解できず混乱し続けていました。

それがCodeNameの存在を知って、一気に解決することになったのです。


そうです。「Sheet1」はCodeNameそのものだったのです。


VBEで「Sheet1」シートのプロパティを見れは一目瞭然。

f:id:yt4u:20160617234920j:plain

「ぼく」シートのCodeName(=オブジェクト名)は「Sheet1」になっていますよね。

  Sheet1.Select

はCodeNameを使ってワークシートを選択することに他ならないのですね。


試しに「Sheet1」を違う文字に書き換えてみください。

その状態で

  Sheet1.Select

とやると、そんなできるかぼけぇ、ってエクセルに怒られますよね。