ダウンロードフォルダのExcelファイルブロック解除
VBAマクロは、マルウェアやランサムウェアの危険があります。
そのため、Officeのセキュリティを強化するために、インターネットからのファイル内のマクロをブロックするように Officeアプリケーションの既定の動作が変更されています。
ブロックの解除方法
プロパティのセキュリティを変更

PowerShell の Unblock-File コマンド
ZoneId 値を削除すると、VBA マクロを既定で実行できます。
コマンドレットを使用すると、ファイルの [プロパティ] ダイアログの [全般] タブの [ブロック解除] チェック ボックスをオンにした場合と同じ処理が実行されます。
PowerShell Unblock-File
Geminiにブロック解除するVBAを書いてもらいました

プロンプト
・ダウンロードフォルダ内の全てのエクセルファイルを対象
・ファイルのロックを解除
コメントは日本語で
Geminiの応答
ダウンロードフォルダにある全てのエクセルファイルに対して、セキュリティロック(Mark of the Web)を解除するVBAコードを作成します。
Sub ダウンロードフォルダのExcelファイルロック解除()
' ---------------------------------------------------------------------
' 作成者: AIアシスタント (Gemini)
' 目的: ダウンロードフォルダ内の全てのエクセルファイルのロックを解除する
' (例: インターネットからダウンロードしたファイルに付与されるセキュリティ情報を解除)
' 備考: このマクロを実行するには、Microsoft Scripting Runtimeへの参照設定は必須ではありませんが、
' より安全で効率的なコードのために設定することをお勧めします。
' 設定方法: VBAエディタのメニュー -> ツール -> 参照設定 -> "Microsoft Scripting Runtime" にチェックを入れる。
' 参照設定を行わない場合は、FileSystemObjectは遅延バインディングされます。
' ---------------------------------------------------------------------
' ファイルシステムオブジェクトを宣言します。
' これを使ってフォルダやファイルを操作します。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
' ダウンロードフォルダのパスを取得します。
' Environ("USERPROFILE") はユーザーのプロファイルフォルダのパスを返します。
Dim downloadsFolderPath As String
downloadsFolderPath = Environ("USERPROFILE") & "\Downloads"
' ダウンロードフォルダが存在するか確認します。
If Not fso.FolderExists(downloadsFolderPath) Then
MsgBox "エラー: ダウンロードフォルダが見つかりません。" & vbCrLf & downloadsFolderPath, vbCritical
Exit Sub ' フォルダが見つからない場合は処理を終了します。
End If
' フォルダオブジェクトを取得します。
Dim downloadsFolder As Object
Set downloadsFolder = fso.GetFolder(downloadsFolderPath)
' フォルダ内のファイルコレクションを取得します。
Dim fileCollection As Object
Set fileCollection = downloadsFolder.Files
' ファイルごとの処理に必要な変数を宣言します。
Dim targetFile As Object
Dim filePath As String
Dim shellCommand As String
Dim fileExtension As String
Dim unblockedCount As Long ' ロック解除処理を実行したファイルの数をカウントします。
unblockedCount = 0
' ダウンロードフォルダ内の各ファイルに対してループ処理を行います。
For Each targetFile In fileCollection
' ファイルのフルパスを取得します。
filePath = targetFile.Path
' ファイルの拡張子を取得し、小文字に変換します。
fileExtension = LCase(fso.GetExtensionName(filePath))
' Excelファイルの拡張子かどうかを判定します。
' (xls, xlsx, xlsm, xlsb など、必要に応じて追加/修正してください)
Select Case fileExtension
Case "xls", "xlsx", "xlsm", "xlsb"
' Excelファイルの場合
' PowerShellコマンド文字列を作成します。
' PowerShellの Unblock-File コマンドレットを使用してロックを解除します。
' -ExecutionPolicy Bypass はスクリプト実行ポリシーを一時的に緩和します(Cmdlet なので不要な場合もあります)。
' -Command の後ろの文字列全体をダブルクォートで囲み、ファイルパス内のダブルクォートはエスケープ(二重にする "")します。
shellCommand = "PowerShell.exe -ExecutionPolicy Bypass -Command ""Unblock-File """ & filePath & """"""
' Shell関数を使ってPowerShellコマンドを実行します。
' vbHide を指定すると、コマンドプロンプトのウィンドウが表示されません。
On Error Resume Next ' エラーが発生してもマクロが停止しないようにします(例: ファイルが開かれている場合など)。
Shell shellCommand, vbHide
' Shell関数の実行結果やエラーコードを直接取得することは難しいですが、
' このコマンドレットは成功してもエラーを返さないため、ここでは単純に実行します。
If Err.Number <> 0 Then
' ロック解除に失敗した場合の処理(例: デバッグウィンドウに表示)
Debug.Print "注意: ファイルのロック解除に失敗した可能性があります。 " & filePath & " (エラーコード: " & Err.Number & ", 説明: " & Err.Description & ")"
' 処理を続行します。
Else
' ロック解除処理が実行されたとみなしてカウントします。
unblockedCount = unblockedCount + 1
' 必要に応じて、デバッグウィンドウに表示することも可能です。
' Debug.Print "ロック解除処理を実行しました: " & filePath
End If
On Error GoTo 0 ' エラーハンドリングをリセットします。
Case Else
' Excelファイル以外の拡張子の場合、何もしません。
' Debug.Print "Excelファイルではありません: " & filePath ' 必要に応じて表示
End Select
Next targetFile ' 次のファイルへ
' 処理完了のメッセージを表示します。
MsgBox downloadsFolder.Files.Count & "個のファイルの中から、" & unblockedCount & "個のExcelファイルに対してロック解除処理を実行しました。", vbInformation
' 使用したオブジェクトを解放します。
Set fileCollection = Nothing
Set downloadsFolder = Nothing
Set fso = Nothing
End Sub
使い方:
- Alt + F11 キーを押してVBAエディタを開きます。
- 左側のプロジェクトエクスプローラーで、このコードを実行したいブックを選択します(通常は「ThisWorkbook」または新しい標準モジュール)。
- メニューバーの「挿入」から「標準モジュール」を選択します。
- 表示された白いウィンドウ(コードウィンドウ)に上記のコードをコピー&ペーストします。
- VBAエディタを閉じます(Alt + F11 または右上のXボタン)。
- Excelに戻り、Alt + F8 キーを押してマクロダイアログを開きます。
- 「ダウンロードフォルダのExcelファイルロック解除」を選択し、「実行」ボタンをクリックします。
補足:
- このコードは、WindowsのPowerShellコマンドである Unblock-File を内部的に呼び出しています。このコマンドは、ファイルの代替データストリームに記録されているセキュリティ情報を削除します。
- ロック解除処理に成功しても、Excelでファイルを開く際にセキュリティ警告が表示される場合があります。その場合は、Excelのトラストセンター設定を確認してください。
- ファイルが開いている場合や、ファイルへのアクセス権限がない場合は、ロック解除に失敗する可能性があります。その場合は、エラーメッセージがデバッグウィンドウ(VBAエディタのメニュー -> 表示 -> イミディエイトウィンドウ)に表示されますが、マクロの実行は停止しません。
- 対象とするExcelファイルの拡張子を変更したい場合は、Select Case 部分を編集してください。
プロンプト
Geminiの応答
Option Explicit
Sub DownloadFolderExcelFilesUnblock_WSHRun()
' ファイルシステム操作のためのオブジェクトを宣言
Dim objFSO As Object
' Shell操作のためのオブジェクトを宣言 (ダウンロードフォルダパス取得用)
Dim objShell As Object
' WScript.Shellオブジェクトを宣言 (コマンド実行用)
Dim objWSH As Object
' ダウンロードフォルダのパスを格納する変数
Dim DownloadsPath As String
' ダウンロードフォルダ内のファイルコレクションを格納する変数
Dim colFiles As Object
' 処理中の個別のファイルを格納する変数
Dim objFile As Object
' PowerShellコマンド文字列を格納する変数
Dim PowerShellCmd As String
' 処理したExcelファイルの数をカウントする変数
Dim processedCount As Long
' エラーが発生した場合の処理を設定
On Error GoTo ErrorHandler
' FileSystemObjectを作成
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Shell.Applicationオブジェクトを作成
Set objShell = CreateObject("Shell.Application")
' WScript.Shellオブジェクトを作成
Set objWSH = CreateObject("WScript.Shell")
' ダウンロードフォルダの特殊フォルダ定数 (&H11&) を使用してパスを取得
' 65537 は &H11& の10進数表現
On Error Resume Next ' Namespaceメソッドのエラーは後で確認
DownloadsPath = objShell.Namespace(65537).Self.Path
On Error GoTo ErrorHandler ' エラーハンドリングを戻す
' ダウンロードフォルダのパスが取得できたか確認
If DownloadsPath = "" Then
MsgBox "ダウンロードフォルダのパスを取得できませんでした。", vbCritical
Exit Sub
End If
' ダウンロードフォルダが存在するか確認
If Not objFSO.FolderExists(DownloadsPath) Then
MsgBox "ダウンロードフォルダが見つかりません: " & DownloadsPath, vbCritical
Exit Sub
End If
' ダウンロードフォルダのオブジェクトを取得
Set colFiles = objFSO.GetFolder(DownloadsPath).Files
' 処理カウンターを初期化
processedCount = 0
' フォルダ内の各ファイルについてループ処理
For Each objFile In colFiles
' ファイルの拡張子を取得し、小文字に変換
Dim fileExtension As String
fileExtension = LCase(objFSO.GetExtensionName(objFile.Path))
' Excelファイルであるか確認 (.xls, .xlsx, .xlsm, .xlsb)
If fileExtension = "xls" Or fileExtension = "xlsx" Or fileExtension = "xlsm" Or fileExtension = "xlsb" Then
' PowerShellコマンドを作成
' Unblock-Fileコマンドレットを使用してファイルのブロックを解除
' -Path パラメータにファイルパスを指定。パスにスペースや特殊文字が含まれても良いように引用符で囲む
PowerShellCmd = "powershell.exe -NoProfile -Command ""Unblock-File -Path """ & objFile.Path & """"""
' WScript.Shell.Runメソッドを使用してコマンドを実行
' 第2引数 0 はウィンドウを非表示にする (vbHide相当)
' 第3引数 False はコマンドの終了を待たない (非同期実行)
On Error Resume Next ' Run実行時のエラーは無視する (ファイルがロックされている場合など)
objWSH.Run PowerShellCmd, 0, False
On Error GoTo ErrorHandler ' エラーハンドリングを戻す
' 処理したファイルの数をカウントアップ
processedCount = processedCount + 1
' (オプション) 処理したファイル名をイミディエイトウィンドウに表示
' Debug.Print "Unblocked: " & objFile.Path
End If
Next objFile
' 処理完了メッセージ
If processedCount > 0 Then
MsgBox processedCount & "個のExcelファイルのブロック解除処理が完了しました。", vbInformation
Else
MsgBox "ダウンロードフォルダにExcelファイルは見つかりませんでした。", vbInformation
End If
CleanUp:
' オブジェクトを開放
Set objFile = Nothing
Set colFiles = Nothing
Set objFSO = Nothing
Set objShell = Nothing
Set objWSH = Nothing ' WScript.Shellオブジェクトも解放
Exit Sub
ErrorHandler:
' エラー発生時のメッセージ
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Resume CleanUp ' クリーンアップ処理へジャンプして終了
End Sub
変更点:
- objWSH As Object を宣言し、Set objWSH = CreateObject("WScript.Shell") で WScript.Shell オブジェクトを作成しました。
- PowerShellコマンドの実行部分を Shell PowerShellCmd, vbHide から objWSH.Run PowerShellCmd, 0, False に変更しました。
- objWSH.Run: WScript.Shell オブジェクトの Run メソッドを呼び出します。
- PowerShellCmd: 実行するコマンド文字列です。(これは前バージョンと同じです)
- 0: ウィンドウスタイルを指定します。0 は非表示です(VBAの vbHide に相当)。
- False: コマンドが終了するのを待つかどうかを指定します。False を指定することで、VBAはPowerShellコマンドの完了を待たずに次のファイル処理に進みます(非同期実行)。
- Cleanupセクションに Set objWSH = Nothing を追加し、オブジェクトを適切に解放するようにしました。
あとがき
コメントもしっかり書いてあり、もう完璧!!!
わざわざ人がVBAを書く機会はかなり減ってくるように感じます。
サイト内の関連ページ
同じテーマ「生成AI活用研究」の記事
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門
AI(Gemini)とエクセル数式対決 その1
AI(Gemini)とエクセル数式対決 その2
ダウンロードフォルダのExcelファイルブロック解除
AIがあればVBAはできる:セルに絵文字を入れる
Geminiと100本ノック 1本目:セルのコピー
Geminiと100本ノック 2本目:セルのコピー
Geminiと100本ノック 3本目:セルの消去
Geminiと100本ノック 4本目:セルの消去
Geminiと100本ノック 5本目:セルの計算
Geminiと100本ノック 4本目:セルの消去
新着記事NEW ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。