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

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

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

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

Q&A

解決済

2回答

2662閲覧

【Excel VBA】ブック開始から終了までインスタンスを保持したい。

sanmaserver

総合スコア5

VBA

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

0グッド

0クリップ

投稿2021/06/08 05:31

前提・実現したいこと

初めて投稿します。

Excel VBAについて質問です。
現在、依存の標準モジュールをクラスモジュールに書き換えています。
あるインスタンスをExcelの1つのブックの起動から終了まで生存させたいのですが、
どのようにしたら良いのでしょうか。

そのインスタンスが保持しているメンバ変数やメンバメソッドを
ブックが開いている間、常にそれらを使用したいと考えています。

適当なサンプルコードを提示頂けたら、幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

クラスについては理解できているとして、

そのインスタンスが保持しているメンバ変数やメンバメソッドを

ブックが開いている間、常にそれらを使用したいと考えています。

標準モジュールにPublicで宣言したのと同様に、ブックが開いている間中どこからでもいつでも使用したいということなら、
標準モジュールの宣言部でPublicでインスタンスを生成すればいいでしょう。
下記のようにNewステートメントを付加すると宣言と同時にインスタンスを生成します。

標準モジュール

vba

1Option Explicit 2 3Public cls1 As New Class1

クラスモジュール クラス名 Class1

vba

1Option Explicit 2 3Public X As Long 4Public Y As Long 5Public Z As Long 6 7Public Function GetSum() As Long 8 GetSum = X + Y + Z 9End Function

例えばユーザーフォームから呼び出す場合

vba

1Private Sub CommandButton1_Click() 2 3 cls1.X = 1 4 cls1.Y = 2 5 cls1.Z = 3 6 7End Sub 8 9Private Sub CommandButton2_Click() 10 11 Debug.Print "Xは" & cls1.X & "、Yは" & cls1.Y & "、Zは" & cls1.Z 12 Debug.Print "合計は" & cls1.GetSum 13 14End Sub 15 16

投稿2021/06/08 07:28

hatena19

総合スコア34075

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

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

sanmaserver

2021/06/08 07:59

標準モジュールで作成したcls1は、どのように開放するのでしょうか。
hatena19

2021/06/08 08:34

ブックが閉じる時に自動で解放されると思います。 VBA Set Obj = Nothing は必要か - t-hom’s diary https://thom.hateblo.jp/entry/2015/12/20/135035 もし、不安なら、THisWorkbookモジュールのBeforeCloseイベントで解放しておけばいいでしょう。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Set cls1 = Nothing End Sub
sanmaserver

2021/06/09 00:16

ありがとうござます! 理解できました。 本当に助かりました。
guest

0

クラスモジュールをClassと言う名称で作成して、ソースをコピペして下さい。
Testを動かすとクラスの感じが掴めると思います。
(標準モジュール)

VBA

1Sub Test_Sample_Miniature() 2 'クラス定義 3 Dim ClassX As Class 4 Dim ClassY As Class 5 'オブジェクト作成 6 Set ClassX = New Class 7 Set ClassY = New Class 8 '実行処理 9 ClassX.glng数値X = 1500 10 ClassX.glng数値Y = 100 11 ClassX.gstr名称 = "ClassX" 12 ClassX.計算処理 13 ClassY.glng数値X = 12300 14 ClassY.glng数値Y = 10000 15 ClassY.gstr名称 = "ClassY" 16 ClassY.計算処理 17 MsgBox ClassX.gstr名称 & "と" & _ 18 ClassY.gstr名称 & "の合計は" & _ 19 Format(ClassX.glng数値Z + ClassY.glng数値Z, "#,##0") 20 '終了 21 Set ClassX = Nothing 22 Set ClassY = Nothing 23End Sub

(Classモジュール)名称Class

VBA

1'プロパティ実装 2Public glng数値X As Long 3Public glng数値Y As Long 4Public glng数値Z As Long 5Public gstr名称 As String 6'クラス変数実装 7Dim lngWORK As Long 8'関数実装 9Function 計算処理() 10 lngWORK = glng数値X * glng数値Y 11 glng数値Z = lngWORK 12 MsgBox Trim(gstr名称) & "クラスで計算しました = " & Format(lngWORK, "#,##0") 13End Function

投稿2021/06/08 06:36

tosi

総合スコア553

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

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

sanmaserver

2021/06/09 00:16

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問