[[20191220103816]] 『fso.MoveFileで移動先に同じファイルがあるとき』(たま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『fso.MoveFileで移動先に同じファイルがあるとき』(たま)

いつもお世話になっています
fso.MoveFileを使用しファイルを別フォルダにリネイムして移動するマクロを
作成したのですが、移動先に同名のファイルがある場合
エラーが出て止まってしまいます
これを回避するために同名のファイルがある場合
新規に保存するファイルに改訂付番を付けたいのです

AAA.xlsx
というデータを移動させたいのに
既に同名のデータがある場合

AAA-1.xlsx
としたいのです
どのようにしたらいいのでしょうか

< 使用 Excel:Excel2016、使用 OS:Windows7 >


 つくったマクロを書き込んでください。
 そしたらどこをなおせばいいか、回答がつくと思います。

 なにも書き込まないと、回答者が一からサンプルコードを書くハメになるわけで...
(´・ω・`) 2019/12/20(金) 11:21

 過去に似たようなのがありました。
[[20130629111050]] 『VBA 保存時に同じ名前があった場合に、連番にする』
(ろっくん) 2019/12/20(金) 11:32

もっと良い方法があるかもしれないですし、机上の空論なので参考程度ですが、

仰るとおり、MoveFileメソッドだとエラーになっちゃうようなので、私なら1こずつFileExistsメソッドで存在チェックをして、存在しているならCopyメソッドでリネームしながらコピー、存在しないならMoveメソッドで移動させて、(Copyメソッドの結果)残ったものはフォルダごと削除かなぁ・・なんて思いました。
(実際には削除しちゃうと怖いので、しばらくはフォルダごと"削除"フォルダに移動させるなどの安全策を取るかもですが)

MoveFileメソッド
http://officetanaka.net/excel/vba/filesystemobject/filesystemobject23.htm
→引数destinationにすでに同名ファイルが存在する場合はエラーになります。

FileExistsメソッド
http://officetanaka.net/excel/vba/filesystemobject/filesystemobject10.htm
→存在する場合はTrueを返します。

Copyメソッド
http://officetanaka.net/excel/vba/filesystemobject/file13.htm

Moveメソッド
http://officetanaka.net/excel/vba/filesystemobject/file15.htm
→FileオブジェクトのMoveメソッドは、FileSystemObjectオブジェクトのMoveFileメソッドと同じ働きをします。

(もこな2 ) 2019/12/20(金) 12:51


(´・ω・`)さん
すみません
こんな感じです

Sub ファイル名変更と移動A()
Dim fso As FileSystemObject
Dim a_row As Long
Dim pass_name As String
Dim kensaku1 As String
Dim f_name As String
Set fso = New FileSystemObject
kensaku1 = "\"
pass_name = Cells(2, 1).Value
F_Kazu = Len(Mid(pass_name, InStrRev(pass_name, kensaku1) + 1))
a_name1 = Left(pass_name, Len(pass_name) - F_Kazu - 1)
a_row = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To a_row

    pass_name2 = Cells(i, 1).Value
    kPoint = InStrRev(pass_name2, ".")
    kakutyousi = Right(pass_name2, Len(pass_name2) - kPoint + 1)
    f_name = Cells(i, 2).Value & kakutyousi
    Call fso.MoveFile(pass_name2, a_name1 & "\移動\" & f_name)
    Cells(i, 1).Value = a_name1 & "\移動\" & f_name
Next i
Set fso = Nothing
End Sub

A2以下にファイルの格納場をフルパスで入れています
pass_name = Cells(2, 1).Value

B2以下にある品番でファイル名を変更します拡張子はもともとの拡張子を取得して入れています
f_name = Cells(i, 2).Value & kakutyousi

ファイルのある階層にある"移動"フォルダにデータを移動し、リネイムします
B2以下の品番が同じものがあるため付番を付けたいのです
ただし1ファイルしかないものには付番はつけません
B2以下の品番には変更できません

宜しくお願いいたします

ろっくん さん、もこな2 さん
アドバイスありがとうございます
上記内容で再度アドバイスいただけたら助かります
宜しくお願いいたします
(たま) 2019/12/20(金) 17:28


 やり方はいろいろあると思いますが、
 一例です。

    Sub ファイル名変更と移動A()
        Dim FSO As FileSystemObject
        Dim a_row As Long
        Dim pass_name As String
        Dim kensaku1 As String
        Dim f_name As String

        Set FSO = New FileSystemObject

        kensaku1 = "\"
        pass_name = Cells(2, 1).Value
        F_Kazu = Len(Mid(pass_name, InStrRev(pass_name, kensaku1) + 1))
        a_name1 = Left(pass_name, Len(pass_name) - F_Kazu - 1)
        a_row = Cells(Rows.Count, 1).End(xlUp).Row

        For i = 2 To a_row
            pass_name2 = Cells(i, 1).Value
            kPoint = InStrRev(pass_name2, ".")
            kakutyousi = Right(pass_name2, Len(pass_name2) - kPoint + 1)
            f_name = Cells(i, 2).Value & kakutyousi
            On Error GoTo Err_FileExist
                Call FSO.MoveFile(pass_name2, a_name1 & "\移動\" & f_name)
            On Error GoTo 0
            Cells(i, 1).Value = a_name1 & "\移動\" & f_name
        Next i

        Set FSO = Nothing

        Exit Sub

    Err_FileExist:
        Select Case Err.Number
           Case 58
              kPoint = InStrRev(f_name, ".")
              kakutyousi = Right(f_name, Len(f_name) - kPoint + 1)
              f_name = Left(f_name, Len(f_name) - Len(kakutyousi))
              hpoint = InStrRev(f_name, "-")
              If hpoint > 0 Then
                 fuban = Right(f_name, Len(f_name) - hpoint + 1)
                 If IsNumeric(fuban) Then
                    fuban = Val(fuban) - 1
                    f_name = Left(f_name, hpoint - 1) & fuban & kakutyousi
                 Else
                    f_name = f_name & "-1" & kakutyousi
                 End If
              Else
                 f_name = f_name & "-1" & kakutyousi
              End If
              Resume
           Case Else
              Err.Raise Err.Number, , Err.Description
        End Select
    End Sub
(´・ω・`) 2019/12/20(金) 18:28

(´・ω・`)さん
ありがとうございます
こちらのやりたいことが完璧に実現しています
Err オブジェクトはあまり使ってなかったので
(Errが出たらメッセージを表示して終了としか使ったことがなかった)
目からうろこでした

本当にありがとうございました
(たま) 2019/12/23(月) 10:52


コメント返信:

[ 一覧(最新更新順) ]


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