Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Excel 2013)
sheetオブジェクトに追加したメンバが見つからない
投稿日時: 24/02/11 12:48:49
投稿者: ichibaMan

sheetに追加したメンバにアクセスするのにsheetを変数に代入すると
コンパイルエラー メソッドまたはデータメンバが見つかりません
とエラーになってしまいます
どのようにすれば変数よりアクセスできるのでしょう?
 
'''''''''''''''''''''''''''
''' Sheet1
Private Const xxx As String = "testです"
 
Public Property Get xxxTest() As String
    xxxTest = xxx
End Property
 
 
'''''''''''''''''''''''''''
'''標準モジュール
''' test1() は正常
''' test2() はコンパイルエラー
 
Sub test1()
MsgBox ThisWorkbook.Worksheets("Sheet1").xxxTest
End Sub
 
Sub test2()
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets("Sheet1")
MsgBox sh.xxxTest
End Sub
 
 
 

回答
投稿日時: 24/02/11 14:56:32
投稿者: 半平太

後講釈的ですけど、
 
Worksheet型は xxxTestプロパティを持っておらず、
当該プロパティは引き継げないと言うことでしょうね。
 
より汎用的な型で宣言するか
  Dim sh As Variant
  Dim sh As Object
 
そのものズバリで宣言するかですかね?
  Dim sh As Sheet1

回答
投稿日時: 24/02/11 15:07:11
投稿者: simple

既にコメントいただいたとおりかと思います。
 
ダメ押しするなら次のようなことになるかと思います。
 
VBAの元になっているVB6言語には、そのような機能はありません。
例に出されているように、既定のWorksheetオブジェクトに
自由にメソッドやプロパティを追加することはできません。(*)
 
無理やりそのような形式に持ち込もうとすると、
クラスを利用するほかないと思います。
例で言えば、Worksheetと文字列をメンバに持つラップしたようなクラスを作り、
それぞれにSet Property,Get Property と Let Property,Get Property
を作ることでしょうか。
これが機能向上と言えるかどうかは疑問ですけど。
 
(*)こうした機能で、思いつくのはRuby言語ですね。
RubyはObject指向言語で、既定のクラス(例えば String Class)に自由に
メソッドを追加できます。これは"オープンクラス"と呼ばれています。

投稿日時: 24/02/11 15:10:16
投稿者: ichibaMan

半平太さん、返答ありがとうございます。
 
勉強になります。
この場合は
 dim sh as object
が正解のようですね。
 
> そのものズバリで宣言するかですかね?
> Dim sh As Sheet1
 
これは!私の頭の範疇を超えていますwww
 
ありがとうございました。
解決とさせて頂きます。