ExcelのVBAで、処理中に意図しないシートがアクティブになってしまう。 内容は2シートの内容を比較してブックを作成するマクロなのですが、

Excel | Visual Basic81閲覧xmlns="http://www.w3.org/2000/svg">25

ベストアンサー

0

その他の回答(4件)

0

デバッグ中にブックやシートを切り替えたりすると、Activesheetはそのときのアクティブブックが表示している(操作対象となっている)シートを指してしまいます。 シートのCopyやAddで作られたシートは Set ・・=ActhiveSheetというコードで掴むしかありませんが、それ以外はActivesheetという指定は避けた方がいいと思います。 途中で、どのブックのシートか分からなくなったときは、Parentプロパティを使えば、親オブジェクトの名前がわかります。例えば Range("A1").Parent.Name はRange("A1")が属するシート名を WorkSheets(1).Parent.Name はWorkSheets(1)が属するブック名を それぞれ知ることができます。

0

After:=Sheets("シート2") のシート2はどこのブックを想定してますか? 標準モジュールにかかれたプロシジャなら、このシートは、アクティブなブックのシートになります。 WBで参照されるブックがアクティブでないのなら、異なるブックへコピーされますね。 さらに、コピー後は、コピー先に作成されたシートがアクティブになります。手動操作と一緒です。 Set WSz = ActiveSheet で使われている、ActiveSheetはWBのものではないです。 まとめると、あなたのコードが標準モジュールに書かれ、WBで参照されるブックがアクティブでないのなら 以下の動きをします。 1) WBブックのシート1をアクティブなブックのシート2の後ろにコピー 2) コピーされたシートを変数化(WSz) 3) WBブックのシート2を、1)でコピーされたシート(=WSz)の後ろにコピー 4) コピーされたシートを変数化(WSn) となりますね。

0

シートをコピーした後の動作で、set~をアクティブシートじゃなくていいなら。 --------------------------------------- '比較するシートを準備する WB.Sheets("シート1").Copy After:=Sheets("シート2") Set WSz = WB.Sheets("シート2") WB.Sheets("シート2").Copy After:=WSz Set WSn =WB.Sheets("シート3") --------------------------------------- これでどうでしょうか? シートをコピーした場合、アクティブシートになるのはコピーされたシートのはずですので、Set WSz = Activesheetとはコピーされたシート2を指すはずです。 同様にSet WSn = Activesheetとは、コピーされたシート3を指します。 ですので、WSnとして使いたいシートがシート3で合っているなら上記で、そうでないなら、WSnに格納したいシート名を指定してください。 それと、ここ以外で悪さをしている可能性があるので、出来ればコード全体が見れないと、本当にそこが原因かは何とも言えません。

0

>意図しないシートがアクティブになってしまう。 貴方が想定しているアクティブシートは? = Sheets("シート名").Activate ↓ = Sheets("シート名")