PCのデスクトップは、作業中のファイルを一時的に保管しておくのに便利です。
しかしながらデスクトップにファイルが保管しすぎて、過去のファイルやフォルダで溢れてしまうことがあります。
しかも過去のファイルやフォルダが大量にあるせいで、どれが作業中のものか見分けがつかないことも少なくありません。
そこでVBAを使って、PCデスクトップのファイルやフォルダ整理を行うプログラムを紹介します。
・ファイルやフォルダの最終更新日をもとに作業中かどうか判定
以下でVBAプログラムを詳しく紹介していきます。
目次
- 1 マクロVBAでPCデスクトップのファイルやフォルダを整理
- 2 VBA作成前の準備
- 3 VBAプログラムの解説
- 3.1 プログラム0|変数宣言の指定
- 3.2 プログラム1|プログラム開始
- 3.3 プログラム2|windows Script Host Object Modelの設定
- 3.4 プログラム3|デスクトップのパス取得
- 3.5 プログラム4|FileSystemObjectの設定
- 3.6 プログラム5|シートの設定
- 3.7 プログラム6|情報を取得するフォルダURLを取得
- 3.8 プログラム7|フォルダを取得
- 3.9 プログラム8|フォルダ内のフォルダを取得
- 3.10 プログラム9|フォルダの最終アクセス日時が7日前ならフォルダをデスクトップから移動
- 3.11 プログラム10|フォルダ内のファイルを取得
- 3.12 プログラム11|ファイルの拡張子が「lnk」ではないなら
- 3.13 プログラム12|ファイルの拡張子が「ini」ではないなら
- 3.14 プログラム13|ファイルの最終アクセス日時が7日前ならファイルをデスクトップから移動
- 3.15 プログラム14|プログラム11とプログラム12のジャンプ先
- 3.16 プログラム15|オブジェクト解放
- 3.17 プログラム16|プログラム終了
- 4 Excel VBAについて詳しく理解したいなら
マクロVBAでPCデスクトップのファイルやフォルダを整理
このページで紹介するのは以下のようなプログラムです。
画像を使ってプログラムの仕様について説明します。
以下のようにPCデスクトップにファイルやフォルダが存在するとします。
このプログラムを実行すると、PCデスクトップに存在するファイルやフォルダの内、最終アクセス日から7日以上経過しているものはPCデスクトップから削除させます。
PCデスクトップからは削除させますが、ファイルやフォルダを実際に削除はしません。
アクセスはしていないけれど、削除してはいけないファイルが存在する可能性もあるからです。
そのため保管用のフォルダをあらかじめ設定しておき、そのフォルダに移動させます。
こうしておくことで後日必要になったときに、保管用フォルダから掘り起こせるようにします。
なおデスクトップのアプリなどのショートカットリンクは、そのままデスクトップに残しておきます。
VBA作成前の準備
1. ExcelでVBAを使うための事前準備
エクセルVBAを使うためには、保存ファイルの拡張子変更、Excelの基本設定変更の2つをしておきます。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
2. デスクトップのパス取得するための参照設定
この事例ではデスクトップのパスを取得するために、windows Script Host Object Modelを活用します。
windows Script Host Object Modelを使用する場合、VBAの参照設定を変更しておく必要があります。
3. フォルダを扱うための参照設定
この事例ではフォルダを操作するために、FileSystemObjectを活用します。
FileSystemObjectを使用する場合、VBAの参照設定を変更しておく必要があります。参照設定とは、機能拡張させることです。
FileSystemObjectを使用するために以下の参照設定を変更します。
これでフォルダやファイルの情報を取得することができるようになります。
設定方法の詳細は以下のページで紹介しています。
なお「Microsoft Scripting Runtime」にチェックを入れていないと、本事例で紹介しているVBAプログラムは動作しません。
必ずチェックを入れるようにします。
VBAプログラムの解説
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub CleaningDesktop() 'プログラム2|windows Script Host Object Modelの設定 Dim wsh As IWshRuntimeLibrary.WshShell Set wsh = New IWshRuntimeLibrary.WshShell 'プログラム3|デスクトップのパス取得 Dim desktop As String desktop = wsh.SpecialFolders("Desktop") 'プログラム4|シートの設定 Dim ws As Worksheet Set ws = Worksheets("Sheet1") 'プログラム5|情報を取得するフォルダURLを取得 Dim storagepath As String storagepath = ws.Range("B2").Value 'プログラム6|FileSystemObjectの設定 Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject 'プログラム7|フォルダを取得 Dim basefolder As Scripting.Folder Set basefolder = fs.GetFolder(desktop) 'プログラム8|フォルダ内のフォルダを取得 Dim myfolders As Scripting.Folders Set myfolders = basefolder.SubFolders Dim myfolder As Scripting.Folder For Each myfolder In myfolders 'プログラム9|フォルダの最終アクセス日時が7日前ならフォルダをデスクトップから移動 If DateDiff("d", Date, -7) < fs.GetFolder(myfolder).DateLastAccessed Then Debug.Print myfolder.path Debug.Print storagepath fs.MoveFolder Source:=myfolder.path, Destination:=storagepath & "\" & myfolder.Name End If Next 'プログラム10|フォルダ内のファイルを取得 Dim myfiles As Scripting.Files Set myfiles = basefolder.Files Dim myfile As Scripting.File For Each myfile In myfiles Debug.Print myfile.Name 'プログラム11|ファイルの拡張子が「lnk」ではないなら If fs.GetExtensionName(myfile) = "lnk" Then: GoTo Continue 'プログラム12|ファイルの拡張子が「ini」ではないなら If fs.GetExtensionName(myfile) = "ini" Then: GoTo Continue 'プログラム13|ファイルの最終アクセス日時が7日前ならファイルをデスクトップから移動 If DateDiff("d", Date, -7) < fs.GetFile(myfile).DateLastAccessed Then fs.MoveFile Source:=myfile.path, Destination:=storagepath & "\" & myfile.Name End If 'プログラム14|プログラム11とプログラム12のジャンプ先 Continue: Next 'プログラム15|オブジェクト解放 Set myfile = Nothing Set myfiles = Nothing Set myfolder = Nothing Set myfolders = Nothing Set basefolder = Nothing Set fs = Nothing Set wsh = Nothing 'プログラム16|プログラム終了 End Sub |
以下で詳しく説明します。
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
予期しないエラーを防止できるため「Option Explicit」を入力することを習慣化することを推奨しています。
詳しい説明は以下のページで紹介しています。
プログラム1|プログラム開始
1 |
Sub CleaningDesktop() |
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
プロシージャに関連するmoduleの話については以下で説明しています。
プログラム2|windows Script Host Object Modelの設定
1 2 |
Dim wsh As IWshRuntimeLibrary.WshShell Set wsh = New IWshRuntimeLibrary.WshShell |
この事例ではコマンドラインでウェブページを開くために、windows Script Host Object Modelを活用します。
ここではwshにIWshRuntimeLibrary.WshShellのオブジェクトを生成し設定します。
なおwindows Script Host Object Modelを使用する場合、VBAの参照設定を変更しておく必要があるので、注意が必要です。
参照設定していないとエラーが表示されます。
プログラム3|デスクトップのパス取得
1 2 |
Dim desktop As String desktop = wsh.SpecialFolders("Desktop") |
プログラム2で設定したwsh(IWshRuntimeLibrary.WshShell)を使ってdesktopのパスを取得します。
ここで取得したデスクトップのパスを使って、デスクトップに保存されているフォルダやファイルを処理していきます。
プログラム4|FileSystemObjectの設定
1 2 |
Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject |
FileSystemObjectは、ファイルやフォルダを操作するときに使うオブジェクトです。
本事例ではFileSystemObjectをfsという変数として扱います。
変数fsは定義するだけではなく、「Set fs = New Scripting.FileSystemObject」と記入して使えるようになります。
これを忘れてしまうことが多いので、注意が必要です。
FileSystemObjectに関する注意点
なお参照設定にて、Microsoft Scripitng Runtimeを設定に入れておく必要があります。
設定を忘れると動作しませんので、事前に設定を変更しておく必要があります。
なお、FileSystemObject以外にもフォルダを操作する方法はあります。しかしFileSystemObjectを使えば、ファイルとフォルダを両方操作できるので、覚えることが少なくて済みます。
細かいことを覚えるのが面倒な人は、ファイルやフォルダを操作するときはFileSystemObjectを使うと覚えておくといいです。
FileSystemObjectに関しては以下で詳しく紹介しています。
プログラム5|シートの設定
1 2 |
Dim ws As Worksheet Set ws = Worksheets("Sheet1") |
Sheet1をwsとして取得します。
プログラム6|情報を取得するフォルダURLを取得
1 2 3 4 5 6 |
Dim storagepath As String storagepath = ws.Range("B2").Value If fs.FolderExists(folderspec:=storagepath) = False Then MsgBox "セルB2で指定したフォルダが存在しません。" Exit Sub End If |
セルB2に不要データを移動させるフォルダを指定します。
もしセルB2が空欄だったり、入力したフォルダが存在しなかったりしたら、メッセージを表示させてプログラムを途中終了させます。
プログラム7|フォルダを取得
1 2 |
Dim basefolder As Scripting.Folder Set basefolder = fs.GetFolder(desktop) |
プログラム3で取得したデスクトップのパスをbasefolderとして設定します。
プログラム8|フォルダ内のフォルダを取得
1 2 3 4 5 6 |
Dim myfolders As Scripting.Folders Set myfolders = basefolder.SubFolders Dim myfolder As Scripting.Folder For Each myfolder In myfolders '中略 Next |
デスクトップに作成されたフォルダを全て取得します。
For Each文でフォルダを一つずつ処理していきます。
ここは以下のページが参考になります。
プログラム9|フォルダの最終アクセス日時が7日前ならフォルダをデスクトップから移動
1 2 3 |
If DateDiff("d", Date, -7) < fs.GetFolder(myfolder).DateLastAccessed Then fs.MoveFolder Source:=myfolder.path, Destination:=storagepath & "\" & myfolder.Name End If |
対象フォルダに最終アクセスした日が7日以上前であれば、プログラム6で設定したフォルダ(storagepath)に移動させます。
7日前かどうかは「DateDiff(“d”, Date, -7)」で取得し、フォルダの最終アクセス日は「fs.GetFolder(myfolder).DateLastAccessed」で取得できます。
この2つを比較して、対象フォルダに最終アクセスした日が7日以上前かどうかを検証させます。
プログラム10|フォルダ内のファイルを取得
1 2 3 4 5 6 |
Dim myfiles As Scripting.Files Set myfiles = basefolder.Files Dim myfile As Scripting.File For Each myfile In myfiles '中略 Next |
デスクトップ内のファイルを全て取得します。
ここは以下のページが参考になります。
プログラム11|ファイルの拡張子が「lnk」ではないなら
1 |
If fs.GetExtensionName(myfile) = "lnk" Then: GoTo Continue |
デスクトップに保存されているファイルの拡張子が「lnk」であれば、処理をスキップしてプログラム14へジャンプさせます。
というのも、実はデスクトップに保管されているGoogle Chromeのようなリンクもプログラムで処理されます。
リンクの拡張子は「lnk」なので、「lnk」は処理を実行されないようにする必要があります。
For Nextの処理スキップについては、以下で詳しく紹介しています。
プログラム12|ファイルの拡張子が「ini」ではないなら
1 |
If fs.GetExtensionName(myfile) = "ini" Then: GoTo Continue |
このプログラムを使うと、「desktop.ini」という名前のファイルが対象になります。
拡張子が「.ini」のファイルは、イニファイルと呼ばれます。
desktop.iniファイルも、フォルダの表示方法やアプリケーションなどを設定しているシステムファイルです。
もしdesktop.iniファイルに対して処理を行うと、動作が不安定になったり、アプリケーションが正常に起動しなくなる可能性があります。
そこで処理をスキップさせます。
プログラム13|ファイルの最終アクセス日時が7日前ならファイルをデスクトップから移動
1 2 3 |
If DateDiff("d", Date, -7) < fs.GetFile(myfile).DateLastAccessed Then fs.MoveFile Source:=myfile.path, Destination:=storagepath & "\" & myfile.Name End If |
デスクトップの対象ファイルに対して、最終アクセスした日が7日以上前であれば、プログラム6で設定したフォルダ(storagepath)に移動させます。
7日前かどうかは「DateDiff(“d”, Date, -7)」で取得し、フォルダの最終アクセス日は「fs.GetFile(myfile).DateLastAccessed」で取得できます。
この2つを比較して、対象ファイルに最終アクセスした日が7日以上前かどうかを検証させます。
プログラム14|プログラム11とプログラム12のジャンプ先
1 2 |
Continue: Next |
プログラム11とプログラム12で処理をスキップさせると、ここのContinue:に移動します。
そして次のForNextの処理を実行します。
プログラム15|オブジェクト解放
1 2 3 4 5 6 7 |
Set myfile = Nothing Set myfiles = Nothing Set myfolder = Nothing Set myfolders = Nothing Set basefolder = Nothing Set fs = Nothing Set wsh = Nothing |
このページで設定したオブジェクトを解放します。
プログラム16|プログラム終了
1 |
End Sub |
プログラムはここで終了です。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
少しずつレベルアップしながら、難しい内容に挑戦していくと効率的に学ぶことができます。
上記のリンクでは、VBA勉強に役立つ内容を紹介しています。
興味がある人はご覧ください。