- Excel VBA 質問スレ Part52
136 :デフォルトの名無しさん[sage]:2018/02/11(日) 08:29:24.42 ID:AIGXauyP - >>129
例えばC1:D:4を選択した場合 1.obj.Rangeの中で更にobj.Cellsを指定するということは、C列目を基準にC列目を指定をしていることになる。 だからRangeの中にCellsを書く時はobj.Cellsではなく、obj.Worksheet.Cellsが良い。 2.obj1がC1:C4、obj2にD1:D4をセットしたいってことだよな? obj.Cells(obj.Count / 2, 1) この書き方だと行数を半分にしているのだがこれは一体・・・ もしC1:F10を指定した場合にC1:D10、E1:F10に分けたいわけじゃないの? 3.可読性が死ぬからRange使うのをやめよう。 範囲指定をする時はResize、Offsetを使ったほうが直感的です。 当初の質問を参考に2の通りだと仮定して Set obj1 = obj.Resize(, obj.Column / 2) Set obj2 = obj.Resize(, obj.Column / 2).Offset(,obj.Column / 2) Objには2列しか選択されない事が確定しているなら Set obj1 = obj.Resize(, 1) Set obj2 = obj.Resize(, 1).Offset(,1)
| - Excel VBA 質問スレ Part52
148 :デフォルトの名無しさん[sage]:2018/02/11(日) 12:56:24.79 ID:AIGXauyP - >>137
公式文献は知らないがそういうもんだと納得している。 想像()とか、こんなくらい知ってるわヴォケとか言われそうだが set ws = Worksheets(1)があると仮定して。 これはどれもRange("B2")への参照を示すわけだが ws.Cells(2,2) ws.Cells(2,2).Cells(1,1) ws.Cells(2,2).Range("A1") CellsとかRangeは同一ワークシート内であれば、いくらでも参照先を変更できる。 例えばこれはどれもRange("C3")への参照。 B2を基準(1,1)として(2,2)を見ていることになるからだ。 ws.Cells(2,2).Cells(2,2) ws.Cells(2,2).Range("B2") ws.Range(ws.Cells(2,2).Range("B2")) 問題の件はobjに既にRangeが格納されているからわかりづらいが Set obj = ws.Range("B2") の場合に obj.Range(ws.Cells(2,2)) というのは ws.Range("B2").Range(ws.Cells(2,2)) ってことだよね 単一セルの場合はws.Range("B2").Cells(2,2)と同一の結果になる。 範囲の場合も考え方は同じだがRange(a,b)でaとbに範囲を渡した場合 aとbを合わせた領域の最端の範囲を示すのは言わずもがな。 結局のところ何も難しい話ではなくて、Offsetの相対指定とResizeの範囲指定を同時にできるのがRangeだっていう話に戻る。 普段ws.Range("A1")と書いているものは、実はws.cells(1,1).Range("A1")の省略形だって考えて俺は納得した。
|
|