5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
受講生さんの投稿
(投稿ID: 4713) 添付ファイルのダウンロード権限がありません
返信とご教示頂きありがとうございます。
Publicとprivateの使い方について、
”'モジュールレベル変数をpublicにするのは、他のモジュールからも呼び出したいときです”
”'プロシージャをprivateにするのは、他のモジュールから呼び出されたくないときです”
をしっかり認識できていなかったです。再度動画・テキスト見返し理解することできました。
>作成中はsubプロシージャごと変数へ格納しなければならないので、ちょっとめんどくさいなと感じました
について、部分的に修正しやすいようにsubプロシージャをいくつか分けて作成し、動作を一気に実行するsubプロシージャを作っていますが、
部分的に修正が発生し、部分的に動作確認する場合、「オブジェクト変数またはWithブロック変数が設定されていません」というエラーが出てきてしまいます。
よって、subプロシージャ毎に
' Set shFm = Worksheets("main")
' lnFmMx = shFm.Range("B" & Rows.Count).End(xlUp).Row
と残しておいているのですが、(部分的に動作確認するときはコメントブロックを外す)
subプロシージャ毎に毎回同じ文言である
' Set shFm = Worksheets("main")
' lnFmMx = shFm.Range("B" & Rows.Count).End(xlUp).Row
を記載するのは面倒だなと感じました。(コピペなので、そんなに苦ではありませんが)
オプションエクスプレシットと最初に出てくるサブプロシージャの間に変数を宣言して、
さらに格納でき、そのモジュール内の全てのsubプロシージャで利用できれば便利ではないかと思ってしまいました。
試しに
Option Explicit
Dim shFm As Worksheet
Dim shTo As Worksheet
Dim lnFmMx As Long
Set shFm = Worksheets("main")
lnFmMx = shFm.Range("B" & Rows.Count).End(xlUp).Row
sub~
と作成したら、Setの部分で「プロシージャの外では無効です」とエラーがでました。
また、コメント頂いた部分チャレンジしてみました!
いろいろな書き方があるのだと知れてよかったです。コメントありがとうございます。(コード記載しようとしましたが、文字化けしてうまく記載できなかったので、ファイル添付します)
小川 慶一さんのコメント
(コメントID: 6565)
モジュールは大きく分けて順に以下の3つの領域に分けられます。
(各領域の名称は、かなり思い切って大胆に言い切っています)
[1] Option宣言領域
[2] モジュールレベル変数、定数宣言領域
[3] プロシージャ領域
領域 [2] では、変数の宣言はできますが、変数への値の格納等はできません。
変数への値の格納等は、領域 [3] に記述したプロシージャ内で行います。
値の設定は、その値を利用するタイミングより前であればどこでも良いです。
とはいえ、見通しのよいところで行うのが良いでしょう。
たとえば、以下では、値の設定は、OKのところで行うほうが、procedure1の中で行うよりメンテナンスが楽です。
ひきつづき、マクロ、楽しんでください (^^