• ベストアンサー

エクセルのマクロで

いつもお世話になっております。 エクセル2000ですが、 別のファイルを開いて、そのファイル上で マクロを実行させるときは、 orkbooks.Open Filename:= _   "◆◆◆.xls" '以下実行させるマクロの記述 '(例)◆◆◆上に、データをペーストとか としていますが、 ◆◆◆を別の作業で開いたままですと、 当然この上記マクロが動いてくれなくなってしまいます。 そこで、 1:◆◆◆が開いているかどうか判定する。 2:開いていれば◆◆◆をアクティブにしてマクロ実行 3:開いていなければ、◆◆◆を開いてマクロ実行  とするためには、 どのように記述したらよろしいでしょうか? わかりづらければ、補足しますので、 よろしくお願いします。

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

  • ベストアンサー
回答No.4

おはようございます。ゆっくり考えたところ大きなミスに気付きました。 私のマクロは、絶対に動きません。 そもそもFor each Nextは、この場合立ち上がっているファイルすべてに動作してしまいます。4個のファイルが立ち上がっていたとして説明させていただきます。 エクセルは、ファイルを複数開いた場合、開いた順番に番号が自動的に振られます。私が最初に書いたコードを実行すると、まず最初に開かれたブックの名前を取得してもしAというブックだったらAをActivateし、違っていたらAを開きにいきます。これを4回繰り返してしまうのです。ですから、あなた様のおっしゃられたような警告メッセージが出てしまったのです。 結論から申し上げますと、Aファイルが開いているかどうかを確認するためには、あなた様が書かれたようにまずFor each NextでまずAファイルが開いているかどうか確認し、If文で書くしか方法はありません。このような基本的なミスを2度もしてしまい、誠に申し訳ございませんでした。穴があったら入りたい心境です。深くお詫び申し上げます。 後、コピー・ペーストの方法ですが、あなた様が書かれた方法もありますが、私の書いた方法の方が行数が少なくてすむかと思います。また、本の知識の受け売りですが、あなた様の書かれた方法は、クリップボードを経由してペーストされるのですが、私の書いた方法はクリップボードを経由せずにペーストされるため、メモリーの消費量が少なくて済むそうです。 他の気がついた点につきましては、#3で書かせていただきました。こんな私でよろしければ、また解らないことがありましたらお知らせ下さい。次回はこのようなことがないように、注意を払い一緒にに考えていきたいと思います。 1日も早くあなた様のシステムが無事完成されますことを心からお祈り申し上げます。

oresama
質問者

お礼

kazuhiko5681さん 本当にご丁寧なご回答・ご説明ありがとうございました。 ほぼ#2の方の回答で解決していたのですが、 より一層の理解を深めることができました。 コピペの方法も教えていただきありがとうございました。 また何かありましたら、よろしくお願いします。

その他の回答 (3)

回答No.3

お返事が遅くなり申し訳ございませんでした。変な動きをしたのは私のマクロの記述ミスです。申し訳ございませんでした。 下記にあなた様がおやりになろうとしているサンプルマクロを記述しておきます。 sub dim myBook as workbook 'カーソルを砂時計に Application.Cursor = xlWait '画面を更新しない Application.ScreenUpdating = False If myBook.Name = "◆◆◆.xls" Then Workbooks("◆◆◆.xls").Activate exit sub Else Workbooks.Open Filename:="◆◆◆.xls" End If Next 前回は、ブックが開いている時に、このるーぷから抜けなかったために◆◆◆.xlsは2重に開かれます云々という警告が出てしまったのです。 workbooks("ブック名.xls").worksheets("シート名").range("E1:I1).copy _ destination:=workbooks("ブック名.xls").worksheets("シート名").range("E300) これを書くだけでE1からI1のデータをE300からI300にコピー・ペーストできます。 Application.CutCopyMode = False workbooks("ブック名.xls").close SaveChanges:=true 何も保存して閉じなくてもこの1行で保存してそのブックを閉じることができます。もし保存しないで終了する時は、SaveChanges:=Falseと書けばいいのです。 workbooks("ブック名).Activate workbooks("ブック名").worksheets("シート名").Range("A6").Select A6を選択する場合、そのブックが選択されていなければエラーが出てしまいます。このように書けば、どんな場合でもエラーを出さずに選択することができます。 Application.ScreenUpdating = True Application.Cursor = xlDefault End Sub これであなた様のやりたいことが正常に動作すると思います。

回答No.2

#1さんの補足 dim myBook as workbook open_flg = 0:'オープンされている場合 1:に変更 for each mybook in workbooks if mybook.name = "◆◆◆.xls" then open_flg = 1 exit for end if next if ( open_flg = 0 ) then 'openされていない workbooks("◆◆◆.xls").activate else 'openされている workbooks.open filename:="◆◆◆.xls" end sub としないと、ブックを3個以上開いているとき、 ◆◆◆.xls以外のブックが2個出てきてしまい、OPEN を2度してしまい エラーになるのだと思います。

oresama
質問者

お礼

ご回答ありがとうございました。 お蔭様で、解決となりました。 大変参考になりました。

oresama
質問者

補足

ありがとうございます。 やはり、2コ目のIFに対するEnd Ifが無いといわれ、 最後にEnd Ifを足し、 かつ workbooks.open filename:="◆◆◆.xls" と workbooks("◆◆◆.xls").activate を入れ替えて、 どうやらうまくいったようです。 結局、 Dim myBook As Workbook open_flg = 0: 'オープンされている場合 1:に変更 For Each myBook In Workbooks If myBook.Name = "◆◆◆.xls" Then open_flg = 1 Exit For End If Next If (open_flg = 0) Then 'openされていない Workbooks.Open Filename:="◆◆◆.xls" Else 'openされている Workbooks("◆◆◆.xls").Activate End If という形になりました。

回答No.1

はじめまして。 sub test dim myBook as workbook for each mybook in workbooks if mybook.name = "◆◆◆.xls" then workbooks("◆◆◆.xls").activate else workbooks.open filename:="◆◆◆.xls" end sub 実行するマクロの前にこのマクロを書けばよろしいかと思います。 もし、不具合がありましたらご遠慮なくお知らせ下さい。あなた様のおやりになりたいことが実現するまで私でよろしければご一緒に考えて生きたいと思います。

oresama
質問者

補足

kazuhiko5681さん、 心強いお言葉ありがとうございます。 最初に確認したいのですが、 Sub test End Sub はいらないですよね? 早速やってみましたが・・・ まず、 End IF が無いとエラーがで、 それを追加したら、 NEXTが無いといわれたので、 workbooks.open filename:="◆◆◆.xls" の後に、 End If Next と入れました。 すると、 ◆◆◆.xlsは2重に開かれます云々 という警告がでました。 「はい」で実行したところ、 実行はされていました。 2重に~にならないようにするにはどうすればいいでしょうか? 現状マクロは、 Sub ' 'カーソルを砂時計に Application.Cursor = xlWait '画面を更新しない Application.ScreenUpdating = False ' Dim myBook As Workbook For Each myBook In Workbooks If myBook.Name = "◆◆◆.xls" Then Workbooks("◆◆◆.xls").Activate Else Workbooks.Open Filename:="◆◆◆.xls" End If Next ' Range("E1").Select Range("E1:I1").Select Selection.Copy Range("E300").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False ActiveWorkbook.Save ActiveWindow.Close Range("A6").Select Application.ScreenUpdating = True Application.Cursor = xlDefault End Sub  こんな感じです。 ご助言いただけますでしょうか?

関連するQ&A

  • Excelマクロについて

    Excelマクロ(VBA)で複数のExcelファイルを一括で処理するプログラムを作っているのですが、処理対象のExcelファイルにはマクロが記述されていて、Excelを開く毎に記述のマクロが動いてしまいます。 対象のExcelファイルをオープンする時に、マクロを無効にして開くすることは可能でしょうか? 今現在、Excelファイル開く時に使ってる命令は、 Workbooks.Open Filenameです。

  • エクセルファイルの一括変換処理【マクロ?】

    こんにちは。 複数のエクセルファイルに、同じ処理を一括で行う方法について質問いたします。 現在フォルダの中に、県別に分かれた47個のエクセルファイルがございます。 --イメージ-------------------   北海道.xls   東京.xls   愛知.xls   大阪.xls    :   沖縄.xls ---------------------------- これらを使いやすくするために、現在以下の処理を行っています。 1)ファイル名を同じ法則性をもって変更する  (例:北海道.xls→「北海道3月実績」/沖縄.xls→「沖縄3月実績」) 2)同じ書式に変更する  (例:「北海道3月実績」の書式(罫線・列幅・フォント等の設定)をコピーし、     他の47ファイルを開き、『書式の貼り付け』で47回ペースト) 3)同じマクロを実行する  (例:エクセルファイルを開き、既存マクロ(改ページを自動挿入するマクロ)を     実行する作業を47回行う) 上記の単純作業を毎月毎月、47回行わなくてはなりません・・・。 簡単な作業ではありますが、時間がかかりますし、やっていく中でミスも発生いたします。 1つの同じフォルダに格納されたファイルに全く同じ作業をしていくので マクロか何かで自動化できないものか、と思案中です。 ■自動化がそもそも可能なのか? ■可能であればどうやったらできるのか? アイデアや知識をお持ちの方がいらっしゃいましたら 教えていただければ大変うれしく思います。 どうぞよろしくお願いいたします!!

  • VBA マクロ付きExcelファイルを無効で開く

    タイトルの通り、マクロを含むExcelファイルを、マクロ無効でオープンしたいのですが、そういうことは出来るでしょうか? 新規ファイル作成.xlsというマクロがあって、temp.xlsというマクロを含んだファイルをnew.xlsというファイル名でコピーし、それをオープンしてデータを追加して終了。 次にそのnew.xlsをオープンした時にはtemp.xlsに含まれるマクロが実行される・・・ というようなことをしたいと思っています。 もしくは新規ファイル作成.xlsのマクロから、直接new.xlsのファイルにコーディングが可能であれば、それでも良いのですが・・・ データベースから表を作成し、作成後の変更データを再度データベースへ戻す、ということがやりたいのですが、上記の方法しか思いつきません。 もし上記の方法が出来ない場合は、別の方法がありますでしょうか? どなたかアドバイス、よろしくお願いします。

  • エクセルマクロでマクロをアクティブにしたくない

    エクセルのマクロをひとつの「マクロA」という名前で、データーファイルからセルに入っている内容などを呼び出しながらまくろAのシートにデーターを貼り付けながら作業をしています。 Workbooks.Open Filename:= _ "C:\Documents and Settings\owner\My Documents\マクロ.xls" Application.Run "マクロ.xls!マクロ" と記載すると、マクロXLSがアクティブになってしまいます。 その為記載に'ActiveWindow.WindowState = xlMinimized と入れたりするのですが、アクティブになるシートがマクロ以外にうまくいかないことがあるのです。 データーシートは、毎回データーが変わる関係で、DATA.xlsがAのときやBのときが発生します。

  • エクセル VBA マクロを動かしたときに元々開いているファイルを閉じる・・・

    いつも皆様には大変お世話になっております。 早速質問ですが、 「もしこのマクロが動く時点で他のExcelファイルが開いていたら、警告の上 自ファイルを閉じる、開いていなければ~実行」 という処理をかませたいと思っております。 ここの判定の方法がわかりません。(既にExcelが起動されていたら、でもいいのでしょうか。。。?) 下記のようなマクロを組んでいるので 他のファイルが開いていると厳しい状況です。 bname = "C:\" & Format(Range("q1").Value, "yyyymmdd") & "サンプル" & ".xls" ActiveWorkbook.SaveAs bname Workbooks.Open "C:\サンプル.xls" Workbooks(1).Close 本当は"yyyymmdd"&"サンプル"&".xls"ファイルだけ閉じられればいいのですが、自分の知識では上記のような形でしか動かせません;; もしご存知の方、ご教示ください。よろしくお願いします

  • Excelマクロの命令文を教えてください。

    EXCEL2002です。現在Access2002に簡単なマクロを作りAccessよりExcelで作った000.xlsを開いてます。その000.xlsに下記のようなマクロを入れて実行し目的を果たしています。 Sub LROpen() ChDir "D:\EXCEL\LRTotal" myfile = Application.GetOpenFilename Workbooks.Open Filename:=myfile End Sub 本当はAccessからいっぺんに上記マクロのEND SUBまで行きたい所ですが私の力では無理なのでこのように段階的になってます。質問はこの上記マクロが張ってある000.xlsが開いたとき自動的にマクロが実行される様にする方法があるかお尋ねする次第です。宜しくお願いします。

  • エクセルVBAでの呼出操作をマクロ化するには?

    エクセルVBAでの呼出操作をマクロ化するには? エクセル2000です。宜しくお願いします。 VBAで、ファイルを呼び出したいのですが、Workbooks.openの書き方が良く分かりません。 呼び出すファイル名は決まっていなくて、フォルダ名は固定です。 エクセルの操作で言うと、ファイルを開くを押して、フォルダを選ぶとこまでをマクロかしたいのですが。 例えば、ドライブDの「作業用」フォルダを開きたい場合は、どう記述すれば宜しいでしょうか? 基礎的な部分でお恥ずかしいのですが、以下で実行しても動かんのです。 ChDir "D:\作業用" Workbooks.OpenText Filename:= "D:\作業用\*.*"

  • エクセルVBA

    こんばんは! エクセルマクロ初心者です。 エクセルVBAについて教えてください! パス(?)を指定して、ファイルを開けてから実行する マクロを書きたいのですが、エラーになってしまいます。 Dim Filename as string (1)Workbooks.Open Filename:= "\D\MyDocument\●●.xls" (●●はファイル名) (2)Workbooks("●●").Activate (1)の部分は実行されて目的のファイルは開くのですが(2)でエラーになってしまいます。 どなたか教えてください! 以前までは、このマクロ実行できていたのですが、突然できなくなりました。 困ってます。

  • VBA_マクロ内でマクロ実行

    独学でVBAをやってる初心者です。 よろしくお願いします。 EXCEL2003を使ってます。 例) <A.xlsファイル> Sub File_A () Workbooks.Open Filename:="B" Call File_B Range("A1").Select Selection.Paste End Sub <B.xlsファイル> Sub File_B () Range("A2:T5").Select Selection.Copy End Sub A.xlsファイルを開きマクロFile_Aを実行させると B.xlsファイルのマクロFile_Bを実行することができません。 どうしたらうまく実行できますか? 教えてください。

  • 【Excel2003】マクロの実行

    お世話になります。 フォルダー内全てのエクセルファイルに、あるマクロを実行したいのですが可能でしょうか? 例としましては フォルダー「変更ファイル」 以下中にあるファイル ------------------------ ファイル「A.xls」 ファイル「B.xls」 ファイル「C.xls」 ファイル「マクロ.xls」←ソートを行うマクロ入り ------------------------ 「変更ファイル」フォルダー内の「マクロ.xls」を実行してA,B,Cファイル(フォルダー内全てのファイル)内データーを各ファイル毎ソートしたい。 この作業はマクロ.xlsのマクロをカスタマイズしてすることは可能でしょうか? 可能ならやり方を教えてください。 お願いいたします。

専門家に質問してみよう