10秒目をつむったら…

処理の度にシート数が変わるブックで同じマクロを繰り返したいのですが、すべてのシートを選択してマクロを実行したところマクロに範囲指定→ソートの部分があり、処理が止まってしまいます。そこでDo~Loopを使用して順番にマクロを処理していこうと思うのですが、マクロを止める構文がよく解りません。
VBA初心者なものでいろいろ調べて以下のようなものを考えてみたのですがエラーになってしまいます。どなたかお助けください。

Do Until ActiveSheet.Previous.Is Nothing
Application.Run "PERSONAL.XLS!Macro101"
ActiveSheet.Previous.Activate
Loop
End Sub

A 回答 (2件)

Dim ws As Worksheet



For Each ws in Worksheets
Application.Run "PERSONAL.XLS!Macro101"
ws.Previous.Activate
Next

違うかな?

この回答への補足

ご回答誠にありがとうございました。上記の記述で走らせたところ
ws.Previous.Activateのところで止まってしまうので下記の様に変更したところうまくはしりました。かなり感動しました。(^_^)

Dim ws As Worksheet

For Each ws In Worksheets
Application.Run "PERSONAL.XLS!Macro101"
ws.Next.Activate
Next

ついでと言っては何なのですが、最後まで処理が走ったところで
「実行時エラー”91”
オブジェクト変数またはWithブロック変数が設定されてません」と表示されます。このエラーを発生させないためにはどのように記述を修正したらよいのでしょうか。大変恐縮ですがよろしくご指導お願いいたします。

補足日時:2008/08/15 10:43
    • good
    • 0

こんにちは。



質問のコードは、コード全体をみないと手が付けられないと思います。

>Application.Run "PERSONAL.XLS!Macro101"

いちいち、ループして、別のブックのマクロオブジェクトを呼び出しているわけですね。

参照設定されているなら分かるけれども、「PERSONAL.XLS」 のマクロをRunで呼び出すのは、ちょっと考えられません。通常、PEROSNAL.XLS にあるマクロは、特殊なものを除けば、単独で使うものがほとんどです。そのDo--While のループのマクロの本体はどこにあるのでしょうか?
そのモジュールに、別途、コードを書けばよいのではありませんか。

もし、それが、マクロ・モジュールとして使うなら、最初から、アドインにするか、そのマクロ全体を、「PEROSNAL.XLS」に入れればよいと思います。Run で呼び出しても、結局、呼び出しの対象は、オブジェクトになっているので、ループでは、タイミングが悪いです。

本来、Run で呼び出すマクロは、一般ユーザーが手を加えていけないようなものに対して行いますから、恣意的に、Run を使うわけではありません。

>処理の度にシート数が変わるブックで同じマクロを繰り返したいのですが、

という意味が、マクロからは分かりません。

 ActiveSheet.Previous Is Nothing (.コンマは取りました)

という意味は、シートのIndex が、「1」 という意味です。
つまり、

 ActiveSheet.Previous.Activate

というのなら、シートの最後から遡っていけば、成立するという意味だと思います。

コードで明示的に書くと、
 For i = ActiveWorkbook.ActiveSheet.Index To 1 Step -1

ということです。実際、これは、ActiveWorkbook のシートの全部をループするマクロではありません。
通常は、
For Each ws In ActiveWorkbook.Worksheets で、全部のシートをループします。Next もPrevious でも必要はありません。ws に自動的に、格納されています。

>マクロに範囲指定→ソートの部分があり、処理が止まってしまいます。

というのは、もともと、該当する部分にデータがないのか、全体にデータがないのかどちらかだと思います。

例えば、
If ActiveSheet.UsedRange.Cells.Count =1 Then

なら、シートのデータは、1つか、何もないか、どちらかという意味ですし、
WorksheetFunction.Count(ActiveSheet.Cells)
なら、何にもないかどうかはチェックできます。

それから、
>For Each ws In Worksheets
>Application.Run "PERSONAL.XLS!Macro101"
>ws.Next.Activate
>Next

このマクロの意味が分からないです。「"PERSONAL.XLS!Macro101"」の内容が分からないから何もはっきりしたことはいえないけれども、そのまま読めば、シートを一つ置きにという意味になるし、ワークシートが最後(wsに格納される)に来たとき、論理的にActivate しますから、エラーが出ます。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。今年から始まった特定健診の電子データ化でデータを受け取る側の仕事をしており、データがCSVではなくXMLで送られてくることがオールジャパンで決められており、急遽XMLとVBAの勉強が課せられてアップアップの日々です。XMLをVBAで加工しているのですが、健診1件につきXMLファイルが1個となるため健診機関から報告の度にシート数が違ってしまうのです。
ご指摘の通り細かいマクロを束ねて一つのマクロにしています。内容を整理してひとつのマクロにして再度チャレンジしてみます。
今回はありがとうございました。

お礼日時:2008/08/15 22:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報