ワクワクV037回目レンジの選択(2021-04-10)

ワクワクV
2
ほえほえ@スプシマン @hoehoe1234

ワクワクV037回目レンジの操作(2021-04-15) 今回も多様なレンジの操作(選択、演算)をしました。データ作成には「なんちゃって個人情報」を使用させていただいています。 pic.twitter.com/pkNWWM4CoU

2021-04-15 02:05:34
拡大
ほえほえ@スプシマン @hoehoe1234

レンジを「切り直すかどうか」については、 ①切り方が明確にわかっている場合はその切り方でよければそのまま使う。 ②切り方がわからなければ自分の使いたい切り方に切り直す。 ということになります。 pic.twitter.com/QcaZODmgu3

2021-04-15 02:07:23
拡大
ほえほえ@スプシマン @hoehoe1234

カレントリージョン(以下、crと記載した場合はカレントリジョン)の取得が同一関数内にあれば、このケースではcrですが、セルスライスであることが明確なので左上を選ぶ場合は ①cr(1) ②cr.cells(1) のどちらでもかまいません。

2021-04-15 02:10:24
ほえほえ@スプシマン @hoehoe1234

しかし、カレントリージョンが引き数などで渡ってきた場合はセルスライスされている確証がないのでcellsで切り直します。cells、rows、columnsは親レンジのスライス方法を変更するためにあります。この部分は重要ですのでしっかりと理解する必要があります。

2021-04-15 02:11:23
ほえほえ@スプシマン @hoehoe1234

デフォルトプロパティはメソッドを省略できる記法です。レンジの場合は少しややこしくて let x = rng(1)であればlet x = rng.Item(1).value が実行されます。この仕組をまずは解説します。

2021-04-15 02:18:02
ほえほえ@スプシマン @hoehoe1234

①レンジのデフォルトプロパティは[_Default]メソッド(以下[_D]と記載) ②[_D]が引き数付きで呼ばれた場合はItemメソッドにディスパッチします。そうでなければ(引き数がなければ)Valueにディスパッチします。 (※簡単のためプロパティ等を含めてメソッドと記載しています)

2021-04-15 02:19:55
ほえほえ@スプシマン @hoehoe1234

ですから ①set obj = rng(1) とした場合は ②set obj = rng.Item(1) が呼び出され、rngのスライス単位の新しいレンジが取得されます。

2021-04-15 02:21:45
ほえほえ@スプシマン @hoehoe1234

③let x = rng(1) とした場合はもう一段処理が入ります。これは ④let x = rng.Item(1).valueを起動します。 Itemメソッドで新しいレンジを取得し、そのレンジのvalueメソッドを呼び出しているんですね。 ⑤let x = rng.value とした場合は場合と比較してください。

2021-04-15 02:24:29
ほえほえ@スプシマン @hoehoe1234

Cells、Rows、Colunsは「レンジの切り方を変える」だけの機能ですので、このようにドットで連結することができます。単に親オブジェクトのスライスを変更しているだけなのがよくわかるのではないでしょうか? pic.twitter.com/vTcOOqWidC

2021-04-15 02:26:58
拡大
ほえほえ@スプシマン @hoehoe1234

あまりに自然なのでわかりませんが ①cr.rows(1).cells(1).select は ②cr.rows.Item(1).cells.item(1).select と同じです。rowsで行にスライスしてその1行目を今度はCellsで列に分割してるんですね。ですから1行1列目が選択できます。

2021-04-15 02:29:02
ほえほえ@スプシマン @hoehoe1234

これはどこにセルを選択するでしょうか?そうですね。これは右下のセルを選択します。 r10が行数、r11が列数を表しています。 pic.twitter.com/NFlvhqnKBU

2021-04-15 02:31:18
拡大
ほえほえ@スプシマン @hoehoe1234

セルの切り方がセル単位である場合は、 ①何個目のセル ②何行何列目のセル の2つの形式で指定ができます。 以前やりましたがこれは単に計算が行われているだけであり、レンジの範囲をオーバランして選択することも可能です。 pic.twitter.com/YTeM5kDgWz

2021-04-15 02:33:42
拡大
ほえほえ@スプシマン @hoehoe1234

ですから、このようにcrとcellの間にrowsを挟んでも(意味はありませんが)ちゃんと動きます。 pic.twitter.com/fqF3oLasyq

2021-04-15 02:48:10
拡大
ほえほえ@スプシマン @hoehoe1234

間にもっと入れても動きます。これをみるとcells、rows、columnsが単に範囲を切り直した範囲をかえしてきていることがよくわかりますね。 pic.twitter.com/2yUIhYeCes

2021-04-15 02:49:48
拡大
ほえほえ@スプシマン @hoehoe1234

右下のセルの選択です。 ①crをrowsでスライスして一番下を選ぶ ②選んだ行をcellsでセルにスライスして一番最後を選ぶ という作戦です。 pic.twitter.com/xPoUTTNnmk

2021-04-15 02:52:38
拡大
ほえほえ@スプシマン @hoehoe1234

同じく右下のセルの選択です。 ①crをrowsでスライスして一番下を選ぶ までは同じですが、今度は ②その行を列にスライスして最後の列を選ぶ という作戦です。 pic.twitter.com/Dvjp7uO2OQ

2021-04-15 02:54:17
拡大
ほえほえ@スプシマン @hoehoe1234

同じく右下のセルの選択です。複数の生徒さんにいろいろかんがえてみてもらっています。この作戦は ①範囲全体をoffsetで行数、列数だけ一気にずらして ②Resizeで1つのセルに縮小 しています。いろいろな指定方法がありますね。 pic.twitter.com/Tvi28Z8MpK

2021-04-15 02:56:54
拡大
ほえほえ@スプシマン @hoehoe1234

表左の2列を選ぶです。(コードは一列とかいてますが)。作戦は ①columns(1)で左の1列を選ぶ ②2列にresizeする です。 pic.twitter.com/CxxQVolL7k

2021-04-15 03:05:27
拡大
ほえほえ@スプシマン @hoehoe1234

他にもこのような選択方法があります。 pic.twitter.com/Op2GUCucii

2021-04-15 03:09:15
拡大
ほえほえ@スプシマン @hoehoe1234

Rang(cell1, cell2)形式は、cell1、cell2に1つのセルを指定する必要はなく、指定された2つのレンジが収まる最も狭い範囲を返します。 pic.twitter.com/7Uvk4W7BnF

2021-04-15 03:12:43
拡大
ほえほえ@スプシマン @hoehoe1234

ここでなかなか鋭い質問がでました。 ①cr.Range(cc, rr) でなくてよいのか?との話です。なぜRangeに親オブジェクトを指定しては行けないのでしょうか?これはそれぞれ指定されているcc、rrの位置がA1基準のレンジだからです。

2021-04-15 03:14:25
ほえほえ@スプシマン @hoehoe1234

親オブジェクトの位置がA1でない場合は cr.Rangeは、crの左上の位置をA1(Cells(1,1))と認識します。ですから ①cr.Range(cc, rr)は、crがA1からずれている分だけ行列ともにずれます。これは面白いので実際にためしてみてください。crの左上をA1として計算するんですね。

2021-04-15 03:16:51
ほえほえ@スプシマン @hoehoe1234

こんな書き方もできるんですね。でもこれはcrの左上を基準とする相対的な指定になりますのであまりつかわないと思います。 pic.twitter.com/tWckDddk4e

2021-04-15 17:38:00
拡大
ほえほえ@スプシマン @hoehoe1234

これがペンギンさんを驚愕?させた指定方法です。この指定ですと右端の列の上から3番目が選ばれますね。*2, *3,*4としていくことで右端のm行目が選べます。中学数学の剰余系が重要な理由でもあります。 pic.twitter.com/kmNZZUS2w5

2021-04-15 17:42:12
拡大
ほえほえ@スプシマン @hoehoe1234

同じく右下の指定です。素直に書くとこのようになります(一例)。 pic.twitter.com/FRHMTzFYfb

2021-04-15 17:43:22
拡大