Option Explicit
Dim saidai As Long
'saidai = Range("A" & Rows.Count).End(xlUp).Row 'NG
Sub hoge()
saidai = Range("A" & Rows.Count).End(xlUp).Row 'OK
End Sub
Option Explicit
Dim saidai As Long
Sub hoge()
saidai = Range("A" & Rows.Count).End(xlUp).Row 'OK
procedure1
procedure2
procedure3
procedure4
End Sub
Sub procedure1()
'saidai = Range("A" & Rows.Count).End(xlUp).Row 'NGということはないが好ましくない
'変数 saidai を使う処理...
End Sub
Sub procedure2()
'変数 saidai を使う処理...
End Sub
Sub procedure3()
'変数 saidai を使う処理...
End Sub
Sub procedure4()
'変数 saidai を使う処理...
End Sub
受講生さんの投稿
(投稿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の中で行うよりメンテナンスが楽です。
ひきつづき、マクロ、楽しんでください (^^