• 締切済み

VBAでキャッシュを削除するには

http://okwave.jp/qa/q7833029.html でも質問したものなのですが、VBAでキャッシュを削除するしたいのですがうまくいきません。 C:\Users\○○\AppData\Local\Microsoft\Windows\Temporary Internet Files のフォルダを見ると現在4656個ですが、 ///////////////////////////////////////////////////////////////// Option Explicit Sub Sample1() On Error Resume Next Dim Shell As Object, CashFolder As Object, FSO As Object Dim Folder As Object, File As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set Shell = CreateObject("Shell.Application") Set CashFolder = Shell.Namespace(&H20) ''キャッシュフォルダのパスを取得する For Each Folder In FSO.GetFolder(CashFolder.Self.Path & "\Content.IE5").SubFolders For Each File In Folder.Files ''キャッシュフォルダ内のファイルを削除する FSO.DeleteFile File Next File Next Folder Set CashFolder = Nothing Set Shell = Nothing Set FSO = Nothing End Sub ///////////////////////////////////////////////////////////////// を実行した後に、Temporary Internet Filesのフォルダを見ても、1個も削除されてません。 On Error Resume Nextをつけないと 4656個全てが、書き込みできません。(Error 70)になってしまうようです。 どうすればいいのでしょうか? ご教授よろしくお願いします。

みんなの回答

回答No.5

こんにちは。 #4の回答者です。 >エラーにもなりませんがキャッシュも削除されませんでした・・・ とのことですが、もしかしたら、少なくとも私は、読み違えをしていたかもしれません。 厳密に言えば、仮想フォルダ内のIEの取得したファイルの削除として理解しています。ただし、すべてが消えるわけではないのは、ご存知のことだと思います。 それは、IEのツールの中のインターネットオプションから、全般--閲覧の履歴--削除と同義だと思います。それは、MS側でも、過去に公開されたメソッド?ですから、VBAには備えられていませんが、コンパイラー型の言語を使えば簡単に出来るはずです。 #4のコードは、こちらも試していますが、いわゆる、IEの履歴の削除には成功しています。ダメなものを書いているつもりはありませんが、ただ、私自身が以前やっていたのは、VB6であり、ネット界で有名な方が作ったタイプライブラリを入手できたので、それを使いました。必要性に駆られてではなく、単なる勉強のひとつです。 一般的には、VBAでという話は、無理っぽいと思いつつも、VB6で可能なのですから、お話に加わりました。実際は、VB.Net やC#辺りで処理するほうが簡単だとは思います。 出来なかったということで、どこかで、話がすれ違っているかもしれません。もしかしたら、IEの削除対象のオプションに引きづられているのかもしれません。ただ、今は、あまり、そういうコードの必要性がありません。それは、CCleaner.exe などの優秀なツールが出ていますから、あえて挑戦する人も少なかろうとは思います。

回答No.4

#1 の回答者です。 悪いけれど、IE Cache そのものは、FileSystemObject では取れないはずです。元の質問が、IUrlHistoryStg2 のタイプライブラリを利用する話でしたが、私も、一度、このプログラムを悪戦苦闘したことがあります。FileSystemObjectでフォルダ自体が取得して削除できたような気がしても、それが削除自体は成功していなかった記憶があるのです。 本日、Win32 APIを調べてみましたが、DeleteUrlCacheGroup自体は、Win7 でも、サポートされています。以下は、他のサイトから、持ってきたものですが、言い出した本人の責任上、こちらで確認しました。 ただ、以下のコードを使いたくなかったので、ある人が作ったタイプライブラリがあるはずだ、と思ったのですが、本日は見つからずじまいでした。もちろん、他の方のコードで出来るなら、私のはお勧めしません。最初からですと、もう10年ぐらい前のもので、当時は、WScript関連では成功しなかったでした。もちろん、VBAではなくて、VB6でしたが。 http://yaplog.jp/orator/archive/5 より引用 '// Public Type UUID   Data1 As Long   Data2 As Integer   Data3 As Integer   Data4(0 To 7) As Byte End Type Private Const CLSCTX_INPROC = &H1& Or &H2& Private Const CC_STDCALL = 4 Private Declare Function CoCreateInstance Lib "OLE32" _   (ByRef rclsid As UUID, _   ByVal pUnkOuter As Long, _   ByVal dwClsContext As Long, _   ByRef riid As UUID, _   ByRef ppv As Long) As Long Private Declare Function DispCallFunc Lib "OLEAUT32" _   (ByVal pvInstance As Long, _   ByVal oVft As Long, _   ByVal CallConv As Long, _   ByVal vtReturn As VbVarType, _   ByVal cActuals As Long, _   ByRef prgvt As Integer, _   ByRef prgpvarg As Long, _   ByRef pvargResult As Variant) As Long 'Vtbl Public Enum eVtblFunctionOffsetCUrlHistory   ' IUrlHistoryStg2 Interface   vtblOffsetAddUrlAndNotify = 32   vtblOffsetClearHistory = 36     ' IUrlHistoryStg Interface     vtblOffsetAddUrl = 12     vtblOffsetDeleteUrl = 16     vtblOffsetQueryUrl = 20     vtblOffsetBindToObject = 24     vtblOffsetEnumUrls = 28       ' IUnknwon Interface       vtblOffsetQueryInterface = 0       vtblOffsetAddRef = 4       vtblOffsetRelease = 8 End Enum Private Function CLSID_CUrlHistory() As UUID   'Object[Microsoft Url History Service]   'HKCR\CLSID\{3C374A40-BAE4-11CF-BF7D-00AA006946EE}   With CLSID_CUrlHistory     .Data1 = &H3C374A40     .Data2 = &HBAE4     .Data3 = &H11CF     .Data4(0) = &HBF     .Data4(1) = &H7D     .Data4(2) = &H0     .Data4(3) = &HAA     .Data4(4) = &H0     .Data4(5) = &H69     .Data4(6) = &H46     .Data4(7) = &HEE   End With End Function Private Function IID_IUrlHistoryStg() As UUID   'Interface[IID_IUrlHistoryStg]   'HKCR\Interface\{3C374A41-BAE4-11CF-BF7D-00AA006946EE}   With IID_IUrlHistoryStg2     .Data1 = &HAFA0DC11     .Data2 = &HC313     .Data3 = &H11D0     .Data4(0) = &H83     .Data4(1) = &H1A     .Data4(2) = &H0     .Data4(3) = &HC0     .Data4(4) = &H4F     .Data4(5) = &HD5     .Data4(6) = &HAE     .Data4(7) = &H38   End With End Function Private Function IID_IUrlHistoryStg2() As UUID   'Interface[IUrlHistoryStg2]   'HKCR\Interface\{AFA0DC11-C313-11D0-831A-00C04FD5AE38}   With IID_IUrlHistoryStg2     .Data1 = &HAFA0DC11     .Data2 = &HC313     .Data3 = &H11D0     .Data4(0) = &H83     .Data4(1) = &H1A     .Data4(2) = &H0     .Data4(3) = &HC0     .Data4(4) = &H4F     .Data4(5) = &HD5     .Data4(6) = &HAE     .Data4(7) = &H38   End With End Function '実行プロシージャ Public Sub DelHistory()   Dim hr As Long   Dim udtCUrlHistory As UUID   Dim udtIUrlHistoryStg2 As UUID   Dim lngPUrlHistoryStg2 As Long   Dim lngPArgs() As Long   Dim intVtArgs() As Integer   Dim varResult As Variant   udtCUrlHistory = CLSID_CUrlHistory   udtIUrlHistoryStg2 = IID_IUrlHistoryStg2   hr = CoCreateInstance _       (udtCUrlHistory, _       0&, _       CLSCTX_INPROC, _       udtIUrlHistoryStg2, _       lngPUrlHistoryStg2)   If hr <> 0& Then     Debug.Print Err.LastDllError     Err.Raise hr   Else     ReDim lngPArgs(0)     ReDim intVtArgs(0)     hr = DispCallFunc _         (lngPUrlHistoryStg2, _         vtblOffsetClearHistory, _         CC_STDCALL, _         vbLong, _         0, _         intVtArgs(0), _         lngPArgs(0), _         varResult)     ReDim lngPArgs(0)     ReDim intVtArgs(0)     hr = DispCallFunc _         (lngPUrlHistoryStg2, _         vtblOffsetRelease, _         CC_STDCALL, _         vbLong, _         0, _         intVtArgs(0), _         lngPArgs(0), _         varResult)   End If End Sub

BLPBIW
質問者

お礼

再度ご回答ありがとうございます。 私が提示したコードではキャッシュは削除できないようですね。 早速ご提示いただいたコードを実行してみましたが、エラーにもなりませんがキャッシュも削除されませんでした・・・ XPでもwin7でも同じです。 折角ご回答いただいたのにすいません。

  • goota33
  • ベストアンサー率53% (7/13)
回答No.3

同様の箇所でつまった質問を見つけたので書き込んでおきます。 http://okwave.jp/qa/q6774408.html ↑によると管理者権限がないとエラーが出てしまうみたいですね。 もし管理者権限で実行できないのであれば言ってください。 一応VBAを管理者権限に昇格して実行する方法と、 VB.NETをVBAで実行する二つの方法があったので そのプログラムが動作するかどうか試してみます。

BLPBIW
質問者

お礼

前回の質問にも答えてくれた方ですね。 リンク先のコード実行してみました。 私は問題なく動きました。(XP) 管理者権限かどうかによって動作しない場合もあるのですね。 ありがとうございました。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

こちら(Windows7 Pro + Excel2010 + Administratorのアカウント)では 消えてくれましたけど? IEが立ち上がったままとか・・? (VirtualBoxの試験環境で試しました。本番環境だと怖いので。。) Win Vista だと UAC関連かも?

BLPBIW
質問者

お礼

当方はwin7、office2007です。 Administratorのアカウントかどうかってどうやったらわかるのでしょうか? このPCは自分しか使ってなくパソコンを起動した時から同じユーザー名を使ってます。 てことは、Administratorのアカウントなのでしょうか?

回答No.1

こんばんは。 >IUrlHistoryStg2の変数の宣言の仕方 そのコードでは、仮に、現IEのVersionに変えても、フォルダそのものが取得できないはずです。 http://www.vbforums.com/showthread.php?440508-Clear-IE-Browser-Cache-and-History-with-VBA ここに同じ話が出ています。どこかに、IE CacheをClearするタイプライブラリがあるような気がしますが、VBの専門サイトに聞いたほうが早いです。いずれにしても、VBAには荷が重すぎるような気がしますね。もともとは、それはVBの話でしたし、私はVBAではやった覚えがありません。

BLPBIW
質問者

お礼

ありがとうございました。 おっと・・・ 英語ですか。 まず英語を読めるようにならなくては・・・ VBAではきついのですかね。

関連するQ&A

  • VBA:2つのCSVファイルを開きたいです。

    エクセル2010のVBAにてCSVファイルを開き結合させるプログラムを組もうとしているのですが、2つ目のCSVファイルを開こうとすると、何故かエラーが出てしまいます。 -------------------------------------------------------------------------------- 1つ目 Sub mobile_FileSearch(Path As String) 'test.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call mobile_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "test.csv" Then Workbooks.Open ("test.csv") End If Next File End Sub ---------------------------------------------------------------------------- 2つ目 Sub local_FileSearch(Path As String) 'bbb.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call local_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "bbb.csv" Then Workbooks.Open ("bbb.csv")'←ここでエラー End If Next File End Sub ------------------------------------------------------------------------ まったく同じプログラムで、csvファイル名だけ変えただけで実行時エラー1004が出てしまいます。 一体全体何が問題なのでしょうか?

  • VBAでTemporary Internet Filesを消したい

    すみません。 VBAの記述方法を教えてください。 Temporary Internet Filesの中身のファイルを消したいです。 消したいファイルはcookieです。 全てのファイルを消してもOKです。。 ちなみに http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1411655159 のURLを参考にしまして以下のコードを記述したのですが 消えませんでした・・・。 Dim i&, fso As Object, sfolder$, curPath$, ieTempPath$ Const WindowsFolder = 0 Const apendDir = "Local Settings\Temporary Internet Files" Const filespec = "*.*)" Set fso = CreateObject("Scripting.FileSystemObject") sfolder = fso.GetSpecialFolder(WindowsFolder) curPath = CurDir(Left(sfolder, 1)) i = InStrRev(curPath, "\") ieTempPath = Left(curPath, i) & apendDir fso.DeleteFile (ieTempPath & "\" & filespec) Set fso = Nothing

  • FSOを使いサブフォルダのファイル操作

    同じ階層のサブフォルダにxlsm入るが入っており、VBAによりモジュールを解放しようと試みています。 まずは、FSOを使ってサブフォルダにアクセスしようとしましたが、下から6行目でエラー(424 オブジェクトが必要です)が出てしまい、解決できませんので、ご教示いただけないでしょうか? よろしくお願いします Sub DeleteMain() With Application.FileDialog(msoFileDialogFolderPicker) If Not .Show Then Exit Sub Call DeleteSub(folderPath:=.SelectedItems(1)) End With End Sub Sub DeleteSub(folderPath As String, Optional mycount As Long = 0) Dim fso As Object, myFolders As Object, myfile As Object Set fso = CreateObject("Scripting.FileSystemObject") Set myFolders = fso.GetFolder(folderPath).SubFolders For Each myfile In fso.GetFolder(folderPath).Files mycount = mycount + 1 ' Cells(mycount, 1) = myfile.Path Debug.Print myfile.Path Next For Each myFolders In fso.GetFolder(folder.Path).SubFolders Call DeleteSub(myFolder.Path, mycount) Next Set fso = Nothing Set myFolders = Nothing End Sub

  • macのofficeのVBAでファイルを検索する

    現在iMac 1.9GHz(isight内蔵) PowerPC G5 でoffice 2004 for macを使用しています。 以下のような複数のフォルダを含む任意のフォルダ(AA)内から任意のファイル名(aa or dd)のファイルが存在するかどうかを検索し、 ファイルが存在すればファイル名を、無ければ無いことを返すプログラムを作成しようと考えています。 AA---BB---aa.xls | --CC---bb.xls | | | --cc.xls ---------dd.xls そのために以下のプログラムを用意しました。(他のサイトのマル写しですが) ーーーーー Sub Sample() Dim f, buf As String, cnt As Long, FSO Set FSO = CreateObject("Scripting.FileSystemObject") With Application.FileSearch .NewSearch buf = InputBox("検索するファイル名を指定してください") If buf = "" Or buf = "False" Then Exit Sub .Filename = buf buf = GetFolder("検索を開始するフォルダを指定してください") If buf = "" Then Exit Sub .LookIn = buf .SearchSubFolders = True ''サブフォルダも検索する If .Execute() > 0 Then For Each f In .FoundFiles cnt = cnt + 1 Cells(cnt, 1) = f ''パス+ファイル名 Cells(cnt, 2) = FSO.GetFile(f).Name ''ファイル名 Cells(cnt, 3) = FSO.GetFile(f).ParentFolder ''パス Next f Else MsgBox "見つかりませんでした" End If End With Set FSO = Nothing End Sub Function GetFolder(msg As String) Dim Shell, myPath Set Shell = CreateObject("Shell.Application") Set myPath = Shell.BrowseForFolder(&O0, msg, &H1 + &H10) If Not myPath Is Nothing Then GetFolder = myPath.Items.Item.Path Else GetFolder = "" End If Set Shell = Nothing Set myPath = Nothing End Function ーーーーー このプログラムをexcel2004上のマクロとして実行すると、 実行時エラー’429’: ActiveX コンポーネントはオブジェクトを作成できません。 とエラーが表示されます。 そこで、デバッグとして一行ずつステップインさせると、二行目の Set FSO = CreateObject("Scripting.FileSystemObject") の部分でエラーとなり、動作が停止します。 何故この様なエラーが発生するのか判りません。 このエラーが発生する理由と解決策をお教えいただきたいと思います。 宜しくお願いいたします。

    • ベストアンサー
    • Mac
  • VBAでCSVファイルを読み込もうとしていますが、

    VBAでCSVファイルを読み込もうとしていますが、 「ファイルが見つかりません」とエラーが表示されます。 どのように対処していいのかわかりません。 教えてくください。 Sub readCsv() Dim csvFile As String Dim ch As Integer Dim csvStr As String Dim str() As String Dim i As Integer Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1) targetFolder = oFolder.Items.Item.Path Set fso = CreateObject("Scripting.FileSystemObject") Set fileList = fso.GetFolder(targetFolder).Files For Each file In fileList csvFile = file.Name ch = FreeFile Open csvFile For Input As #ch i = 1 Do While Not EOF(1) Line Input #ch, csvStr Close #ch str = Split(csvStr, ",") Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str i = i + 1 Loop Next End Sub

  • VBAでアクティブなファイルを参照して、ファイル一覧作成(サブフォルダ含む)

    VBAでアクティブなファイルのフォルダ(サブフォルダを含む)のファイル一覧を 作成したいと思っています。 以下のサイトを参考にして、パス、ファイル名を落とすまではできました。 http://okwave.jp/qa3544575.html === Sub test() Application.ScreenUpdating = False Sheet1.Cells.Clear Sheet1.Cells(1, 1) = "パス" Sheet1.Cells(1, 2) = "ファイル名" files "d:\", 2 Application.ScreenUpdating = True End Sub Sub files(path As String, ByRef row As Long) DoEvents Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim f As Object For Each f In fso.GetFolder(path).files Sheet1.Cells(row, 1) = path Sheet1.Cells(row, 2) = f.Name row = row + 1 Next For Each f In fso.GetFolder(path).SubFolders files f.path, row Next Set fso = Nothing End Sub === >files "d:\" の箇所を修正して、アクティブなブックを参照しようとしてみたのですが、 なかなか上手くいきません。 また、できれば *.xls などファイルの種類を指定したいのです。 filesearchを使用して組んだ時は 「AAA = ActiveWorkbook.path」「Filetype ~ 」 などでそれらの指定ができたのですが、上記に応用する事ができません。 どなたかご教示頂けますよう、よろしくお願いいたしますm(_ _)m

  • 再帰処理でアクセス禁止フォルダが存在した際の対応

    こんにちは。 ファイルの一覧を表示するモジュールを作成しました。 その際、アクセスが禁止されるフォルダ(何かのきっかけで 作成されたフォルダ。削除できません。)があった場合、 For Each subfolder In folder.SubFoldersの行で、 「書き込みできません」で停止してしまいます。 このフォルダを削除しないで(存在させたままで)処理を継続 することは可能でしょうか? よろしくご教授願います。 Dim fso As Object Dim folder As Object Dim subfolder As Object Dim file As Object Set fso = CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(strTargetDir) For Each subfolder In folder.SubFolders FolderSearch subfolder.Path Next subfolder For Each file In folder.Files With file Debug.Print .Path End With Next file

  • “.vbs”のファイルが実行できない

    まったく初歩的な質問で申し訳ないのですが、拡張子がvbsのファイルが実行できません。 あるソフトをアンインストールするために実行したいんですが、ダブルクリックするとアプリケーションを選べみたいなのが出てきて、よく分かりません。 一応、そのvbsファイルをNotepadで開いてみたものを載せときます。 ---------------------------------------- On Error Resume Next set shell = CreateObject("WScript.Shell") set fso = CreateObject("Scripting.FileSystemObject") bcp="C:\Program Files\BCP" msg = msgbox("ブラクラでヤバイVer4をアンインストールしますか?",vbYesNo) if msg=vbNo then WScript.Quit if fso.FolderExists("C:\Program Files\BCP\")then fso.DeleteFolder bcp msgbox "フォルダの削除完了" end if shell.RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\ブラクラでヤバいでチェック\") shell.RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\ブラクラでヤバいを起動\") msgbox("アンインストールが完了しました。"&Chr(13)&Chr(13)&"By 禿親父") ---------------------------------------- どなたか分かる方いましたら教えてください。 よろしくお願いします。

  • 一時ファイルの削除

    IE8を使っていますが、インターネット一時ファイルを削除したく閲覧の履歴から インターネット一時ファイルの削除にチェックを入れ削除を行うのですが Temporary Internet Filesのフォルダ内は削除されておりません。 一時ファイルのフォルダ=Temporary Internet Filesで合っていますでしょうか? もうひとつ、黒猫の落とし物というファイルは見た動画をキャッシュから 取得しますが、この取得する動画ファイルはどのフォルダに入っているのでしょうか? すっきり!!デフラグというソフトを使い一時ファイルや、動画キャッシュは削除できたのですが かなり時間がかかってしまい不便です。 質問としては時間をあまりかけずに、 一時ファイル(Temporary Internet Files)や動画のキャッシュの削除の仕方を 教えていただきたいです。

  • VBAでDOS プロンプトを使いたいのですが・・・

    デスクトップの\dataフォルダに、名前を付け替えたいファイルが多数あります。 それらのファイル名(旧名)と、変更したい名前(新名)は、エクセル上の2列に 入力済みです。VBAを使って、dosプロンプトのRENを実行しようとしましたが、 多くのファイル名にスペースが含まれるせいか、大半が変更できませんでした。 良い方法があれば、教えてください。どうかよろしくお願いします。 ※作成したプロシージャは以下の通りです。 Sub ファイル名変更() Dim カウンタ As Integer For カウンタ = 2 To 1000 Dim wsh As Object, wexec As Object, cmd As String Dim 旧名 As String, 新名 As String Set wsh = CreateObject("wscript.shell") 旧名 = Cells(カウンタ, 1).Value     '旧名はA列にある 新名 = Cells(カウンタ, 2).Value    '新名はB列にある cmd = "ren c:\users\me\desktop\data\" & 旧名 & " " & 新名 Set wexec = wsh.Exec("%comspec% /c " & cmd) Set wexec = Nothing Set wsh = Nothing Next End Sub

専門家に質問してみよう