プロが教えるわが家の防犯対策術!

マクロを実行するとエラーが出て、実行できません。
解決方法を教えてください。
マクロ
Sub 江別市()
Const copy_source As String = "\\nas-sp01\share\確認部\■共通\審査の注意点\条例・細則【確認申請添付】\■江別市*.pdf"
Const copy_fileName As String = "\■江別市*.pdf_Copy.pdf"
FileCopy copy_source, ThisWorkbook.Path & copy_fileName
End Sub
があります。
このマクロは指定フォルダ内の指定ファイル「pdfファイル」を作業フォルダ内にコピーできるマクロですが、
画像のようなエラーメッセージが出てしまい。
マクロが実行できません。
尚、「■江別市*.pdf」の「*」は「■江別市」の後ろのファイル名が都度変更になるために「*」としております。
よろしくお願いします。
希望としましては
指定フォルダ内「 "\\nas-sp01\share\確認部\■共通\審査の注意点\条例・細則【確認申請添付】」
の指定PDFファイル「■江別市○○.pdf」を作業フォルダ内にコピーをしたいです。
尚、上記でも触れましたが、ファイル名の○○は都度変更になりますので、○○の前のファイル名で判断したいです。
よろしくお願いします。

「エクセルのマクロについて教えてください。」の質問画像

質問者からの補足コメント

  • 回答ありがとうございます
    只今 パソコンから離れてまして
    確認来週の月曜日になります
    何時もありがとうございます♪
    またご連絡させて頂きます

      補足日時:2023/05/26 19:55
  • うーん・・・

    おはよう御座います。
    昨日教えて頂きました、コードを自宅で試して見ました。
    コード
    Sub 江別市()
    Const copy_path As String = "\\Users\〇〇\Desktop\5月27日\限定特例\特定行政庁\"
    Dim strSource As String
    strSource = Dir(copy_path & "■江別市*.pdf")
    FileCopy copy_path & strSource, ThisWorkbook.Path & "\Copy_" & strSource
    End Sub
    指定フォルダ先が変更してます、又、個人情報になりますので、「〇〇」としております。
    コピー先の「■江別市〇〇.pdfは」フォルダには一つしかありません。
    上記のマクロを実行すると
    ファイル名又は番号が不正です、となり
    コードの

    「エクセルのマクロについて教えてください。」の補足画像2
    No.2の回答に寄せられた補足コメントです。 補足日時:2023/05/27 10:04
  • ご連絡ありがとう御座います。
    はい、試しに自宅のパソコンにフォルダを作成しました。
    「C:\Users\○○\Desktop\5月27日\限定特例\特定行政庁」
    です。

    No.3の回答に寄せられた補足コメントです。 補足日時:2023/05/27 11:19
  • 又々私の設定に問題がありました。
    申し分け有りません
    C:\Users\〇〇\Desktop\5月27日\限定特例\特定行政庁
    をきちんと設定すると
    上手くコピーが出来ました。
    いつも飲み込みが悪く、申し分け有りません。
    もう少し教えて頂けますか。
    コピーしたファイル名が「Copy_■江別市-5.27」となってますが
    「■江別市-5.27_Copy」となるように
    「"\Copy_"」部分を変更したいのですが。
    教えて頂けますか。
    よろしくお願いします。

      補足日時:2023/05/27 11:27

A 回答 (4件)

>「■江別市-5.27_Copy」となるように「"\Copy_"」部分を変更した



変数strSourceにDir関数で代入された ■江別市-5.27.pdf から
ファイル名を取得する必要があります(文字列)

方法はいくつか思い付きますが、今回ファイル名内に .が使われているので
文字列の右側から.を探し 文字列操作を行います
得られた結果に _Copy.pdf をつなげてパス &ファイル名+拡張子にして
FileCopy式を作ります

FileCopy copy_path & strSource, ThisWorkbook.Path & "\Copy_" & strSource
一行を
FileCopy copy_path & strSource, _
ThisWorkbook.Path & "\" & Mid(strSource, 1, InStrRev(strSource, ".") - 1) & "_Copy.pdf"

目的拡張子が明確なので拡張子の取得を割愛して.pdf明示しました

strSource = Dir(copy_path & "■江別市*")
などとファイル拡張子を明示しない場合は

FileCopy copy_path & strSource, _
ThisWorkbook.Path & "\" _
& Mid(strSource, 1, InStrRev(strSource, ".") - 1) & _
"_Copy" & Mid(strSource, InStrRev(strSource, "."))
でコピー元と同じ拡張子でコピー出来ます
あるか分かりませんが 後のメンテナンスなどを踏まえ
変数名はイメージしやすいものに変更(右辺と左辺を分けるなど)するのが良いです

以下は時間のある時などに調べてみてください

FileSystemObjectを使用すると
FileのCopyステートメントやCopyFileメソッドが使えワイルドカード*の設定が可能(最終要素のみなど制約有)となる為、分かり易い書き方になると思います
GetFileメソッドでファイルを取得する事できGetBaseNameメソッドで容易にファイル名を取得する事も出来ます
    • good
    • 0
この回答へのお礼

詳しくありがとうございました
何時助けて頂き感謝いたします
助かりました

お礼日時:2023/05/27 13:31

\\Users\〇〇\Desktop


この様なアドレスって 作ったのでしょうか \\ 確認してください
この回答への補足あり
    • good
    • 0

ちなみに複数 ■江別市*.pdf ファイルは無いのかな?


無ければ取得ファイル名を変数に代入して使えば 定数式が成立すると思います
例えば
Sub 江別市()
Const copy_path As String = "\\nas-sp01\share\確認部\■共通\審査の注意点\条例・細則【確認申請添付】\"
Dim strSource As String
strSource = Dir(copy_path & "■江別市*.pdf")
FileCopy copy_path & strSource, ThisWorkbook.Path & "\Copy_" & strSource
End Sub

まあ *部分を変数に入れるなら
Dim tmp As String, unkwWord As String
tmp = Mid(strSource, InStr(strSource, "市") + 1)
unkwWord = Left(tmp, InStr(tmp, ".") - 1)

unkwWord が *部分の文字列
この回答への補足あり
    • good
    • 0

あれ?


FileCopyステートメントはワイルドカード*などの使用は出来ませんので
実行出来ません(定数を明示する必要があります)

ワイルドカードを使用してFileCopyのような処理を行う場合は

FileSystemObjectの CopyFileメソッドを使います
ワイルドカード使用時の挙動については調べて要件に合うものかを確認してください

FileCopyここを書き直す
FSO.CopyFile copy_source, copy_fileName

参考サイト貼っておきます
http://officetanaka.net/excel/vba/filesystemobje …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!