質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

2回答

1675閲覧

vbaでのオブジェクト指向について

K.T_build

総合スコア29

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

3クリップ

投稿2017/08/16 06:14

編集2017/08/16 07:11

エクセルのvbaで1つのCSVデータを基に、「営業所別」「営業別」、「得意先別」,etc
の帳票を出力する処理を組もうかと考えています。
この案件にあたり、今までのmoduleのみの手続き型での実装から、オブジェクト指向での
プログラムをやってみようと思い立ちました。

いくつかサイトを参考にして作ろうとしているのですが、クラスの生成から
つまずいてしまっています。
クラスにworksheetオブジェクトを持たせたいのですが、下記のエラーが出ます。
「コンパイルエラー:
オブジェクトモジュールにはインターフェース'WS'用の'absClass'が必要です」

string型などでは上手くいったので、オブジェクトを持たせる場合に何か方法があるのかと思いますが、ググっても上手く出てきませんでした。
最悪、シート名だけ持たせてmodule側で処理してもいいのですが、他に便利な方法があれば試してみたいです。

vba

1'スーパークラス:absClass.cls 2 3Option Explicit 4 5'プロパティ 6Public WS As Worksheet 7 8Public Sub msgName(vdata As Worksheet) 9End Sub

vba

1'サブクラス:centerToMonth.cls 2 3Option Explicit 4'---コンパイルエラー: 5'---オブジェクトモジュールにはインターフェース'WS'用の'absClass'が必要です。 6Implements absClass 7 8'プロパティ 9Private WS As Worksheet 10 11Private Property Get absClass_WS() As WorkSheet 12 absClass_WS = WS 13End Property 14Private Property Let absClass_WS(ByVal RHS As WorkSheet) 15 WS = RHS 16End Property 17 18Private Sub absClass_msgName(vdata As Worksheet) 19 Debug.Print vdata.name 20End Sub

vba

1'module.bas 2 3Sub test() 4 Dim objabs As absClass 5 Dim objcon As centerToMonth 6 7 Set objcon = New centerToMonth 8 Set objabs = objcon 9 10 With objabs 11 MsgBox .WS 12 13 'MsgBox ActiveWorkbook.Worksheets("営業所別売上修正一覧表(月間)").name 14 .WS = ActiveWorkbook.Worksheets("営業所別売上修正一覧表(月間)") 15 .msgName 16 End With 17End Sub

参考:https://sites.google.com/site/compositiosystemae/home/vbaworld/upper/interface

以上、ご教授いただければと思います。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

VBA でのスーパークラスには、必要なプロパティ、メソッドすべてのインターフェイスが必要になるとのことです。
参考

これをもとに、提示されたクラス、モジュールを以下のように変更してみました。

(1) absClass

'スーパークラス:absClass.cls Option Explicit 'プロパティ 'Public WS As Worksheet '' プロパティのインターフェイスを用意する。 Public Property Get WS() As Worksheet End Property '' オブジェクトの場合は、Let ではなく Set Public Property Set WS(ByVal RHS As Worksheet) End Property Public Sub msgName(vdata As Worksheet) End Sub

(2) centerToMonth

vba

1 2'サブクラス:centerToMonth.cls 3 4Option Explicit 5'---コンパイルエラー: 6'---オブジェクトモジュールにはインターフェース'WS'用の'absClass'が必要です。 7'' -> WS オブジェクトの「プロパティ」のインターフェイスがないので、出てきて当然のエラーです。 8 9Implements absClass 10 11'' クラス内で保有数 WS の宣言。 12'プロパティ 13Private WS As Worksheet 14 15'' プロパティの実装 16'' それぞれ、オブジェクトなので set する。 17Public Property Get absClass_WS() As Worksheet 18 Set absClass_WS = WS 19End Property 20Public Property Set absClass_WS(ByVal RHS As Worksheet) 21 Set WS = RHS 22End Property 23 24Public Sub absClass_msgName(vdata As Worksheet) 25 Debug.Print vdata.Name 26End Sub 27

(3) Module1

Option Explicit 'module.bas Sub test() ' スーパークラスで宣言したあと、派生クラスで New する。 Dim objabs As absClass 'Dim objcon As centerToMonth Set objabs = New centerToMonth 'Set objabs = objcon With objabs 'MsgBox .WS 'MsgBox ActiveWorkbook.Worksheets("営業所別売上修正一覧表(月間)").name Set .WS = ActiveWorkbook.Worksheets("営業所別売上修正一覧表(月間)") .msgName .WS End With End Sub

Excel 2013 では動作しました。
以上、ご参考になれば幸いです。

投稿2017/08/16 08:13

tukuroku

総合スコア234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K.T_build

2017/08/16 08:36

ありがとうございます。 頂いたプログラムで動作できました。 オブジェクトをクラスに実装する場合は、スーパークラスにインターフェースを宣言する必要があるのですね。 勉強になりました。
guest

0

'プロパティ Private WS As Worksheet Private Property Get absClass_WS() As String absClass_WS = WS End Property Private Property Let absClass_WS(ByVal RHS As String) WS = RHS End Property

「Get absClass_WS() As String」→「Get absClass_WS() As Worksheet」
「ByVal RHS As String」→「ByVal RHS As Worksheet」
ではないでしょうか?

■追記
StringをWorksheetに変更
LetをSetに変更

absClass

Option Explicit 'プロパティ Public WS As Worksheet Public Sub msgName(vdata As Worksheet) End Sub

centerToMonth

Option Explicit '---コンパイルエラー: '---オブジェクトモジュールにはインターフェース'WS'用の'absClass'が必要です。 Implements absClass 'プロパティ Private WS As Worksheet Private Property Get absClass_WS() As Worksheet absClass_WS = WS End Property Private Property Set absClass_WS(ByVal RHS As Worksheet) WS = RHS End Property Private Sub absClass_msgName(vdata As Worksheet) Debug.Print vdata.Name End Sub

Modules1

Sub test() Dim objabs As absClass Dim objcon As centerToMonth Set objcon = New centerToMonth Set objabs = objcon ''' このあたりはエラーになるのでコメントアウト With objabs 'MsgBox .WS 'MsgBox ActiveWorkbook.Worksheets("営業所別売上修正一覧表(月間)").name '.WS = ActiveWorkbook.Worksheets("営業所別売上修正一覧表(月間)") '.msgName .WS End With End Sub

投稿2017/08/16 07:03

編集2017/08/16 08:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K.T_build

2017/08/16 07:09

回答ありがとうございます。 修正し、試してみましたが同様のエラーが発生しました。
K.T_build

2017/08/16 07:12

頂いたご指摘を基に、再度質問文を修正いたしました。
退会済みユーザー

退会済みユーザー

2017/08/16 07:53

オブジェクトの場合はLetではなくSetを使うようです。これでどうでしょうか? Private Property Let absClass_WS(ByVal RHS As WorkSheet) ↓ Private Property Set absClass_WS(ByVal RHS As WorkSheet)
K.T_build

2017/08/16 08:06

Setで試してみましたが、こちらでも同様にエラーが発生しました。 試しにスーパークラス(absClass)からプロパティを抜いたら動作するようになりました。 原因は不明ですが、、、
K.T_build

2017/08/16 08:08

試した操作説明があいまいすぎる回答だったので、再度回答します。 正)試しにabsClassから「Public WS As Worksheet」 をコメントアウトしたところ、正常に動作しました。
退会済みユーザー

退会済みユーザー

2017/08/16 08:14

当方では特にエラーなく動作しました。Excelのバージョンは2010です。 一応、動いたソースを追記します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問