- ベストアンサー
Excel VBAを後ろで動かす方法
VBAが書かれたEXCELのブックがあります。これは、一定時間ごとに処理を行います。その間、別のEXCELブックをひらいて、アクティブにしておきます。そして、VBAが書かれたEXCELファイルの一定間隔ごとの処理が呼ばれたときに、エラーメッセージが表示されます。 エラーメッセージ 実行時エラー 1004 RangeクラスのSelectメソッドが失敗しました。 エラー発生箇所 ThisWorkbook.Sheets("シート1").Range("A2:AZ")).Select エラー発生箇所の前に ThisWorkbook.Activate を入れるとエラーが発生しませんが、画面が切り替わってしまいます。 画面が切り替わらずに、処理を続ける方法を教えてください。 宜しくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
回答5、myRangeです。 >Workbooks("20091031.xls")の"20091031.xls"をマクロが実行しているファイルに動的にかえることはできますか、 >ThisWorkbook.Nameは、複数あるとACTIVEなものに変更されてしまいますので 上記の文言では状況がつかみにくいです。 特に、 >ThisWorkbook.Nameは、複数あるとACTIVEなものに変更されて の【複数ある】とは、何が複数? ●何れにしろ、 現在の状況を具体例を挙げて説明した方が回答が付きやすいでしょう。 例えば、 Workbooks("ああ.xls") Workbooks("いい.xls") Workbooks("うう.xls") の3つのブックが開いているとして。 アクティブなブックが、"うう.xls" の時、 裏のブック、"ああ.xls" のマクロを実行したい。 そして、 3ブックともマクロがある、とか、無いとか。。 それぞれのマクロは、どんな処理をするとか (ああ.xlsはSort処理。。) と、まあ、こんな感じで具体例を。 -------------------------------------------------- ま、それらが不明な時点で敢えて回答すると。。 Workbooks("20091031.xls") を ThisWorkbook に変更するだけでいいように思いますが。。。 で、実際にここを変更して試してみたのですか? 以上です。
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 少し割り込みさせていただきます。 >別のEXCELブックをひらいて、アクティブにしておきます。 >そして、VBAが書かれたEXCELファイルの『一定間隔ごとの処理が呼ばれ』たときに、エラーメッセージが表示されます。(『』加筆) その『一定間隔ごとの処理が呼ばれ』とは、何でしょうか? OnTime メソッドなのでしょうか? OnTime なら、 OnTime(EarliestTime, Procedure, LatestTime, Schedule) のLatesstTime で、余裕を持たせるとかすれはよいし、 現在使用しているブックと独立させるなら、CreateObject のオートメーションで、Win側のATコマンドで、WScript で動かせば、コードによっては、ワークブック目の前にブックは現れることもありますが、エラーは発生せずに勝手にマクロは動くはずです。 答えは出ていますが、 >ThisWorkbook.Nameは、複数あるとACTIVEなものに変更されてしまいますので、どうすればよいわかりませんでした。 動いているマクロ側で、そのマクロのThisWorkbook で、ブック・オブジェクトは取得できます。
お礼
『一定間隔ごとの処理が呼ばれ』とは OnTimeメソッドのことです。 はい、エラー回避するばあいは、前面に出すようにします。 ありがとうございました。ThisWorkbookでうまくいきました。
- myRange
- ベストアンサー率71% (339/472)
Key1に指定するRange("B2")が、 どのブックのどのシートのセルか明示してやらないと拙いでしょう。 Workbooks("20091031.xls").Sheets("00").Range("A1:AD" & CStr(数 + 1)).Sort _ Key1:=Workbooks("20091031.xls").Sheets("00").Range("AB2"), _ Order1:=xlDescending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin それから、引数Headerは、xlGuessより、xlYesがいいでしょう。 以上です。
お礼
感謝します。ありがとうございます。 もう一つ教えていただければ幸いですが。 Workbooks("20091031.xls")の "20091031.xls"をマクロが実行しているファイルに 動的にかえることはできますか、 ThisWorkbook.Nameは、複数あるとACTIVEなものに変更されてしまいますので、どうすればよいわかりませんでした。 基本的な質問で申し訳ありませんが、何卒宜しくお願いします。
- DreamyCat
- ベストアンサー率56% (295/524)
Sortの引数を指定しないとエラーになりますが・・・ ・マクロの記録かヘルプで引数を調べて追加してください。 Workbooks("20091031.xls").Sheets("00").Range("A1:AD" & CStr(数 + 1)).Sort 引数
お礼
早速の回答ありがとうございます。 sortの引数は省略してしまいました。 Workbooks("20091031.xls").Sheets("00").Range("A1:AD" & CStr(数 + 1)).Sort Key1:=Range("AB2"), Order1:=xlDescending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin です。 うまくいかせる方法があればよいのですが。
- rivoisu
- ベストアンサー率36% (97/264)
だからExcelのアイコンをダブルクリックして、そこから目的のExcelBookを開くようにすればマクロの動作しているBookから影響を受けることはありません。 マクロの入ったExcelを開くときも同様にすれば先に開いているBookに影響はありません。 これでもエラーがでるなら単独でも出るはずです。
お礼
ご回答の意味わかりました。 操作は、 1.最初のEXCELファイルは、ファイルのダブルクリックで開く 2.EXCELを起動する。 3.新しいEXCELのBook1をクローズする。 4.新しいEXCELから目的のEXCELファイルを開く ですね。 2操作増えるわけですね。 マクロを含んだファイルは、ユーザに配布します。 マクロ等を使って、手間を省く方法はありますでしょうか。 宜しくお願いします。
- DreamyCat
- ベストアンサー率56% (295/524)
単一シート以外の場合は 他のシートや他のBookのことも考慮しないといけないので 面倒な上に難しくもなりますが、 ・Rangeを指定するときにBook名.シート名.Range( ) のように 省略しないで指定する書き方に変更します。 ・また、SelectやActivateを使わない書き方に変更します。
お礼
ご回答どうもありがとうございます。 >・Rangeを指定するときにBook名.シート名.Range( ) のように >省略しないで指定する書き方に変更します。 教えていただいたように、修正しましたが、別のところでエラー(sortメソッドで失敗します。)が発生しました。 Workbooks("20091031.xls").Sheets("00").Range("A1:AD" & CStr(数 + 1)).Sort バックグランドで作業を行う場合、なにか必要な作業がありますでしょうか。お教えください。 宜しくお願いします。
- rivoisu
- ベストアンサー率36% (97/264)
>その間、別のEXCELブックをひらいて この別のExcelブックを開くときにExcelを起動してから開くようにします。 つまり1つのExcelが2つのBookを開くのではなく2つのExcelがそれぞれ1つづつのブックを開くようにすればいいのではないでしょうか。
お礼
まず、一つ目のEXCELを起動したあと、再度EXCELを起動して、マクロを含んだEXCELファイルを「メニュー開く」から開いても、現象は再現しました。 やり方が間違っているのでしょうか。 あと、マクロを含んだEXCELは、先に開くこともありますし、後から開くこともあります。 具体的にはどのよなVBAのコードを書けばよいかわかりません。 基本的な質問とは、思いますが何卒宜しくお願いします。
お礼
ご回答ありがとうございます。 質問の意図ですが、おっしゃるとおりです。 > Workbooks("ああ.xls") > Workbooks("いい.xls") > Workbooks("うう.xls") >の3つのブックが開いているとして。 >アクティブなブックが、"うう.xls" の時、 >裏のブック、"ああ.xls" のマクロを実行したい。 それぞれにマクロが含まれており、裏ブック”ああ.xls”のマクロを 実行したいということです。 ThisWorkbookに変更するだけで大丈夫でした。 ActiveSheetを使用していたため、不具合が発生していたため、 まちがった報告をしていました。 どうもありがとうございます。