目安箱 IV

目安箱投稿のルールはこちらをごらんください。
ご意見は電子メールで承っています。
「目安箱」は質問禁止です。技術的な質問はそれぞれの質問箱へどうぞ。

迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
25 / 110 ツリー ←次へ | 前へ→

【247】ちょっと気になる現象5 シートモジュールの変数 ichinose 09/11/4(水) 7:54 Excel[未読]
【248】Re:ちょっと気になる現象5 シートモジュール... ichinose 09/11/4(水) 8:18 Excel[未読]

【247】ちょっと気になる現象5 シートモジュール...
Excel  ichinose  - 09/11/4(水) 7:54 -

引用なし
パスワード
   新規ブック(Sheet1というシートがある)にて、

Sheet1のモジュールに

'============================================================
Option Explicit
Public 変数 As String

'とこれだけ


標準モジュール

'==============================================================
Option Explicit
'==============================================================
Sub test1()
  Worksheets("sheet1").変数 = "aaa"
  MsgBox Worksheets("sheet1").変数
End Sub
'==============================================================
Sub test2()
  Dim ws As Worksheet
  Set ws = Worksheets("sheet1")
  'ws.変数 = "bbb"
  'MsgBox ws.変数
End Sub
'==============================================================
Sub test3()
  Dim ws As Object
  Set ws = Worksheets("sheet1")
  ws.変数 = "ccc"
  MsgBox ws.変数
End Sub


test1のように記述すると、正常に作動し、Sheet1のオブジェクトに追加した
変数 と言う名のプロパティの参照が出来ます。

ところが、Worksheets("sheet1") と何回も記述するのが面倒なので、
オブジェクト変数を介して、このプロパティを参照しようとして、

test2のように記述して実行すると(コメント化を外して実行)、

コンパイルエラー
メソッドまたはデータメンバが見つかりません。

というエラーメッセージが

ws.変数 = "bbb"

の箇所で表示されます。

対処方法は、test3のように変数の型をObjectに代えて実行すれば
(尚、test2のコメント化を外した箇所は、再度コメント化してから実行する)

正常に作動しますが・・・。

変数の型は、なるべく詳細に宣言するという記述を目にしますが、
それとは、矛盾する現象です。

不思議ではないですか?

【248】Re:ちょっと気になる現象5 シートモジュー...
Excel  ichinose  - 09/11/4(水) 8:18 -

引用なし
パスワード
   >'==============================================================
>Sub test2()
>  Dim ws As Worksheet
>  Set ws = Worksheets("sheet1")
>  'ws.変数 = "bbb"
>  'MsgBox ws.変数
>End Sub

Worksheetというクラスには、変数というメンバないので
コンパイルエラーが発生する。

又、Object型にすれば、メンバまでのチェックが出来ないの
コンパイルエラーにならない。

という道理はわかりますが、シートオブジェクトがカスタマイズ可能な仕様だと言うことは、念頭になかったのでしょうか?

そこでwsの変数の型をもっと詳細な型であるSheet1にすると、

Sub test4()
  Dim ws As Sheet1
  Set ws = Worksheets("sheet1")
  ws.変数 = "ddd"
  MsgBox ws.変数
End Sub

見事に作動し、これで道理も通ると納得したのですが・・・・。


似たようなことをThisworkbookでやってみると・・・・、

新規ブックにて

ThisWorkBookのモジュールに
Option Explicit

Public 変数 As String
とこれだけ


標準モジュール

'==============================================================
Option Explicit
'==================================
Sub test5()
  Dim nm As String
  nm = ThisWorkbook.Name
  Workbooks(nm).変数 = "aaa"
  MsgBox Workbooks(nm).変数
End Sub
'==================================
Sub test6()
  Dim nm As String
  Dim wb As Workbook
  nm = ThisWorkbook.Name
  Set wb = Workbooks(nm)
  wb.変数 = "bbb"
  MsgBox wb.変数
End Sub
'==================================
Sub test7()
  Dim nm As String
  Dim wb As Object
  nm = ThisWorkbook.Name
  Set wb = Workbooks(nm)
  wb.変数 = "bbb"
  MsgBox wb.変数
End Sub
'==================================
Sub test8()
  Dim nm As String
  Dim wb As ThisWorkbook
  nm = ThisWorkbook.Name
  Set wb = Workbooks(nm)
  wb.変数 = "bbb"
  MsgBox wb.変数
End Sub

今度は、test5〜test8まで全て正常にブックのプロパティを参照できてしまいます。

あれ、test6では、Workbookのメンバに変数はないからエラーになるはずじゃあ
なかったっけ?

どっちの仕様が正しいのかなあ・・・。

これは、コンパイラーのバグなのでしょうか?
対処法があるから、よいけど一貫性がないなあ

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
25 / 110 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:   
0
(SS)C-BOARD v3.8 is Free