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

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

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

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

Q&A

解決済

1回答

916閲覧

定義を別ファイルに書きたい【質問簡略化しました】

ma2hiro

総合スコア159

VBA

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

0グッド

0クリップ

投稿2021/04/09 03:02

編集2021/04/09 05:15

お世話になっております。

本ページの↓の【過去書き込み】では問い合わせたい内容が不明でしたので
整理して書きます。

excelにて
標準モジュール挿入して表示>プロパティウィンドウで名前をIncludeに変更と名前を変えて内容が下部の通りです。

Public gHyouLeft As Integer: gHyouLeft = 100

それで上記を利用するVBAとしてexcel>開発>挿入>ボタンでマクロを登録して
Module1の ボタン1_Click()にて

Sub ボタン1_Click() Dim x As Integer: x = include.gHyouLeft ActiveCell.Cells(1, 1) = x End Sub

としました。

それでexcel上のボタン1をクリックすると

コンパイルエラー プロシージャの外では無効です。

と表示されるのですが
セルA1にIncludeモジュールの中身を持って来たいのですが
どのようにすれば良いのか?なんという語句でググれば良いのかご助力頂けないでしょうか?

お忙しい所大変申し訳無いのですが何か情報をお持ちな方はコメント頂けますようお願い申し上げます。

【過去書き込み】================================ 今現在引き継いだExcelをメンテナンスしております。 ソース内に直値でなんか値が表記してあるので その直値を別ファイルにまとめたくテストで使用した所 ``Visual Basic for Applications コンパイルエラー プロシージャの外では無効です `` と言われてしましました。 [標準モジュール、クラスモジュール、ユーザーフォーム - だるまのエクセルVBA](http://darumaexcel.uijin.com/aboutooa/vba_module.html) によると標準モジュールだとオブジェクト作成しないので定義だけそちらで良いのかと思い 標準モジュールに ``includeData Public gHyouLeft As Integer: gHyouLeft = 100 Public gHyouTop As Integer: gHyouTop = 96.768 `` と作成して使用する際には `` Public Function AddRow(Sh As Object) As Long : Tpos = (RefNum - 1) * 19.8 + includeData.gHyouTop `` としたのですが ``Visual Basic for Applications コンパイルエラー プロシージャの外では無効です `` というエラーメッセージが表示されました…… 他の言語と混ざっているのかもと思いましたが自動で出てきたのでそうではないと思っております…… 上記 標準モジュールのincludeData の gHyouTop の値を使用する方法をお伺いしてよろしいでしょうか? 本当に初心者の質問申し訳無いのですが何か情報をお持ちな方はコメント頂けますようお願い申し上げます。

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

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

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

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

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

y_waiwai

2021/04/09 04:25

コード全体を提示しましょう 一部分だけ出されてもわけわかりません
ma2hiro

2021/04/09 04:38

y_waiwai様 コメントありがとうございます。 仰る通りですね…… 膨大なソースなので新規プロジェクトで作って全部載せようとしてみます。
ma2hiro

2021/04/09 05:16

y_waiwai様 質問簡略化しました。 この度はお手数おかけして大変申し訳ございませんでした。
guest

回答1

0

ベストアンサー

おそらく「変数の値はプロシージャ外で変更することはできない」というルールがここでも適用されている、という話なのだと思います。

どうしてもグローバル変数でやる必要があるのなら、値を設定するためのプロシージャを用意し、Workbook_Activateあたりから毎回値を設定させる、という方法があるかと思います。

投稿2021/04/09 06:33

Usirow

総合スコア364

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

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

ma2hiro

2021/04/09 07:06 編集

Usirow様 コメントありがとうございます。 excelは不慣れなためお手数おかけして申し訳ございません。 仰る通りexcelが有効なブックに ```ThisWorkbook Option Explicit Public gHyouLeft As Integer: Private Sub Workbook_Activate() gHyouLeft = 100 End Sub ``` としてボタンが押下された際のVBAとして ```Module2 Sub ボタン1_Click() Dim x As Integer: x = ThisWorkbook.gHyouLeft ActiveCell.Cells(1, 1) = x End Sub ``` としているのですがxの値が0なのです…… 私がUsirow様の仰っている事が理解できていないのは重々承知なのですが このような方法を仰っているのでは無いのでしょうか? お忙しい所大変申し訳無いのですが上記お問い合わせいたします。
Usirow

2021/04/09 07:17

まず、gHyouLeftはThisWorkBookではなく、標準モジュールで定義してください。 そのうえでxにgHyouLeftを代入する際、指定は単なるgHyouLeftで大丈夫です。
ma2hiro

2021/04/09 07:49 編集

Usirow様 度々ありがとうございます。 大変申し訳無いのですが 標準モジュールで定義すると ``` コンパイルエラー プロシージャの外では無効です。 ``` となります。以下ソースです…… ```標準モジュールのinclude Public gHyouLeft As Integer: gHyouLeft = 100 ``` ```標準モジュールのModule2 Sub ボタン1_Click() 'Dim x As Integer: x = ThisWorkbook.gHyouLeft Dim x As Integer: x = include.gHyouLeft ActiveCell.Cells(1, 1) = x End Sub ``` ```使わないけどThisWorkbook Option Explicit Public gHyouLeft As Integer: Private Sub Workbook_Activate() 'MsgBox ActiveWorkbook.Name & "がアクティブになりました。" gHyouLeft = include.gHyouLeft 'gHyouLeft = 100 End Sub ``` 多分私が勘違いしていると思われるのですがどこがどう勘違いなのか不明なのです…… 大変申し訳無いのですがご助力頂けますようお願い申し上げます。
Usirow

2021/04/09 08:08

ええとですね、回答で書いた「変数の値はプロシージャ外で変更することはできない」というのは、「Public gHyouLeft As Integer: gHyouLeft = 100」を指しています。 これは「Public gHyouLeft As Integer」と「: gHyouLeft = 100」の二つに分けることができ、意味するところは「gHyouLeftをInteger型で宣言」と「gHyouLeftに100を代入」になります。 前者だけなら良いのですが、後者は変数の値の変更になります。この一行がプロシージャの外に記述されているため、「変数の値はプロシージャ外で変更することはできない」のルールに引っかかっている、と私は判断しました。 そのうえで私の回答としては、 ・まずグローバル変数として「Public gHyouLeft As Integer」の宣言のみを行う ・「: gHyouLeft = 100」に相当する処理を別に用意する ・ThisWorkBook_Activateを使い、このワークブックをアクティブにするたびに上記の処理を実行させる ・以上の流れにより、このワークブックで作業を行っている間は、常にgHyouLeft = 100となるようにする というものになります。 この際、gHyouLeftを標準モジュールで宣言しないと、正常に動作しません。 質問者さまの最初のコメントでは、gHyouLeftがThisWorkBookで宣言されていたため、修正をお願いしましたが、そこで「: gHyouLeft = 100」が復活してしまったためにエラーが発生しているものと思います。 これでお伝えできているでしょうか?
ma2hiro

2021/04/09 08:41 編集

わかりました。 仰っている通りに以下の通りするとそれっぽく出来ましたっ ```標準モジュールのinclude Public gHyouLeft As Integer ``` ```ThisWorkbook Option Explicit Private Sub Workbook_Activate() include.gHyouLeft = 100 End Sub ``` ```Module2 Sub ボタン1_Click() Dim x As Integer: x = include.gHyouLeft ActiveCell.Cells(1, 1) = x End Sub ``` なんか宣言と同時に値を入れたいのですがExcelだと ThisWorkbookのWorkbook_Activeでないと値は入れられないっぽいのですね…… ってそれだったらincludeじゃなくて全部ThisWorkbookでやれば良いのかな……(^_^;) MSに対するモヤモヤがありますがコメントありがとうございました。
Usirow

2021/04/09 08:57

すみません。変数とばかり思っていたのですっかり忘れてましたが、他から変数の中身を弄らないならば「Public Const gHyouLeft = 100」だけで宣言できますね。 定数宣言なので今回のケースで使えるかどうかはわかりませんが。
ma2hiro

2021/04/09 09:04

ああああああああ それですっ ありがとうございます。 それが出てこなくて疑問に思っておりましたっ ```標準モジュールのinclude Public Const gHyouLeft = 100 ``` ```標準モジュールModule2 Sub ボタン1_Click() 'Dim x As Integer: x = ThisWorkbook.gHyouLeft Dim x As Integer: x = include.gHyouLeft ActiveCell.Cells(1, 1) = x End Sub ``` で出来ましたっ これでスッキリしました。 本当にありがとうございましたっm(_ _)m
Usirow

2021/04/09 09:21

散々遠回りさせてしまって申し訳ありません。解決できたようで何よりです。お恥ずかしい!
ma2hiro

2021/04/09 09:30

いえいえ 初心者にお付き合い頂き大変感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問