エクセル の学校
8.一覧 9.HOME
1.Top 2.Last

[[20260305083839]]

[ 初めての方へ | 一覧(最新更新順) |

|
| 全文検索 | 過去ログ | エクセルの学校HOME ]

 

『エクセルファイル複製マクロでのエラーについて』(イマダニ初心者)

以前、こちらでご教示いただきました、基本となるエクセルファイルを ファイル名を変更して複製するというマクロで、今まで何事もなく使用 できていたのですが、職場の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





[ 一覧(最新更新順) |

]

キーボードヒント:[Home]または[Fn+Home]キーで一番上へ戻ります

YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.