[[20110926182925]] 『標準モジュール内のマクロ一括処理』(ki) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『標準モジュール内のマクロ一括処理』(ki)

標準モジュールの中にあるプロシージャの順番で
全てのマクロを処理するような方法はありますか?

Excel2007
Windows Vista


 ん?

 sub すべて処理()
    Call プロシジャ1
    Call プロシジャ2
    Call プロシジャ3
    Call プロシジャ4
    ・
    ・
 End Sub

 こうじゃなく、マクロの実行メニューあたりで、「全部実行」と指定する・・・というのはないので
 上記のようなコードをかいて、それを実行。

 (ぶらっと)

ぷらっとさん

ありがとうございました。

(ki)


ぷらっとさん

すみません。
プロシジャ1のところに具体的に何を入れたらよいか
分かりません。
sub プロシジャ1()までですか
それともend sub までですか。
お手数ですが、教えてください。
宜しくお願いします。

(ki)


 どういう回答が出るか楽しみにしていましたが、
 そういう回答でよかったんですね。

http://www.officetanaka.net/excel/vba/vbe/05.htm

 こういうので module1 内のを全部実行したいのかと思っていました。

 上記のは Sub の後ろの部分だけで、下記のようでも動きます。

 Sub すべて処理()
    プロシジャ1
    プロシジャ2
    :
 End Sub

 Sub プロシジャ1()
    :
 End Sub

 Sub プロシジャ2()
    :
 End Sub
    :

 (Mook)

 標準モジュールに

 Sub ABC()
 ・
 ・
 End Sub

とか

 Sub XYZ()
 ・
 ・
 End Sub

 があったとすると

 Call ABC
 Call XYZ

 なお、Mookさんの回答のように Call の記述なしでもOK。

 追記) ちなみに、Mookさんご紹介の田中さんのサイトの方式は、少なくとも現在の (ki) さんのレベルでは
    参考にしないほうがよろしいかと。

 (ぶらっと)

ぷらっとさん
MOOKさん
ありがとうございました。
ぷらっとさんの方法でやってみましたが、
数あるマクロの内、ひとつのエラーで
一括処理が中断されてしまいました。

先日、MOOKさんにニックネーム(カカ)の名前で
相談させていただいたのですが、
エラーの原因は、おそらくその中の一つのプロシジャです。

下記プロシジャが流れれば上手くいくと思うのですが、
チェックしていただけないでしょうか。

お手数ですが、宜しくお願いします。

Sub マクロC()
'' Columns("G:G").Select

    ActiveSheet.Range("$G$1:$G$7456").RemoveDuplicates Columns:=1, Header:=xlNo

End Sub

Sub マクロD()
Dim i As Long
For i = 1 To 80 ⇐を80でなく、上記に適応したセルの数だけ

    Worksheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = Worksheets("受注一覧表").Cells(1 + i, 7).Value
Next i
End Sub


 >エラーの原因は、おそらくその中の一つのプロシジャです。

 「おそらく」ではなく、エラーでとまったプロシジャは、どれだった?
 それと、その時のメッセージは?
 まさか、コンパイルレベルの構文エラーなんかじゃないんだろうね?

 アップされた マクロC  そのものは 今、手元にXL2003しかないので確認できない。
 マクロD は、
 For i = 1 To 80  ?を80でなく、上記に適応したセルの数だけ
 こうなっているとすれば、このままでは、もちろんエラーだけど・・・

 (ぶらっと)

ぷらっとさん ありがとうございます。

下記、プロシジャの実行中(シート増加中)に「実行時エラー1004」と出て、一括マクロが止まりました。

Sub マクロD() Dim i As Long For i = 1 To 80 ⇐を80でなく、上記に適応したセルの数だけ

    Worksheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = Worksheets("受注一覧表").Cells(1 + i, 7).Value
Next i
End Sub

セルに値がある分だけシートを増やすように修正出来れば、
エラーにならないと思うのですが・・・

(ki)


 ループしながらシートを追加していく時に、この1004が出てしまうケースは多い。
MSの開発者じゃないので、中のロジックの制御コードがどうなっているのかはもちろんわからないけど
VBAコードの処理は基本的に非同期なので、WorkSheets.Add とやっても、その下のコード実行時には
まだ実際にはシートが生成されていないか、あるいは、その逆というか、シートは瞬間的に生成されるけど
その追加されたシートのインデックスが、エクセルに認識される前に、次のコードが実行されるか。
まぁ、そんなあたりだと思っている。

 Worksheets.Add の下に、2行ぐらい 
DoEvents
DoEvents
といれれば、OKになるかもね。

 (ぶらっと)


ぷらっとさん

ダメでした・・・
空白のセル(値のない初めのセル)のところにsheet69となり、
1004のエラーが出てきてしまいます。

(ki)


 >ダメでした・・・空白のセル(値のない初めのセル)のところにsheet69となり、 1004のエラーが出てきてしまいます。 

 シートが見えないのでなんともいえないんだけど・・・
「空白のセル(値のない初めのセル)のところにsheet69」この文章の意味もちょっとわからない。
G2からはじまるG列(G81までかな)には、全て、「ちゃんとしたシート名」が記載されてるんだよね?
シート名を空白でセットしようとすれば、それは1004だけど。そうなの?
ちゃんと値があるところまでのループにするなり、あるいは空白ならスキップするなり必要なんじゃない?
「を80でなく、上記に適応したセルの数だけ 」このコメント、前スレで回答者さんから提示されたものだと思うけど
これに対しては、どう考えている?

 (ぶらっと)

ぷらっとさん
ありがとうございます。
説明が悪く、申し訳ありません。
Gからはじまる列は、csvデータから引っ張ってくるので、
毎回数字が違うのです。
ただし、80は、絶対に超えないので80までループとしました。
Sheet69とあるのは、G68までセルに客先名が入っていたからです。

先ほど、自分なりに考えてみましたが、
目的は、マクロの一括処理ということなので、
「エラーが出ても処理を実行継続するコード」でも良いのではないかと思い、

他のサイトから、下記のような構文を探してやってみたところ、
上手くいきました。

Sub マクロD()
Dim i As Long
For i = 1 To 80

  On Error GoTo ErrorRoutine
Worksheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = Worksheets("受注一覧表").Cells(1 + i, 7).Value

Next i
ErrorRoutine:

    MsgBox "エラーが発生しました"
Exit Sub

End Sub

ちゃんと値があるところまでのループにするなり、あるいは空白ならスキップするなり必要なんじゃない?
→この方法が分からなくて相談させていただきました。初心者につき、この命令を実行する文がありましたら
教えていただきたく、宜しくお願いします。
(ki)


 今回はうまくいったかもしれませんが、シートを多数コピーすると 1004 のエラーに
 なるのはわりとよく聞く質問です。
http://support.microsoft.com/kb/210684/ja
 MS のページが誤訳されていますが、1004 はエラーコードのことですね。

 定期的に 保存して閉じて再度開く処理をするか、シートをテンプレート化して読み込む
 かが対策のようです。
 この学校でも何度か話題になっているので、過去ログが参考になると思います。
 (Mook)

mookさん
ありがとうございます。

今後ともよろしくお願いします。

(ki)


 >他のサイトから、下記のような構文を探してやってみたところ、上手くいきました。

 感心しない。エラートラップは回避できない時に使うべきで、最初から想定されているなら
 エラーが発生しないコードを書くべき。

 >この方法が分からなくて相談させていただきました

 たとえばの例。2つほど。

 Sub マクロD_その1()
    Dim i As Long
    Dim z As Long

    z = Worksheets("受注一覧表").Range("G2").End(xlDown).Row

    For i = 2 To z
        Worksheets.Add After:=Sheets(Sheets.Count)
        DoEvents 'Just In Case
        ActiveSheet.Name = Worksheets("受注一覧表").Cells(i, "G").Value
    Next

 End Sub

 Sub マクロD_その2()
    Dim i As Long
    Dim c As Range

    For Each c In Worksheets("受注一覧表").Range("G2", Worksheets("受注一覧表").Range("G2").End(xlDown))
        Worksheets.Add After:=Sheets(Sheets.Count)
        DoEvents 'Just In Case
        ActiveSheet.Name = c.Value
    Next

 End Sub

 (ぶらっと)

 コードの内容を理解しないと、解決したつもりになってしまうという例かもしれませんが、
 ki さんの見つけたたコードはエラーが起きることを何も回避していなくて、エラーが起きた
 時にシステムのエラーメッセージの変わりに、MsgBox を表示するというだけのものです。
 エラーが起きなかったのはたまたまで、まだ起きる可能性は残っています。

 ですが今回のケースがもし EXCEL の内部的な問題に起因するのであれば、コード上での
 検出は難しいと思います。
 (Mook)

ぷらっとさんmookさん

お二方とも、本当にありがとうございました。
上記いただいたコードで上手くいきました。

まだまだ初心者ですが、これから精進したいと思います。

また、宜しくお願い致します。

(ki)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.