[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『標準モジュール内のマクロ一括処理』(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さんにニックネーム(カカ)の名前で
相談させていただいたのですが、
エラーの原因は、おそらくその中の一つのプロシジャです。
下記プロシジャが流れれば上手くいくと思うのですが、
チェックしていただけないでしょうか。
お手数ですが、宜しくお願いします。
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でなく、上記に適応したセルの数だけ 」このコメント、前スレで回答者さんから提示されたものだと思うけど これに対しては、どう考えている?
(ぶらっと)
先ほど、自分なりに考えてみましたが、
目的は、マクロの一括処理ということなので、
「エラーが出ても処理を実行継続するコード」でも良いのではないかと思い、
他のサイトから、下記のような構文を探してやってみたところ、
上手くいきました。
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)
今後ともよろしくお願いします。
(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)
お二方とも、本当にありがとうございました。
上記いただいたコードで上手くいきました。
まだまだ初心者ですが、これから精進したいと思います。
また、宜しくお願い致します。
(ki)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.