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

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

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

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

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

2回答

3213閲覧

VBA 変数宣言 まとめて プロシージャ外

tttkkk

総合スコア38

VBA

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

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

0クリップ

投稿2021/08/24 13:44

効率良く変数を宣言する方法についてご質問したく、
掲載いたしました。

同一モジュールの別プロシージャにおいて、
同じ変数名を使用したいと思っております。
その場合、モジュールレベルでの変数宣言などが方法の一つとして
あるかと思いますが、
モジュールレベルの宣言はコードが読みにくくなるなど
デメリットも多く私自身もあまり使いたいと思いません。

しかし同一モジュールの別々のプロシージャで同じ変数名を使用し同じ内容を定義することを繰り返すのも効率的ではないと思っております。
ただ私自身では解決方法が見つからず、何かご教授いただければと思い、質問いたしました。

まず以下に現状のサンプルコードを記載致します。

VBA

1Sub msg1() 2dim aaa as string 3aaa = "AAA" 4MsgBox aaa 5End Sub 6 7Sub msg2() 8dim aaa as string 9aaa = "AAA" 10MsgBox aaa 11dim ccc as string 12ccc = "CCC" 13MsgBox ccc 14End Sub 15 16Sub msg3() 17dim bbb as string 18bbb = "BBB" 19MsgBox bbb 20dim ccc as string 21ccc = "CCC" 22MsgBox ccc 23dim eee as string 24eee = "EEE" 25MsgBox eee 26End Sub

現状のコードとしては以上となります。
冒頭でも述べた通り、このコードですと、
複数のプロシージャで同じ変数名で同じ内容を定義していますので
(例えば、msg1とmsg2ではaaaが被っている)、
このようなところを一緒にできないかと思いました。

何か関数などにして一気に宣言と定義を処理してしまい、
各プロシージャでは関数を呼び出すだけで、
その後は変数名だけをプロシージャに記述すれば
変数を使える関数などつくれるのではないか?と淡く思いました。
しかし私自身モジュールレベルの宣言を使う方法しか思いつかず、
モジュールレベルの宣言にはデメリットも多いので、
できることなら使用することを控えたいと思っております。

参考になるかは分かりませんが、私がモジュールレベルの宣言を使って
変数の宣言、定義をひとまとめにしたコードを以下に記載いたします。

VBA

1Dim aaa As String 2Dim bbb As String 3Dim ccc As String 4Dim ddd As String 5Dim eee As String 6 7Sub DimDim() 8aaa = "AAA" 9bbb = "BBB" 10ccc = "CCC" 11ddd = "DDD" 12eee = "EEE" 13End Sub 14 15Sub msg1() 16Call DimDim 17MsgBox aaa 18End Sub 19 20Sub msg2() 21Call DimDim 22MsgBox aaa 23MsgBox ccc 24End Sub 25 26Sub msg3() 27Call DimDim 28MsgBox bbb 29MsgBox ccc 30MsgBox eee 31End Sub

重ねてにはなりますが、
上記コードの

VBA

1Dim aaa As String 2Dim bbb As String 3Dim ccc As String 4Dim ddd As String 5Dim eee As String 6 7Sub DimDim() 8aaa = "AAA" 9bbb = "BBB" 10ccc = "CCC" 11ddd = "DDD" 12eee = "EEE" 13End Sub

この部分をモジュールレベルの宣言を使用するのではなく、
より効率的なコードにできればと思っております。

長文となり、分かりにくい部分も出てしまったかと思いますが、
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

要件がよく分かりませんが、定数で良いなら、Constをモジュールレベルで定義するのでしょうか。

文法的にConstに書けないような値の場合でも、再代入が無いのであればモジュールレベルで良いんじゃないでしょうか。

投稿2021/08/24 13:56

otn

総合スコア85762

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

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

tttkkk

2021/08/25 12:25

分かりにくい質問で申し訳ありません。 モジュールレベルの宣言は可読性を下げるとよく言われますので、 それを避けた上で他に効率的な方法があればと思い質問いたしました。 やはり現段階での私のスキルですと、 仰る通りモジュールレベルの宣言を行うのが一番なのかもしれません。 再代入することはないので、constを使用してみたいと思います。
otn

2021/08/25 17:15 編集

> モジュールレベルの宣言は可読性を下げるとよく言われますので、 そう言われる理由を考えましょう。結論だけ記憶するのはあまり意味が無く、時として有害です。
guest

0

提示のようなコードなら、可変引数でもとって、関数定義を一つだけ、にすれば変数名で悩むことはなくなります。

複数のプロシージャで同じ変数名で同じ内容を定義していますので

ってのはそもそもの設計が悪いように思いますが。

投稿2021/08/24 14:09

y_waiwai

総合スコア88024

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

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

tttkkk

2021/08/25 12:24

確かに複数のプロシージャで同じ変数の定義をしたいということ自体が間違いなのかもしれません…。 もう少し考えてみて再設計の必要があれば土台から考えてみたいと思います。
tttkkk

2021/08/25 12:26

また、可変引数というのを教えていただきありがとうございました。 初めて見た用語でしたので、勉強した上で自分のマクロに落とせるかどうか試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問