MW211 EXIT

devlog
ExcelVBA/RangeとCells
2014年09月25日
Range()とCells()の組み合わせで、シート指定が絡んできた場合についてまとめた

【実験内容】
  「Sheet1」にてマクロを実行し「Sheet2」に値を出力できるか試してみる
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
○Range()もCells()も同じシートを指している場合                →「Sheet2」に出力
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    .Range(.Cells(1, 1), .Cells(2, 2)).Value = "値"                         │
│End With                                                                    │
└──────────────────────────────────────┘
アクティブシートが「Sheet2」だったら、オーソドックスな
「Range(Cells(1, 1), Cells(2, 2)).Value = "値"」と同じことになる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
△Range()もCells()もシートの指定をしない場合                  →「Sheet1」に出力
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    Range(Cells(1, 1), Cells(2, 2)).Value = "値"                            │
│End With                                                                    │
└──────────────────────────────────────┘
アクティブシートが「Sheet1」だから、上記同様「Sheet1」に出力される。
With句は意味をなさないことになる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
○Cells()だけでもちゃんとシートを指定してる場合               →「Sheet2」に出力
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    Range(.Cells(1, 1), .Cells(2, 2)).Value = "値"                          │
│End With                                                                    │
└──────────────────────────────────────┘
Range()は「Sheet1」(アクティブシート)傘下なのに、
問題なく「Sheet2」に出力される。
よって、Range()は関数的な扱いとしてシートの指定は省略できるといえそう。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
×Range()とCells()でシート指定に相違がある場合                          →エラー
┌──────────────────────────────────────┐
│With ThisWorkbook.Worksheets("Sheet2")                                      │
│    .Range(Cells(1, 1), Cells(2, 2)).Value = "値"                           │
│End With                                                                    │
└──────────────────────────────────────┘
Range()は「Sheet2」を指定しているのに、
Cells()は指定なしでアクティブシート(「Sheet1」)指定となるので
両者に相違が発生しエラーとなる。
ちなみに「Sheet2」をアクティブシートにしておくと
両者は一致するので「Sheet2」に出力される。

相違があるという点では一つ前のパターンと同じなのだがこちらはダメなのだ。
┌──────────────┬───┬───┐
│                            │Sheet1│Sheet2│
├──────────────┼───┼───┤
│Worksheets("Sheet1").Range()│      │      │
│Worksheets("Sheet2").Cells()│  ×  │  ○  │
└──────────────┴───┴───┘
分類:ExcelVBA