- hoehoe1234
- 545
- 2
- 0
- 0
ワクワクV037回目レンジの操作(2021-04-15) 今回も多様なレンジの操作(選択、演算)をしました。データ作成には「なんちゃって個人情報」を使用させていただいています。 pic.twitter.com/pkNWWM4CoU
2021-04-15 02:05:34レンジを「切り直すかどうか」については、 ①切り方が明確にわかっている場合はその切り方でよければそのまま使う。 ②切り方がわからなければ自分の使いたい切り方に切り直す。 ということになります。 pic.twitter.com/QcaZODmgu3
2021-04-15 02:07:23カレントリージョン(以下、crと記載した場合はカレントリジョン)の取得が同一関数内にあれば、このケースではcrですが、セルスライスであることが明確なので左上を選ぶ場合は ①cr(1) ②cr.cells(1) のどちらでもかまいません。
2021-04-15 02:10:24しかし、カレントリージョンが引き数などで渡ってきた場合はセルスライスされている確証がないのでcellsで切り直します。cells、rows、columnsは親レンジのスライス方法を変更するためにあります。この部分は重要ですのでしっかりと理解する必要があります。
2021-04-15 02:11:23デフォルトプロパティはメソッドを省略できる記法です。レンジの場合は少しややこしくて let x = rng(1)であればlet x = rng.Item(1).value が実行されます。この仕組をまずは解説します。
2021-04-15 02:18:02①レンジのデフォルトプロパティは[_Default]メソッド(以下[_D]と記載) ②[_D]が引き数付きで呼ばれた場合はItemメソッドにディスパッチします。そうでなければ(引き数がなければ)Valueにディスパッチします。 (※簡単のためプロパティ等を含めてメソッドと記載しています)
2021-04-15 02:19:55ですから ①set obj = rng(1) とした場合は ②set obj = rng.Item(1) が呼び出され、rngのスライス単位の新しいレンジが取得されます。
2021-04-15 02:21:45③let x = rng(1) とした場合はもう一段処理が入ります。これは ④let x = rng.Item(1).valueを起動します。 Itemメソッドで新しいレンジを取得し、そのレンジのvalueメソッドを呼び出しているんですね。 ⑤let x = rng.value とした場合は場合と比較してください。
2021-04-15 02:24:29Cells、Rows、Colunsは「レンジの切り方を変える」だけの機能ですので、このようにドットで連結することができます。単に親オブジェクトのスライスを変更しているだけなのがよくわかるのではないでしょうか? pic.twitter.com/vTcOOqWidC
2021-04-15 02:26:58あまりに自然なのでわかりませんが ①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これはどこにセルを選択するでしょうか?そうですね。これは右下のセルを選択します。 r10が行数、r11が列数を表しています。 pic.twitter.com/NFlvhqnKBU
2021-04-15 02:31:18セルの切り方がセル単位である場合は、 ①何個目のセル ②何行何列目のセル の2つの形式で指定ができます。 以前やりましたがこれは単に計算が行われているだけであり、レンジの範囲をオーバランして選択することも可能です。 pic.twitter.com/YTeM5kDgWz
2021-04-15 02:33:42ですから、このようにcrとcellの間にrowsを挟んでも(意味はありませんが)ちゃんと動きます。 pic.twitter.com/fqF3oLasyq
2021-04-15 02:48:10間にもっと入れても動きます。これをみるとcells、rows、columnsが単に範囲を切り直した範囲をかえしてきていることがよくわかりますね。 pic.twitter.com/2yUIhYeCes
2021-04-15 02:49:48右下のセルの選択です。 ①crをrowsでスライスして一番下を選ぶ ②選んだ行をcellsでセルにスライスして一番最後を選ぶ という作戦です。 pic.twitter.com/xPoUTTNnmk
2021-04-15 02:52:38同じく右下のセルの選択です。 ①crをrowsでスライスして一番下を選ぶ までは同じですが、今度は ②その行を列にスライスして最後の列を選ぶ という作戦です。 pic.twitter.com/Dvjp7uO2OQ
2021-04-15 02:54:17同じく右下のセルの選択です。複数の生徒さんにいろいろかんがえてみてもらっています。この作戦は ①範囲全体をoffsetで行数、列数だけ一気にずらして ②Resizeで1つのセルに縮小 しています。いろいろな指定方法がありますね。 pic.twitter.com/Tvi28Z8MpK
2021-04-15 02:56:54表左の2列を選ぶです。(コードは一列とかいてますが)。作戦は ①columns(1)で左の1列を選ぶ ②2列にresizeする です。 pic.twitter.com/CxxQVolL7k
2021-04-15 03:05:27Rang(cell1, cell2)形式は、cell1、cell2に1つのセルを指定する必要はなく、指定された2つのレンジが収まる最も狭い範囲を返します。 pic.twitter.com/7Uvk4W7BnF
2021-04-15 03:12:43ここでなかなか鋭い質問がでました。 ①cr.Range(cc, rr) でなくてよいのか?との話です。なぜRangeに親オブジェクトを指定しては行けないのでしょうか?これはそれぞれ指定されているcc、rrの位置がA1基準のレンジだからです。
2021-04-15 03:14:25親オブジェクトの位置がA1でない場合は cr.Rangeは、crの左上の位置をA1(Cells(1,1))と認識します。ですから ①cr.Range(cc, rr)は、crがA1からずれている分だけ行列ともにずれます。これは面白いので実際にためしてみてください。crの左上をA1として計算するんですね。
2021-04-15 03:16:51こんな書き方もできるんですね。でもこれはcrの左上を基準とする相対的な指定になりますのであまりつかわないと思います。 pic.twitter.com/tWckDddk4e
2021-04-15 17:38:00これがペンギンさんを驚愕?させた指定方法です。この指定ですと右端の列の上から3番目が選ばれますね。*2, *3,*4としていくことで右端のm行目が選べます。中学数学の剰余系が重要な理由でもあります。 pic.twitter.com/kmNZZUS2w5
2021-04-15 17:42:12同じく右下の指定です。素直に書くとこのようになります(一例)。 pic.twitter.com/FRHMTzFYfb
2021-04-15 17:43:22