MW211 EXIT

devlog
ExcelVBA/Range()とシート
2018年11月26日
┬──────────────────────────────────────┬
│Range()におけるシートの整合性                                               │
┴──────────────────────────────────────┴
┌──────────────────────────────────────┐
│シート◎.Range(シート①.Cells(y, x), シート②.Cells(y, x))                  │
└──────────────────────────────────────┘
  上記の場合、シート◎~②はすべて同一シートでなければならない
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  さもなくば、以下のエラーとなる
┌──────┬───────────────────────────────┐
│◎≠①の場合│実行時エラー'1004':                                           │
│◎≠②の場合│アプリケーション定義またはオブジェクト定義のエラーです。      │
├──────┼───────────────────────────────┤
│①≠②の場合│実行時エラー'1004':                                           │
│            │'Range'メソッドは失敗しました:'_Global'オブジェクト           │
├──────┼───────────────────────────────┤
│(後述)      │実行時エラー'1004':                                           │
│            │'Range'メソッドは失敗しました:'_Worksheet'オブジェクト        │
└──────┴───────────────────────────────┘
┬──────────────────────────────────────┬
│Range()におけるシート省略時の扱い                                           │
┴──────────────────────────────────────┴
┌──────────────────────────────────────┐
│Range(シート①.Cells(y, x), シート②.Cells(y, x))                           │
└──────────────────────────────────────┘
  基本的に、シート◎は省略可能でこの場合、シート①(=シート②)と同じになる
  →Cells()の場合は(シートを省略すると)ActiveSheet.Cells()となるので、
    これと同じようにActiveSheet.Range()となりそうに思われるが、この場合は
    独立したRangeオブジェクトとして、ActiveSheetには依存しない形となる
  ┌────────────────────────────────────┐
  │以下は一見同じように見えるが、シートB(=ActiveSheet)で実行すると        │
  │後者だけがエラーになる(①の親シートはシートAだからエラーとならない)     │
  │┌─┬──────────────────────────────┬─┐│
  ││①│            Range(シートA.Cells(1, 1), シートA.Cells(2, 2)) │○││
  │├─┼──────────────────────────────┼─┤│
  ││②│ActiveSheet.Range(シートA.Cells(1, 1), シートA.Cells(2, 2)) │×││
  │└─┴──────────────────────────────┴─┘│
  └────────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
┌──────────────────────────────────────┐
│シート◎.Range(ActiveSheet.Cells(y, x), ActiveSheet.Cells(y, x))            │
└──────────────────────────────────────┘
  シート①およびシート②を省略した場合は、(Cells()なので)ActiveSheet扱いとなる
  この場合、シート◎とActiveSheetが不一致だと前述の(◎≠①)エラーとなる
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  なお、親シートを調べたい場合には、以下で親シートのシート名が取得できる
┌──────────────────────────────────────┐
│Range(…).Parent.Name                                                       │
└──────────────────────────────────────┘
┬──────────────────────────────────────┬
│Range()の記述位置による挙動の違い                                           │
┴──────────────────────────────────────┴
  ソースコードをシートに記述するかモジュールに記述するかでも挙動が変わる
┌──────────────────────────────────────┐
│Range(シートA.Cells(1, 1), シートA.Cells(2, 2))                             │
└──────────────────────────────────────┘
  ○シートAを選択中に、モジュールに記述の上記処理を直接実行
  ○シートBを選択中に、モジュールに記述の上記処理を直接実行
  ○シートAを選択中に、モジュールに記述の上記処理をボタン押下で実行
  ○シートBを選択中に、モジュールに記述の上記処理をボタン押下で実行
  ○シートAを選択中に、シートAに記述の上記処理をボタン押下で実行
  ×シートBを選択中に、シートBに記述の上記処理をボタン押下で実行  →下記エラー
┌──────────────────────────────────────┐
│実行時エラー'1004':                                                         │
│'Range'メソッドは失敗しました:'_Worksheet'オブジェクト                      │
└──────────────────────────────────────┘
  このエラーは直前に「シートA.Cells(1, 1).Select」みたいに
  意図的にシートAをつかんでみても解消ができない
  (シートBに記述している時点でシートBの掌握下からは逃れられないようだ)
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  解消するには以下のように「Range」の親シートを明示してあげればよい
┌──────────────────────────────────────┐
│シートA.Range(シートA.Cells(1, 1), シートA.Cells(2, 2))                     │
└──────────────────────────────────────┘
────────────────────────────────────────
分類:ExcelVBA