| エクセル | の学校 |
| 8.一覧 | 9.HOME |
| 1.Top | 2.Last |
『エクセルファイル複製マクロでのエラーについて』(イマダニ初心者)
以前、こちらでご教示いただきました、基本となるエクセルファイルを ファイル名を変更して複製するというマクロで、今まで何事もなく使用 できていたのですが、職場のIT環境が変わり、以下のエラーが出るよう になってしまいました。
どう対処したらご教示いただけないでしょうか? どうぞよろしくお願いいたします。
「ファイル名または番号が不正です」
Sub file_copy()
'変数の型宣言
Dim base_file_name As String
Dim after_file_name As String
Dim i As Integer
'コピーされるファイル名を記憶させる
base_file_name = Cells(2, 3)
i = 0
'コピー作業を繰り返す
Do Until Cells(5 + i, 3) = ""
after_file_name = Cells(5 + i, 3)
FileCopy ThisWorkbook.Path & "\" & base_file_name, ThisWorkbook.Path & "\" & after_file_name
i = i + 1
Loop
End Sub
< 使用 Excel:Microsoft365、使用 OS:unknown >
文字通りに、ファイル名に使えない文字をつかっているか
FileCopyは古いVBベースのコマンドなので、ShiftJISにないUnicode文字だと動きません FileSystemObjectを使うとなんとか
Sub test()
Cells(1, 1).Value = ChrW(&H3251) ' ○21
FileCopy "D:\test.txt", "d:\" & Cells(1, 1).Value ' エラー
With CreateObject("Scripting.FileSystemObject")
.CopyFile "d:\a.txt", "d:\" & Cells(1, 1).Value
End With
End Sub
(´・ω・`) 2026/03/05(木) 09:38:01
(´・ω・`) さんの回答に加えて IT環境が変わったとのことなので
thisworkbookのパスが変わったんと思うんですけどそれがfilecopyの制限に引っかかっているんじゃないでしょうか
例えばデスクトップが強制的にクラウドにリンクされててクラウド上のファイルを主で返すようになったとか
あとは対象のフォルダが深すぎてIDispatchかwindowsのPathAPIの255文字制限に引っかかるとか
(onedriveだと %user%\{onedriveのPath}\{Thisworkbook.Name}に変わるので)
https://learn.microsoft.com/ja-jp/windows/win32/fileio/maximum-file-path-limitation?tabs=registry
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/bad-file-name-or-number-error-52
ThisWorkbook.Path & "\" & base_file_name と ThisWorkbook.Path & "\" & after_file_name を確認すると良いと思います
あとはセキュリティポリシーの変更の可能性もあるかもしれません。 windows defenderのASRポリシーとか https://learn.microsoft.com/ja-jp/defender-endpoint/attack-surface-reduction-rules-reference
(ちくわ) 2026/03/05(木) 10:00:50
ご教示ありがとうございます。 しかしながら…高度すぎて分かりません(汗)
職場環境がワンドライブで、クラウドが何とか…という話は出ていたので
(onedriveだと %user%\{onedriveのPath}\{Thisworkbook.Name}に変わるので)…ということでしたが、
最初のコードに入れるとしたら、どう入れたらいいのでしょうか(汗)
コピー元のファイル名を C2セルに表示させ、コピー後のファイル名をC5以降のセルに200程度まとめて
複製できるようにしたいのですが… もしよろしければ、コードをお示しいたたけないでしょうか?
よろしくお願いいたしますm(__)m (イマダニ初心者) 2026/03/05(木) 15:28:27
面倒だったのでAI使ってみました。 実行してないので、これが正しいかどうかわかりません
プロンプト
#ExcelのVBAでファイルを以下の手順でコピーします。 -ファイルは、VBAを実行するブックと同じフォルダにあります。 -コピー元のファイル名がC2セルに入力してあります。 -コピー先のファイル名はC列6行目(C6セル)から下に複数入力してあります。 -C6セルから下に空白セルが見つかるまで繰り返しコピーします。 -空白セルが見つかったら終了します。 -ファイル名にShiftJISに含まれないUnicode文字が含まれる場合があります -VBAを実行するブックはOneDriveの同期フォルダにあります。
OneDrive同期フォルダ内にあるUnicode文字(Shift-JIS外)を含むファイルをコピーする場合、 標準の FileCopy ではエラー(実行時エラー52など)が発生しやすいため、FileSystemObject (FSO) を使用し、 さらにOneDriveの URL形式のパスをローカルパスへ変換 する処理を組み込むのが最適です。 Unicode・OneDrive対応 VBAコード 以下のコードを標準モジュールに貼り付けて実行してください。
Sub CopyFilesUnicodeOneDrive()
Dim fso As Object
Dim folderPath As String
Dim sourceFileName As String, destFileName As String
Dim sourcePath As String, destPath As String
Dim i As Long
' FileSystemObjectの作成 (Unicodeパス対応のため)
Set fso = CreateObject("Scripting.FileSystemObject")
' OneDriveのURLパスをローカルパスに変換して取得
folderPath = GetLocalPath(ThisWorkbook.Path) & "\"
' C2セルからコピー元のファイル名を取得
sourceFileName = Range("C2").Value
sourcePath = folderPath & sourceFileName
' コピー元ファイルの存在確認
If Not fso.FileExists(sourcePath) Then
MsgBox "コピー元のファイルが見つかりません:" & vbCrLf & sourceFileName, vbExclamation
Exit Sub
End If
' C6セルから下に向かってループ(空白セルが見つかるまで)
i = 6
Do While Range("C" & i).Value <> ""
destFileName = Range("C" & i).Value
destPath = folderPath & destFileName
' ファイルをコピー (上書き許可: True)
On Error Resume Next
fso.CopyFile sourcePath, destPath, True
If Err.Number <> 0 Then
Debug.Print "エラー: " & destFileName & " のコピーに失敗しました (Err: " & Err.Number & ")"
Err.Clear
End If
On Error GoTo 0
i = i + 1
Loop
MsgBox "処理が完了しました。", vbInformation
End Sub
' OneDriveのURL形式パス(https://...)をローカルパスに変換する関数
Function GetLocalPath(ByVal path As String) As String
If InStr(1, path, "https://") > 0 Then
Dim resPath As String
' 環境変数からOneDriveのローカルルートを取得
resPath = Environ("OneDrive")
' URL内のドメイン部分などを除いた相対パスを特定して結合
' ※環境により調整が必要な場合があります
Dim parts() As String
parts = Split(path, "/")
GetLocalPath = resPath & "\" & parts(UBound(parts))
Else
GetLocalPath = path
End If
End Function
(´・ω・`) 2026/03/05(木) 16:08:50
個人情報が入るので 自分から晒す気がないのであれば msgbox ThisWorkbook.Path とかでなんと表示されるか確認して調べては?という回答だったのですが
面白い情報を見つけたので回答します
>職場環境がワンドライブで、クラウドが何とか…という話は出ていたので
onedriveと同期してhttpから始まるパスを返してくるのが原因と仮定します。
※ 元のファイルパスが260文字近いと onedrive分のパスが追加されて超える
※ windows difenderの企業ポリシーが変わってNGになった可能性があります。
インターネットからの自動ダウンロードの制限とか
マクロ入りブックの生成制限とか
古い上に私はonedriveの同期を切っているので確認していませんが https://qiita.com/unau/items/a75340aff7e1122225d2 によると Application.ThisWorkbook.Path だとローカルパスを返すそうです
よくわかってないんですけど Applicationを省略 → メモリ上で呼び出しているファイルのパスを返す→本体がweb上にあるのでURLを返す Applicationを記載 → c:\(略)\programfile\excel16.exeを検索する(IDispatchの動的検索が実行中のファイルではなく元のファイルから検索している) のではないかと思います。
うまく動いたら教えてほしいです。
``` VBA修正版 Sub file_copy()
'変数の型宣言
Dim base_file_name As String
Dim after_file_name As String
Dim i As Integer
'コピーされるファイル名を記憶させる
base_file_name = Cells(2, 3)
i = 0
'コピー作業を繰り返す
Dim fPath As String
fPath = Application.ThisWorkbook.Path '変更箇所
Do Until Cells(5 + i, 3) = ""
after_file_name = Cells(5 + i, 3)
FileCopy fPath & "\" & base_file_name, fPath & "\" & after_file_name 'fPathに変更
i = i + 1
Loop
End Sub ``` (ちくわ) 2026/03/06(金) 16:43:43
時間を割いて回答くださったかたに返事くらいしましょうよ。
そもそも会社組織に属しているなら、システム部門とかに照会するとかいったことが 最初にすることではないかと思いました。たぶんFAQでしょう。
職場のIT環境が変わったというのに、どう変わったかの説明もなく、いかがなものでしょうか。 > ThisWorkbook.Path & "\" & base_file_name と > ThisWorkbook.Path & "\" & after_file_name を確認すると良いと思います これに対する返事もなく、要望するだけの質問は程々にして貰いたいですね。
(xyz) 2026/03/10(火) 08:14:48
]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.