• ベストアンサー

Excel VBAを後ろで動かす方法

VBAが書かれたEXCELのブックがあります。これは、一定時間ごとに処理を行います。その間、別のEXCELブックをひらいて、アクティブにしておきます。そして、VBAが書かれたEXCELファイルの一定間隔ごとの処理が呼ばれたときに、エラーメッセージが表示されます。 エラーメッセージ  実行時エラー 1004  RangeクラスのSelectメソッドが失敗しました。 エラー発生箇所  ThisWorkbook.Sheets("シート1").Range("A2:AZ")).Select エラー発生箇所の前に ThisWorkbook.Activate を入れるとエラーが発生しませんが、画面が切り替わってしまいます。 画面が切り替わらずに、処理を続ける方法を教えてください。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.6

回答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 に変更するだけでいいように思いますが。。。 で、実際にここを変更して試してみたのですか? 以上です。

ytommy007
質問者

お礼

ご回答ありがとうございます。 質問の意図ですが、おっしゃるとおりです。 >  Workbooks("ああ.xls") >  Workbooks("いい.xls") >  Workbooks("うう.xls") >の3つのブックが開いているとして。 >アクティブなブックが、"うう.xls" の時、 >裏のブック、"ああ.xls" のマクロを実行したい。 それぞれにマクロが含まれており、裏ブック”ああ.xls”のマクロを 実行したいということです。 ThisWorkbookに変更するだけで大丈夫でした。 ActiveSheetを使用していたため、不具合が発生していたため、 まちがった報告をしていました。 どうもありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。 少し割り込みさせていただきます。 >別のEXCELブックをひらいて、アクティブにしておきます。 >そして、VBAが書かれたEXCELファイルの『一定間隔ごとの処理が呼ばれ』たときに、エラーメッセージが表示されます。(『』加筆) その『一定間隔ごとの処理が呼ばれ』とは、何でしょうか? OnTime メソッドなのでしょうか? OnTime なら、 OnTime(EarliestTime, Procedure, LatestTime, Schedule) のLatesstTime で、余裕を持たせるとかすれはよいし、 現在使用しているブックと独立させるなら、CreateObject のオートメーションで、Win側のATコマンドで、WScript で動かせば、コードによっては、ワークブック目の前にブックは現れることもありますが、エラーは発生せずに勝手にマクロは動くはずです。 答えは出ていますが、 >ThisWorkbook.Nameは、複数あるとACTIVEなものに変更されてしまいますので、どうすればよいわかりませんでした。 動いているマクロ側で、そのマクロのThisWorkbook で、ブック・オブジェクトは取得できます。

ytommy007
質問者

お礼

『一定間隔ごとの処理が呼ばれ』とは OnTimeメソッドのことです。 はい、エラー回避するばあいは、前面に出すようにします。 ありがとうございました。ThisWorkbookでうまくいきました。

全文を見る
すると、全ての回答が全文表示されます。
  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

  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がいいでしょう。 以上です。  

ytommy007
質問者

お礼

感謝します。ありがとうございます。 もう一つ教えていただければ幸いですが。 Workbooks("20091031.xls")の "20091031.xls"をマクロが実行しているファイルに 動的にかえることはできますか、 ThisWorkbook.Nameは、複数あるとACTIVEなものに変更されてしまいますので、どうすればよいわかりませんでした。 基本的な質問で申し訳ありませんが、何卒宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.4

Sortの引数を指定しないとエラーになりますが・・・ ・マクロの記録かヘルプで引数を調べて追加してください。 Workbooks("20091031.xls").Sheets("00").Range("A1:AD" & CStr(数 + 1)).Sort 引数

ytommy007
質問者

お礼

早速の回答ありがとうございます。 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)
回答No.3

だからExcelのアイコンをダブルクリックして、そこから目的のExcelBookを開くようにすればマクロの動作しているBookから影響を受けることはありません。 マクロの入ったExcelを開くときも同様にすれば先に開いているBookに影響はありません。 これでもエラーがでるなら単独でも出るはずです。

ytommy007
質問者

お礼

ご回答の意味わかりました。 操作は、 1.最初のEXCELファイルは、ファイルのダブルクリックで開く 2.EXCELを起動する。 3.新しいEXCELのBook1をクローズする。 4.新しいEXCELから目的のEXCELファイルを開く ですね。 2操作増えるわけですね。 マクロを含んだファイルは、ユーザに配布します。 マクロ等を使って、手間を省く方法はありますでしょうか。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.2

単一シート以外の場合は 他のシートや他のBookのことも考慮しないといけないので 面倒な上に難しくもなりますが、 ・Rangeを指定するときにBook名.シート名.Range( ) のように 省略しないで指定する書き方に変更します。 ・また、SelectやActivateを使わない書き方に変更します。

ytommy007
質問者

お礼

ご回答どうもありがとうございます。 >・Rangeを指定するときにBook名.シート名.Range( ) のように >省略しないで指定する書き方に変更します。 教えていただいたように、修正しましたが、別のところでエラー(sortメソッドで失敗します。)が発生しました。 Workbooks("20091031.xls").Sheets("00").Range("A1:AD" & CStr(数 + 1)).Sort バックグランドで作業を行う場合、なにか必要な作業がありますでしょうか。お教えください。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

>その間、別のEXCELブックをひらいて この別のExcelブックを開くときにExcelを起動してから開くようにします。 つまり1つのExcelが2つのBookを開くのではなく2つのExcelがそれぞれ1つづつのブックを開くようにすればいいのではないでしょうか。

ytommy007
質問者

お礼

まず、一つ目のEXCELを起動したあと、再度EXCELを起動して、マクロを含んだEXCELファイルを「メニュー開く」から開いても、現象は再現しました。 やり方が間違っているのでしょうか。 あと、マクロを含んだEXCELは、先に開くこともありますし、後から開くこともあります。 具体的にはどのよなVBAのコードを書けばよいかわかりません。 基本的な質問とは、思いますが何卒宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBAでの質問です。

    エクセル2003での質問です。 book1のシート1からbook2のシート18セルC30へ 表のコピーを行い、C30が空白セルだったらそのまま貼り付け、 非空白だったら表最下部から2行あけて表のコピー操作を行う。 としたいのですが以下の箇所でエラーがでてしまいます。 book1.Activate sheet1.Range("C8:E24").Copy book2.Activate If sheet18.Range("C30") = "" Then sheet18.Range("C30:E46").Select Selection.PasteSpecial.xlPasteValues ←実行時エラー424発生 Else sheet18.Range("C30").End(xlDown).Offset(2).Select Selection.PasteSpecial.xlPasteValues ←実行時エラー424発生 End If 以上、解決策をご教示願います。

  • Excel VBAでの初期設定

    Excel VBA 初心者です。Excelは2013です。VBAでBookを開いたときにあるシートの初期設定をしたいと考えています。Activateイベントを使おうと思いましたがイベントが発生しないことがあるため質問しています。 例として以下のようなコードを記述したとき、sheet1以外を開いて保存している場合にはActivateイベントは発生しますが、sheet1を開いて保存している場合にはイベントが発生しないため初期設定の処理ができませんでした。 対応方法をお分かりの方ご教授いただけないでしょうか。 ============================= '"以下をThisWorkbook"に記述 Private Sub Workbook_Open() '②Worksheets("sheet2").Activate も入れれば Activateイベントは発生する Worksheets("sheet1").Activate '①もともと sheet1がActiveで保存されていた場合、Activateイベントは発生しなかった End Sub ============================= '"以下をsheet1"に記述 Private Sub Worksheet_Activate() '初期設定処理 MsgBox "sheet1の初期設定をしました" End Sub ============================= 宜しくお願いします。

  • Excel VBAでセル範囲のコピー、貼り付け方法

    VBA初心者です。 今、Excel VBAでセル範囲を他のBookからコピーして張り付けるマクロを記述を次のように ThisWorkbook.Worksheets(2).Range(Cells(203 + ki, 5), Cells(203 + ki, 7)) = wkd.Worksheets(3).Range("M82:082") 書くとエラーになってしまいます。 セルが範囲でなくて、1つだとうまくいくのですが、範囲にするとエラーになってしまいます。 どうしたら、解決できますか、できるだけ簡単な記述でお願いします。

  • Excel VBA 指定シートの取込

    こんにちは。 ExcelのVBAを使用して、異なるBookのシートを取込みたいのですが、 シートが無かった場合の処理方法がわかりません。 現在のコードは下記の様になっております。 With Workbooks.Open"BOOK1.xls" .Worksheets("Sh1").Cells.Copy ThisWorkbook.Sheets("Sheet1").Range("A1") .Worksheets("Sh2").Cells.Copy ThisWorkbook.Sheets("Sheet2").Range("A1") .Worksheets("Sh3").Cells.Copy ThisWorkbook.Sheets("Sheet3").Range("A1") .Close End With Book1に指定したシートが無い場合、何もしないようにしたいのですが、 どの様に書き換えれば宜しいでしょうか? よろしくお願いします。

  • エクセルVBA

    VBAの素人です。 以下のようなVBAを実行しようと、何とか形にしました。 単独のBOOKではうまくいくのですが、同時に他のBOOKを開くと 「インデックスが有効範囲にありません」とエラーになります。 エラー箇所は、With Sheets("Sheet1").Range("B1")部分です。 修正をご教示頂ける方、何卒よろしくお願い致します。 全くVBA無知なのにすみません。 Private Sub Workbook_Open() test01 test02 Application.OnTime Now + TimeValue("00:10:00"), "終了" End Sub Sub 終了() Application.OnTime Now + TimeValue("0:00:02"), "test01", , False ThisWorkbook.Close Savechanges:=False Application.Quit End Sub Sub test01() With Sheets("Sheet1").Range("B1") .Value = Time .NumberFormatLocal = "mm:ss" End With Application.OnTime Now + TimeValue("0:00:02"), "test01" End Sub Sub test02() With Sheets("Sheet1").Range("B2") .Value = Time .NumberFormatLocal = "mm:ss" End With End Sub

  • VBAでの " の使い方をお教え下さい

     ThisWorkbook.SaveAs Filename:="C:???.xlsm"(???はファイル名です)をVBAの式に直す方法をお教えください。なお、???はセルを参照することにしています。具体的にはRange("O1")です。  ThisWorkbook.SaveAs Filename:="""C:" & "Range(""O1"").xlsm"""とすると、ファイル名に : は使えないというエラーメッセージが出ました。  " の使い方が分かりづらく、悩んでいます。正しい使い方はどのように考えれば良いかも教えていただければ幸いです。よろしくお願いします。

  • 異なるブック間でのセル範囲のコピー/VBA

    異なるブック間でクリップボードを経由せず直接コピーしたいため 下記のマクロを記述していますが、実行エラーが発生します。 どうしてでしょうか。 ThisWorkbook.Worksheets(3).Range(Cells(3, 1), Cells(3 + a, 1)).Value = Workbooks("excel.xls").Worksheets(1).Range(Cells(11, 3), Cells(11 + a, 3)).Value (補足) (1)VBA実行中のThisWorkbook、excel.xlsは別のブック ですが、同じフォルダにあります。 (2)aは数値が入る変数です。

  • エクセルVBAの変数利用

    シートのC1セルに入力したブック名をアクティブにするための 変数なのですが、アクティブになりません。 下のようにしていますが、とのようにすればよいでしょうか? Sub test() Dim FileName As Range FileName = ThisWorkbook.Path & "\" & Sheets("sheet1").Range("C1") & ".xls" Workbooks.FileName.Activate End Sub

  • Excel VBA

    今、Excel2000で作成したEXcelブックをExcel2007でも正常に動作するか確認しています。 伝票のようなもので、枠内に数字を記入後、保存する際に別のブックにセルの全コピーしてから保存するようになっているのですが、Excel2007で実行すると列幅と行幅がコピーされません。 Set NewBook = Workbooks.Add Workbooks(ThisWorkbook.Name).Sheets("伝票").Cells.Copy NewBook.Sheets("Sheet1").Activate ActiveSheet.Paste Excel2003で動かしたときは、大丈夫でした。 原因がわかりません。コピーの仕方がいけないのでしょうか。

  • Excel VBA ブック内にエラーがあるかないか

    Excel VBA で、ある特定のセルが#REFなどのエラーになっているかどうかは If IsError(ThisWorkbook.Worksheets("Sheet1").Range("AB1256")) Then  MsgBox ("ファイルのデータが壊れています") End If というように、IsError()関数を使えば確認できます。 また、あるセル範囲の中にエラーになっているセルがあるのかどうかも、For文やFor Each文で順番にチェックしていけばできると思いますが、 シート全体、さらにはブック全体の中で、エラーになっているセルがあるのかないのかを簡単にチェックする方法はないでしょうか。エラーになっているセルは特定できなくてもいいです。 よろしくお願いします。(Windows7 , Excel2010)