Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
「マクロを1つに纏めたい」の chibikko さんへ
投稿日時: 21/02/02 15:53:48
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

もう一度コードを確認し、End Subの前に記載していた転記先をActiveにするコードを
macroAとmacroBの間に移した所、問題なく作動しました。

 
見た目、問題が解決しているかもしれませんが、
根本的な解決ではありません。
 
根本的な間違いに気が付いていないです。
 
MacroAでは操作するセルには、シートオブジェクトが付いています。
MacroBでは、問題の個所のセルには、シートオブジェクトがついていません。
シートオブジェクトを記述しないと、その時、アクティブなシートを参照します。
このように、基本的なことをマスタしないと、同じような間違いを繰り返すことになります。

回答
投稿日時: 21/02/04 09:51:29
投稿者: simple

蛇足的に補足します。
 
複数のシートを扱うコードで、

   Sheet1.Activate
   Cells(1,1).....
   Cells(2,1).....
   Sheet2.Activate
   Cells(3,1).....
   Cells(4,1).....
といった形式のものは、改善の余地があるということです。
今回のようにActiveにすることを忘れたりすると致命的です。
 
数行のコードであればこれでわかるかもしれませんが、
少し長くなると、読んでいて、シート指定がないRangeオブジェクトが出てきたときに、
今どのシートがアクティブかということを常に考えなければならず、
可読性が低下するのです。
また、逐一シートを選択することはパフォーマンスが劣化します。
 
どうすればよいかと言えば、ワークシートの選択はせずに、
   Sheet1.Cells(1,1).....
   Sheet1.Cells(2,1).....

   Sheet2.Cells(3,1).....
   Sheet2.Cells(4,1).....
というような形式が望ましいのです。これならどのシートかは明瞭です。
 
ただし、これだとワークシートが目立ちすぎて、重要なところが目立たなくなる可能性もあるので、
(1)短いワークシート変数を使ったり、(ws1.Cells(1,1)のように)
(2)With ステートメント使ったりします。
 
もちろん、上記の考え方を基本的に踏襲しながらの工夫と言えます。
参考にして下さい。

投稿日時: 21/02/11 11:35:02
投稿者: WinArrow
投稿者のウェブサイトに移動

閉じます。