🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2977閲覧

配列の受け渡しについて

m_m_0824

総合スコア4

VBA

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/02/28 11:24

編集2021/02/28 11:37

失礼いたしました。追記です。

sCnt()とtCnt()というそれぞれの配列を複数のプロシージャ内で使いたいのです。そこで、これらの配列を「Sub 配列決定()」というプロシージャ内で宣言し、要素を入れていき、他のプロシージャで活用する際にcallで呼び出しているのですが、どうも呼び出されていないようです。(エラーメッセージが出てしまいます。)
何が原因かわかりません。なにか、方法はありますか。よろしくお願いします。

vba

1Sub 小問カウント() 2 3ReDim sCnt(1 To Daimon) As Integer 4For i = 1 To Daimon 5 sCnt(i) = UF1.Controls("TextBox" & i).Text 6Next i 7ReDim tCnt(0 To Daimon) As Integer 8tCnt(0) = 0 9For i = 1 To Daimon 10 tCnt(i) = tCnt(i - 1) + UF1.Controls("TextBox" & i).Text 11Next i 12End Sub 13 14 15Sub 枠設定() 16 17For i = 1 To sCnt(1) 18 UF2.Controls("CheckBox" & i).Visible = True 19 UF2.Controls("TextBox" & i).Visible = True 20 UF2.Controls("TextBox" & i + 30).Visible = True 21 UF2.Controls("TextBox" & i + 60).Visible = True 22 UF2.Controls("Label" & i).Visible = True 23Next 24 25End Sub

上記のプロシージャはいずれも同じ標準モジュール内にコードしています。そして、これらをユーザーフォーム内のモジュールで活用したいんですがうまくいきません。下記がユーザーフォーム内のモジュールのコードです。(ちなみに、小問カウントと枠設定を分けている理由は小問カウントだけを活用する場面が多々あるためです。)

VBA

1Private Sub UserForm_Initialize() 2Bunshi = 2 3Me.Frame2.ScrollTop = 0 4Me.Label71.Caption = Bunshi & " / " & Daimon + 2 & " ページ" 5Me.Label31.Caption = "< " & sName & " >" 6 7Call 小問カウント 8Call 枠設定 9Me.TextBox1.SetFocus

出てくるエラーメッセージはsub 枠設定()内で「SubまたはFunctionが定義されていません。」というものです。

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

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

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

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

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

y_waiwai

2021/02/28 11:27

そのコードとエラーメッセージを提示しましょう
guest

回答2

0

変数にはスコープ(適用範囲)というものがあります。(配列変数も同様です。)

VBA スコープ

Office TANAKA - 変数の使い方[変数の適用範囲]

重要な概念なので検索すれば解説ページは他にもいろいろ見つかります。
まずはこの概念を理解しましょう。

その変数をそのブック内のどこからでも参照したいのなら、標準モジュールの先頭で宣言します。
今回の場合は、Cnt()とtCnt()をここで宣言すればいいでしょう。

どこからでも参照できるのでグルーバル変数といいます。
便利ではあるのですが、どこからでも参照できるということは、大きなプロジェクトになるとバグの元になります。これもグローバル変数というキーワードで検索するといろいろ解説が見つかります。

できればグローバル変数の使用は避けたほうがいいです。なるべく狭いスコープで宣言する。あるいは、プロシージャの引数を変数を渡しようにするなどの設計に変更することも理解が進んだら検討するといいでしょう。

投稿2021/02/28 12:21

hatena19

総合スコア34073

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

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

m_m_0824

2021/02/28 14:03

大変丁寧に説明いただきありがとうございます。参考URLも拝見させていただき、勉強を深めていきたいと思います!
guest

0

ベストアンサー

プロシージャの外(標準モジュールの先頭)で宣言すると良いと思います。

投稿2021/02/28 11:28

jinoji

総合スコア4592

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問