5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
受講生さんの投稿
(投稿ID: 4730)
添削を宜しくお願いいたします。
ここまで取り組んだことで、仕事でマクロを使ったツール作成ができるようになっていて、大変うれしいです。
作成していて2点疑問があり、以下ご教示頂きたいです。
何卒宜しくお願いいたします。
1,workbookとworksheetを格納した変数で書くことはできないのでしょうか。
今回のマクロは別のExcelブック間を行き来しないので良いのですが発生する場合、変数で記載出来ればいいなと思って書いたらエラーとなってしまいました。
workbookやworksheetの書き方の規則はどんなものがあるのでしょうか。
Dim shF As Worksheet
Dim boF As Workbook
Set boF = Workbooks("s09_homework.xls")
Set shF = Worksheets("main")
動いた
shF.Range("A1").Value = "No."
Workbooks("s09_homework.xls").Worksheets("main").Range("A1").Value = "No."
boF.Worksheets("main").Range("A1").Value = "No."
動かない
boF.shF.Range("A1").Value = "No." ←このように記載できればと思っていました。
Workbooks("s09_homework.xls").shF.Range("A1").Value = "No."
2,kaishiのSubプロシージャですが、最後mainシートのA1を選択された状態で終了したいとしたとき、
shF.Range("A1").Select
とだけ書くとエラーとなり、
shF.Activate
といれるとちゃんと動くようになりました。
こちらはselectしたいのであれば一度そのシートをActivateの状態にしないとだめというルールなのですか?
何卒宜しくお願い致します。
小川 慶一さんのコメント
(コメントID: 6601)
> 1,workbookとworksheetを格納した変数で書くことはできないのでしょうか。
小川 慶一さんのコメント
(コメントID: 6602)
> 2,kaishiのSubプロシージャですが、最後mainシートのA1を選択された状態で終了したいとしたとき、
> shF.Range("A1").Select
> とだけ書くとエラーとなり、
> shF.Activate
> といれるとちゃんと動くようになりました。
> こちらはselectしたいのであれば一度そのシートをActivateの状態にしないとだめというルールなのですか?
まさに、そうです。
ワークシートでも同様で、アクティブでないブック内のシートをアクティブにするには、そのシートが所属するブックをアクティブになっている必要があります。
...というか、ありました。
かつてのバージョンのエクセルでは。最近はそうでもないかもしれません。
実は、僕の環境で以下をテストしたら、なぜか動きました。本当は(*3)でエラーが出て動作が中断するはずだったのですが。
小川 慶一さんのコメント
(コメントID: 6603)
添削返送します。直すようなところは特にありませんが、一読しておいてください。
あと、さきほどの book1.xlsm, book2.xlsm をシェアします。 .zip ファイルにまとめていますが、解凍してから使ってみてください。
https://www.dropbox.com/sh/xy32x73u92bu3z1/AACJCQWPGLmBtpRvBVTsZqYKa?dl=0
受講生さんのコメント
(コメントID: 6607)
お世話になっております。
ご返信頂きありがとうございます!
> 1,workbookとworksheetを格納した変数で書くことはできないのでしょうか。
について、すっきりしました!
直感的な説明を頂けて、
同姓同名が3組と5組にいて、違うニックネームだった場合はどうなるの?と思い、以下記載したところ、そういうことだったのか!とすごく納得できました。
(wsA1もwsA2も参照設定が同じ内容でこびとちゃんが混乱する!と書いていて気づきました。直感的な説明により思考しやすくなり、理解が深まりました!)
こびとちゃんが混乱しないために同姓同名がいた場合どうすれば良いか考えたとき、
以下の通り作成したら、問題無く動きました。そして、そもそも参照設定で詳細に”何組の”を設定しているので、書く必要が無いなと納得しました。
> 2,kaishiのSubプロシージャですが、最後mainシートのA1を選択された状態で終了したいとしたとき、
>> shF.Range("A1").Select
>> とだけ書くとエラーとなり、
>> shF.Activate
>> といれるとちゃんと動くようになりました。
>> こちらはselectしたいのであれば一度そのシートをActivateの状態にしないとだめというルールなのですか?
>
>まさに、そうです。
>
>
>ワークシートでも同様で、アクティブでないブック内のシートをアクティブにするには、そのシートが所属するブックをアクティブになっている必要があります。
>...というか、ありました。
>かつてのバージョンのエクセルでは。最近はそうでもないかもしれません。
>実は、僕の環境で以下をテストしたら、なぜか動きました。本当は(*3)でエラーが出て動作が中断するはずだったのですが。
私の環境でも動きました!一応そういう規則となっていること承知いたしました!ありがとうございます。
添削もありがとうございます。
ボタンをつけるのを忘れておりました。コードを見るだけでボタンがついていないとわかるのですね!?
何か記載間違っているのかな?と思い、ボタン作成しましたら実行されました。
「新規追加する都度シートの書式を設定」は実行速度が重くなりますね!ベストはシート『main1』の書式を変更するとのこと、ありがとうございます。
小川 慶一さんのコメント
(コメントID: 6606)
おはようございます。
> 同姓同名が3組と5組にいて、違うニックネームだった場合はどうなるの?と思い、以下記載したところ、そういうことだったのか!とすごく納得できました。
> (wsA1もwsA2も参照設定が同じ内容でこびとちゃんが混乱する!と書いていて気づきました。直感的な説明により思考しやすくなり、理解が深まりました!)
> こびとちゃんが混乱しないために同姓同名がいた場合どうすれば良いか考えたとき、
> 以下の通り作成したら、問題無く動きました。そして、そもそも参照設定で詳細に”何組の”を設定しているので、書く必要が無いなと納得しました。
Sub tameshi2、拝見しました。
ご理解のとおりで良いかと思います。
> >実は、僕の環境で以下をテストしたら、なぜか動きました。本当は(*3)でエラーが出て動作が中断するはずだったのですが。
> 私の環境でも動きました!一応そういう規則となっていること承知いたしました!ありがとうございます。
規則(仕様)が変わったのかもしれません。
この件は、以前はよくあったハマりごとでした。
僕もこの点注意深くプログラムを書いていた時期があります。だいぶ前に納品して今でもときどきメンテナンスの依頼の来るシステムがあるのですが、そこではこの問題を回避すべくかなり注意深くコーディングをしています。
> 「新規追加する都度シートの書式を設定」は実行速度が重くなりますね!ベストはシート『main1』の書式を変更するとのこと、ありがとうございます。
「テンプレートを作り込むことで、コーディング量が減り、処理に要する時間も短くなる」というのは、実務でもよくある改善例です。
ひきつづき、お楽しみください☆