[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロの入っているエクセルだけを終了させたい』(みーとん) Excel 2003, Windows XP
いつも参考にさせていただいております。 共有フォルダ内にある「一ヶ月経過したPDFファイルのみを削除」するマクロを作りました。 ファイルを開くと自動でマクロが走るようにし、フォルダを使っている人全員が「ちょっと多くなってきたな」と感じたら Excelを開くようにしたいと思っております。
問題は、別のExcelを開いて作業していると、その操作にも影響することです。 開いているExcelが削除マクロのみだったらExcelを終了させ、そうじゃなければマクロのBookだけを終了させる、、、 というのは、どうしたらいいのでしょうか。お知恵を貸してください。
Sub Auto_Open()
J = MsgBox("一ヶ月経過したPDFファイルを削除します", vbOKCancel)
If J = Cancel Then Exit Sub Else FindFiles "D:\scandata", "*.pdf", 1 MsgBox "終了しました" End If
Application.Quit End Sub
ActiveWorkbook.Close SaveChanges:=False ? (通りすがり)
Personal.xlsを使用している場合を考慮しないといけませんね。 ・Workbooks.Count が2以内であることを確認する。 ・Workbooks.Count が1の時は開いているのが「削除マクロが登録されたブックのみ」の状態なので、 Application.Quit でよい。 ・Workbooks.Count が2の時で 開いているのが「削除マクロが登録されたブック」と「Personal.xls」の時はApplication.Quit 。 開いているのが「削除マクロが登録されたブック」と「Personal.xls以外」の時は ThisWorkbook.Close 。 代替こんなロジックじゃないでしょうか。 (みやほりん)(-_∂)b
あーそっかぁ… Personal開いてい居る場合もあるんですね。
横から失礼ですが、私の場合会社のパソコンだとテンプレートやなにやらエクセルスタートに入れられ ちゃっているので「スタート時に開いている」という条件の場合どうすればよいと思いますか?
後学のためによろしかったら教えてください。
(通りすがり)
その場合は、開いているブックの名前を、XlStartフォルダ、XlStart代替フォルダ のブック名とマッチングしていくべきでしょうが、テンプレートがあると名前が変わりますからね。 運用の仕方そのものが Application.Quit と絡むマクロとマッチしていないと思いますよ。 (もともとがいっぱい開いておくのが嫌いな性格でもあるので、 自分でやるなら面倒なのでいったん全部終了しちゃうけど) (みやほりん)(-_∂)b
通りすがり様、みやほりん様、ありがとうございました。 Personal.xls ・・・ 考えもしませんでした。(-_-;
通りすがり様の会社の仕様を伺い、ちょっと不安になりましたが、弊社は特段の設定はありませんでした。 (よかった!!) みやほりん様の書いてくださったロジックを、そのままVBAに翻訳させてもらいました。
今後とも、どうぞよろしくお願い致します。
(みーとん)
なるほど、確かに運用方法としてはあっていませんね…
常に開いているブックが3冊ほどあるので伺ったしだいです。 ありがとうございました。
話は変わりますが、2003→2007の仕様変更で、アプリケーションの閉じるボタンの挙動が変わったとこ ろに便利さを感じている今日このごろです。
(通りすがり
EXCEL の学校でこんなことを言うのもなんですが、 わざわざ EXCEL を使用しないでもよいケースのように思えます。
VBA でやるのでしたら、ほとんど文法の同じ VBS も利用できると思いますが、 下記のようなものでどうでしょうか。 拡張子を vbs で保存して、ダブルクリックすれば、削除処理を実行します。
------------------------------------- Option Explicit If MsgBox("一ヶ月経過したPDFファイルを削除します", vbOKCancel) <> vbOK Then WSCript.Quit
Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim res Dim file res = "" For Each file In fso.GetFolder( "D:\scandata" ).Files If InStr( file.Name, ".pdf" ) > 0 Then If DateDiff( "d", file.DateLastModified, Date() ) > 30 Then res = res & file.Name & vbNewLine fso.DeleteFile file.Path End If End if Next If res = "" Then WScript.Echo "削除するファイルはありませんでした。" Else WScript.Echo res & "を削除しました。" End If
'--------------------------------------------------- サブフォルダ対応版 '--------------------------------------------------- Option Explicit
If MsgBox("一ヶ月経過したPDFファイルを削除します", vbOKCancel) <> vbOK Then WSCript.Quit
Public fso Set fso = CreateObject("Scripting.FileSystemObject")
Public res res = ""
DeleteOldPDF fso.GetFolder( "D:\scandata" )
If res = "" Then WScript.Echo "削除するファイルはありませんでした。" Else WScript.Echo res & "を削除しました。" End If
Sub DeleteOldPDF( folder ) '--- サブフォルダを処理 Dim sFolder For Each sFolder In folder.SubFolders DeleteOldPDF sFolder Next
'--- フォルダを処理 Dim file For Each file In folder.Files If InStr( file.Name, ".pdf" ) > 0 Then If DateDiff( "d", file.DateLastModified, Date() ) > 30 Then res = res & file.Path & vbNewLine '// フルパスで表示 '// res = res & file.Name & vbNewLine '// ファイル名だけ表示 fso.DeleteFile file.Path End If End if Next End Sub ----------------------- (Mook)
Mook様
ありがとうございます。 そうなんです。バッチ処理できれば、見た目にもスマートかなとは思ったのですが ExcelかAccessしか書き方がわからないので、Excelを選択しました。
提示いただいたコードを実行してみました。 すごーい、ちゃんと消えてる!(当たり前?) VBAとほとんど同じとのこと。 なんとか自力でサブフォルダのファイルも削除できるよう挑戦してみます。
そこで、Excelの掲示板で大変恐縮なのですが、後学のためにvcsのヘルプはどのようにしたら 見ることができるか教えていただけませんか? Windows Scripting Hostということは、、OSがWindowsであれば、PCの中になにか入っているのでしょうか??
(みーとん)
ヘルプはオンラインであれば下記で見れますが、 http://msdn.microsoft.com/ja-jp/library/cc392193.aspx
下記の scd56jp.exe をダウンロードすれば、ローカルで同じものが見れるようになります。 http://www.microsoft.com/japan/msdn/scripting/ Windows Script 5.6 ドキュメント ダウンロード (exe 形式; 1.67 MB)
WSH(VBS、JScirpt)はXP以降は標準で使用できます。 後で、サブフォルダ下にも同じ処理をするのであれば、あとでコードを変更しておきます。
P.S. 上記にコード追加しました。 (Mook)
Mook様
わ、わ、わ、コード修正いただき、恐縮です。 また、ヘルプの場所も教えていただき、ありがとうございました。
データはソフトに依存していなくても、コントロールの方法がわからずにExcelやAccessで処理してきたものがあります。 こういう方法があるんですねぇ。目からウロコです。
本当にありがとうございました。
(みーとん)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.