[[20100212095409]] 『マクロの入っているエクセルだけを終了させたい』(みーとん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

 『マクロの入っているエクセルだけを終了させたい』(みーとん)
 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.