5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
凜さんの投稿
(投稿ID: 5501)
宿題の提出をさせて頂きます。
ここまでの丁寧なご説明のおかげで作成の流れやそれぞれのマクロの書き方はある程度理解できた為、今回は以前の授業で教えて頂いた「サブプロシージャの分割と呼び出し」「モジュールレベル変数」へのチャレンジもしてみました。
その中でふと疑問に思ったのですが、「モジュールレベル変数」でOption Explicitの直後に変数を宣言し、変数の中身は各プロシージャごとに記載したのですが、「一度、設定した変数の値は再設定されるまで複数のプロシージャ間で有効になる」という事は1番上のプロシージャですべての変数の値を記載しておくという書き方もいいのでしょうか。
今後、仕事で使っていく上で書き方としての良し悪しも合わせて教えていただけますでしょうか。
下記、添削をお願いします。
最終的に動くものが出来たのですが、お手本の中でActivesheetを変数に入れていたので、下記のように変数を作成しやってみたのですが、これだけでまったく違う動作をしてしまい断念しました。
違う動作というのはコピー元の「main」シートが「愛知製本」になり、以降230枚ほどのシートが「main」のコピーとして作成されるというものです。
変数以外は変えていない事を確認しつつ、試行錯誤しましたが理解できず、諦めました。
何がいけなかったのでしょうか?
Dim Acts As Worksheet
Set Acts = Activesheet
今回、自力でチャレンジする機会を頂いたおかげで今後の自分の仕事への活かし方が具体的に見えてきた気がします。構文は使えるようになったけど自分の仕事としてどこで使えるんだろうという疑問が払拭された感じです。
大変でしたが、とても楽しくできました。ありがとうございました。
これからもよろしくお願いします。
小川 慶一さんのコメント
(コメントID: 8245)
投稿ありがとうございます。
添削を返送します。
>「一度、設定した変数の値は再設定されるまで複数のプロシージャ間で有効になる」という事は1番上のプロシージャですべての変数の値を記載しておくという書き方もいいのでしょうか。
大丈夫です。
実際に試してみてください (^^
>今後、仕事で使っていく上で書き方としての良し悪しも合わせて教えていただけますでしょうか。
「一度で済み、そのあと変更の必要はない」ということであれば、「初期の初期に一度調べてその値を使いわます」というやり方がいちばんすっきりした方法と思います。
お手本の中でActivesheetを変数に入れていたので、下記のように変数を作成しやってみたのですが、これだけでまったく違う動作をしてしまい断念しました。
上記2行をどこに入れたのか分からないのでなんともいえませんが...。
Set Acts = Activesheet は、 Acts という変数(ニックネーム)を ActiveSheet (そのときアクティブなシート)に割り当てるわけですのでそのタイミングがおかしかったのではないかと。
この行が実行された直後に、変数 Acts に「愛知販売」なり「愛媛不動産」なりといったご希望されているシートが割り当てられているかを確認してみてください。
ともあれ、まずは、添削内容を意識したリライトをしましょう。
より頭が混乱しそうな改変は、その次ということで。
小川 慶一さんのコメント
(コメントID: 8246)
これらもご確認ください。よい学びになるかと思います (^^
凜さんのコメント
(コメントID: 8252)
ご指摘頂いた箇所を修正しました。
難しくて5日間も悩んでしまいましたが、パズルを解いているようで楽しかったです。
よろしくお願いします。
小川 慶一さんのコメント
(コメントID: 8253)
以下の条件式は常に True ですね。あと、1箇所からしか呼び出されないなら、変数 Tenki をモジュールレベル変数にしてまで別プロシージャにするより、 S_sakusei の中に書いてしまったほうが良いかなとも思います。
(発展編1レベルのスキルのときは、です。発展編2で引数つきプロシージャを学ぶとその限りではなくなりますが)
『コードでやるより、シート「main1」のヘッダー・フッターを編集するほうがスマート』という件は、エクセルの外側の(VBA)でない機能でテンプレートの書式を整えてしまったほうがよいという意味です。
そうすると、以下のコードで明示的に変更しているところをいくつかコメントアウトできますね。
凜さんのコメント
(コメントID: 8254)
ご指摘頂いた条件式・・動作に影響がなかったので、常にTRUEである事に気付けませんでした。見直す時に逆の結果が出るパターンを考えて、不要な式を残さないように気を付けます。
また「1箇所からしか呼び出されないなら、変数 Tenki をモジュールレベル変数にしてまで別プロシージャにするより、 S_sakusei の中に書いてしまったほうが良いかなとも思います。」とのご指摘ですが、これはその変数を使うプロシージャが一つか複数かを考えて使い分けた方がよいという事でよろしいでしょうか。
「Tenki」と「Ws」が一つのプロシージャでしか使われていなかった為、個別のプロシージャ内に移動しました。
ヘッダー・フッターの設定について、理解できました。
必死にマクロを書くことばかりに囚われていましたが、Excelの設定で対応するところとマクロでやるところを使い分けていくことを意識してみます。
修正したものを添付いたします。
よろしくお願いします。
小川 慶一さんのコメント
(コメントID: 8255)
モジュールレベル変数は、複数プロシージャ間で変数を使って値を共有したいときに使うものです [1]
ですので、その変数を使うプロシージャが1つであれば、モジュールレベル変数として宣言する必要はないですね。
というか、定義とプロシージャが分離してしまうので、モジュールレベル変数をみだりに使ってしまうと可読性・メンテナンス性が落ちてしまいます。
また、 [1] の意味では、さらに言うと、変数 Gyo はこれを使っている S_Ano, S_sakusei のそれぞれの内部で宣言したほうが良いです。
そうすることのメリットは、たとえば、なんらかの事情で「S_sakusei の中では for 文のカウンターとして使う変数の名前を Gyo ではなく hoge にしたい」等の修正を行うときに変更が最低限で済むことです。
モジュールレベル変数として宣言した Gyo を変更するとなると、モジュール内全域で影響が生じます。ですが、 S_sakusei の内部で宣言した変数であれば、変更はその内部で宣言した変数とその内部のプロシージャだけで済みます。
凜さんのコメント
(コメントID: 8256)
詳しい説明をありがとうございました!
小川 慶一さんのコメント
(コメントID: 8257)
ひきつづきよろしくお願いいたします (^^