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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Q&A

解決済

1回答

3793閲覧

VBAクラスモジュールでの配列生成と取り出し

Kobayakawa

総合スコア1

VBA

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

0グッド

0クリップ

投稿2022/07/26 08:29

前提

はじめまして。
初めてteratailに登録して質問します。
失礼あれば申し訳ありません。

VBAでクラスモジュールを練習していますが、
流れやルールがいまいち理解できず苦戦しております。
よろしくお願いします。

実現したいこと

class1で各列の設定
class2で二次元配列格納
メインのsubプロシージャで出力・調整
のようなことを目指しているのですが
格納までは出来たのですが配列から取り出せない状況です。

発生している問題・エラーメッセージ

エラーメッセージ ```SubまたはFunctionが定義されていません。 ### 該当のソースコード ```VBA /////Quake(class1) Private OccursDay_ As Date Private Intensity_ As String Public Property Get OccursDay() As Date OccursDay = OccursDay_ End Property Public Property Let OccursDay(ByVal var As Date) OccursDay_ = var End Property Public Property Get Intensity() As String Intensity = Intensity_ End Property Public Property Let Intensity(ByVal var As String) Intensity_ = var End Property --------------------------------------------------------------------- /////Quakes(class2) Private Sub Class_Initialize() Dim Earray() As Quake Dim i As Long Dim Count As Long: Count = 1 Dim LastRow As Long LastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row With Sheet1 For i = 2 To LastRow ReDim Preserve Earray(Count) Set Earray(Count) = New Quake Earray(Count).OccursDay = .Cells(i, 1) Earray(Count).Intensity = .Cells(i, 8) Count = Count + 1 Next End With End Sub Public Property Get q_(ByVal var As Variant) As Quake q_ = Earray(var) End Property ------------------------------------------------------------------------ /////標準モジュール Sub test() Dim q As Quakes: Set q = New Quakes Debug.Print q.q_(1).Intensity End Sub

試したこと

Class2のGetプロパティを色々設定してみましたが、
配列をtestプロシージャから取得出来ません。

補足情報(FW/ツールのバージョンなど)

Windows11
Office365

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

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

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

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

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

meg_

2022/07/26 12:40

エラーはどこで発生するのでしょうか?
Kobayakawa

2022/07/26 12:57

エラーはclass2の q_ = Earray(var) の部分です。 おそらくいろいろ誤っている点があるかと思います。 よろしくお願いします。
guest

回答1

0

ベストアンサー

提示のコードがクラスモジュールを使う意味があるのかどうかについてはおいておきます。

とりあえずQuakesクラスのコードの下記の点を修正してください。

Earray() をClass_Initialize内ではなく、モジュールレベルで宣言する。
Class_Initialize内だとClass_Initializeを抜けたら消滅してしまいます。

Property Get q_ の代入式は Set を使う。
Quake はクラス(オブジェクト)なのでSetで代入する必要がある。

ということで下記のようにすればエラーなく実行できます。

vba

1Option Explicit 2 3Private Earray() As Quake 4 5Private Sub Class_Initialize() 6 Dim i As Long 7 Dim Count As Long: Count = 1 8 Dim LastRow As Long 9 10 LastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row 11 12 With Sheet1 13 For i = 2 To LastRow 14 ReDim Preserve Earray(Count) 15 Set Earray(Count) = New Quake 16 Earray(Count).OccursDay = .Cells(i, 1) 17 Earray(Count).Intensity = .Cells(i, 2) 18 Count = Count + 1 19 Next 20 End With 21End Sub 22 23Public Property Get q_(ByVal var As Variant) As Quake 24 Set q_ = Earray(var) 25End Property

投稿2022/07/26 13:02

hatena19

総合スコア33620

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

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

Kobayakawa

2022/07/26 13:19

できました! クラスモジュールにばかり気を取られて本当に基本的なところを見落としていました。 アドバイス本当にありがとうございます。 >提示のコードがクラスモジュールを使う意味があるのかどうかについてはおいておきます 正直、クラスモジュールの使い所さえよくわかっていなかったります。 とりあえず、ユーザー定義型代わりに使えるようにくらいにはなりたいと思ってます。 ありがとうございました!
hatena19

2022/07/26 13:59

クラスモジュールにする意味についてですが、 質問のコードだと、クラス内で Sheet1 を参照しています。つまり Sheet1限定でしか使えない。なら、Sheet1のモジュールに書けば済むし、その方が管理しやすい。 クラスにするということは機能の使いまわしがきくというのがメリットですが、それが無意味になっています。 Quakesクラスに対象シートを持たせるというような設計にするとメリットが生きてきます。
Kobayakawa

2022/07/26 16:26

追加のアドバイス、ありがとうございます。 しかし、すみません、いまいち意味がわからなくて、、 Sheet1のシートモジュールで配列格納まではいいのですが、 そこからどうやってQuakesクラスに持ってくるのかが全く思い浮かばないです。 「Quakesクラスに対象シートを持たせる」というのがどういう動きなのかも想像できないです、、 こういう場合、別の質問スレッドを立てたほうがいいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問