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

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

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

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

Q&A

解決済

1回答

845閲覧

VBA:クラスへの代入値を他の関数で呼び出すためには。

masafumi55

総合スコア12

VBA

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

0グッド

0クリップ

投稿2020/10/29 02:13

編集2020/10/29 04:31

いつも大変お世話になっております。masafumi55です。今回はクラスの代入について調べてもわからないことが発生いたしました。
お忙しいところ恐れ入りますがご教示のほどお願いいたします。

【質問事項】

<前提>
・モジュールAの関数Aで代入した値を、同じモジュールAの関数Aで抽出する場合、代入した値を抽出することができた。
しかしながら、モジュールAの関数Aで代入した値を、同じモジュールAの今度は関数Bで抽出する場合、代入した値を抽出することができず、値はnullまたは"空白"の状態だった。

<質問>
****「「クラスのメンバ変数に値を代入した場合においても、他の関数内でその代入値を使用する場合には、
通常の変数同様に、引数での受け渡しが前提となるのでしょうか。」」


私のイメージでは、クラスに代入した値は、どのモジュールおよび関数内で呼び出した場合でも、代入値を参照できるというものです。
しかしながら、下記の<コード概要>のとおり、それが出来なかったため、いろいろ調査しましたが、回答を得ることが出来ませんでした。

<コード概要>

'<クラス名:ClassTemporary> Public tpBcName As String
'<フォーム> Dim classTemporary As classTemporary '(注)関数外のモジュールにて宣言。 Private Sub SpinButton1_Change() Set classTemporary = New classTemporary classTemporary.tpBcName = "鬼滅" MsgBox classTemporary.tpBcName ' ←(注)こちらはきちんと代入値「"鬼滅"」が表示されます。 Public Function errorManEffect(ByVal page As Integer)' ← (注)エラー処理になります。 Set classTemporary = New classTemporary MsgBox classTemporary.tpBcName ' ←(注)こちらは、「""」が表示されてしまいます。

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

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

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

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

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

m.ts10806

2020/10/29 02:34

コメントはVBAのコメント機能で入れてください。 でないと再現確認しようとしたときに取り除く手間が発生します。 (コード以外はなるべく書かないでほしい)
masafumi55

2020/10/29 02:35

承知いたしました!ご指摘ありがとうございます。すぐ修正いたします。
guest

回答1

0

ベストアンサー

vba

1Dim classTemporary As classTemporary '(注)関数外のモジュールにて宣言。

とりあえずクラス名と変数名は別にしたほうがいいかと。

vba

1Public Function errorManEffect(ByVal page As Integer)' ← (注)エラー処理になります。 2Set classTemporary = New classTemporary 3MsgBox classTemporary.tpBcName ' ←(注)こちらは、「""」が表示されてしまいます。 4

Newでクラスのインスタンスを新規に作成して、変数に代入したら、新規のクラスで上書きされてしまうので、前に代入したデータは消えてしまうのは当然です。
上記の Set classTemporary = New classTemporaryの行を削除してください。


クラスモジュールのコードが提示されていないし、全体で何をしたいのか不明ですが、一つのクラスのインスタンスをフォーム内で使いまわしたいのなら、フォームを開くときに New でインスタンスを生成して、フォームを閉じるときに解放するようしましょう。(解放は自動でされるのでなくてもいいのですが。)
関数内で使うたびに Newして変数に上書きしていたら、そのたびに設定値はリセットされます。

vba

1Dim Temporary As classTemporary '変数名とクラス名は別にする 2 3Private Sub Form_Open(Cancel As Integer) 4 Set Temporary = New classTemporary 'クラスのインスタンスの生成 5End Sub 6 7Private Sub Form_Close() 8 Set Temporary = NoThing 'クラスのインスタンスの解放 9End Sub

回答してから質問見直したら、コードが修正されてますね。
最初のコードはフォームモジュールのコードのようでしたが、今度は標準モジュールでのコードになってます。
記述する場所によって話はまったく違ってきます。
標準モジュールで、クラスをモジュールレベル変数で宣言するのは一般的にはあまりよい使い方ではないです。
実際、どのような目的で使用するのか不明なので、明確なアドバイスは難しいですが、
まずは、Newの意味を理解してから、やりたいことを整理して、コードを書きなおしてください。

投稿2020/10/29 02:55

編集2020/10/29 04:41
hatena19

総合スコア34075

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

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

masafumi55

2020/10/29 04:52

さっそくのご回答誠にありがとうございます。 無事解決いたしました!   「Set Temporary = New classTemporary 」の部分で値が上書きされている点について理解できました。誠にありがとうございます! また、コードへのレビューと汎用性のあるコードの提示について重ねて感謝いたします! 尚、今回やろうとしていたことは、 「スピナーの変化にともなって、ユーザーフォームでの表示内容が変更になるのですが、その際に、変更内容をクラスに保存すること。」 「上記のユーザーホームの内容で変更確定する際に、何かしらのエラーが発生した際には、保存してあった変更前のデータを再表示する」 という2点の機能を想定し作成しておりました。 (俯瞰した設計が未熟なためまだ全然できないので、いきあたりばったりの設計?となっております(汗)) 以上、この度も丁寧なご説明と迅速なご対応まことにありがとうございました! という流れで作成しておりました。
masafumi55

2020/10/29 04:56

尚、フォームモジュールの話でした(汗)! >とりあえずクラス名と変数名は別にしたほうがいいかと。 というご指示を反映していくなかで、急ぎ足で修正しておりましたら、いろいろと誤字があり、自身で意味不明になったので、初期の質問事項に修正させていただいております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問