使用VBA。我的腳本將文件移動到目錄中。如果該文件名已存在於目標目錄中,我希望在執行移動之前提示用戶重命名源文件(正在移動的文件)。使用Application.FileDialog重命名VBA中的文件
因爲我想要用戶知道目錄中已有其他文件(因此他們不選擇已存在的另一個文件的名稱),我的想法是打開一個FileDialog框,列出目錄的內容,以便用戶可以使用FileDialog框的本地重命名功能。然後,我將循環該FileDialog,直到源文件和目標文件名不再相同。
下面是一些示例代碼:
Sub testMoveFile()
Dim fso As FileSystemObject
Dim file1 As File
Dim file2 As File
Dim dialog As FileDialog
Set fso = New FileSystemObject
fso.CreateFolder "c:\dir1"
fso.CreateFolder "c:\dir2"
fso.CreateTextFile "c:\dir1\test.txt"
fso.CreateTextFile "c:\dir2\test.txt"
Set file1 = fso.GetFile("c:\dir1\test.txt")
Set file2 = fso.GetFile("c:\dir2\test.txt")
Set dialog = Application.FileDialog(msoFileDialogOpen)
While file1.Name = file2.Name
dialog.InitialFileName = fso.GetParentFolderName(file2.Path)
If dialog.Show = 0 Then
Exit Sub
End If
Wend
file1.Move "c:\dir2\" & file1.Name
End Sub
但是,當我重新命名文件2,點擊「OK」,我得到一個錯誤:
Run-time error '53': File not found
,然後進入調試器顯示的值file2.name是<File not found>
。
我不確定這裏發生了什麼 - 文件重命名後對象引用是否丟失?有沒有更簡單的方法讓用戶從顯示目標目錄中所有文件的對話框重命名?我還想爲該文件提供一個默認的新名稱,但是我看不到如何使用此方法。
編輯:在這一點上,我正在研究製作一個帶有相關文件名填充的列表框的UserForm,以及一個用於輸入新名稱的默認值的輸入框。但是,一旦文件被重命名,仍然不確定如何保持對象引用。
顯示對話框後,您無需更改'File2.Name'。它不會神奇地知道你想要改變什麼變量;您必須檢索用戶提供的作爲新文件名的值並使用它。您正在顯示對話框,放棄可能使用的任何對象,並嘗試使用原始文件夾和文件名繼續執行原始移動操作。 –
@KenWhite,我認爲File2.Name以某種方式動態鏈接到系統中文件的名稱,並且如果用戶通過在對話框中單擊它並重新命名文件來重命名該文件,File2的值。名稱更改。不是這種情況? – sigil
不,它不是。你已經打開文件。該對話框顯示磁盤文件夾的內容,並讓用戶選擇一個位置,但它不會以某種方式讀取您的頭腦或代碼,並知道您對該位置的意思是以某種方式影響'File2'。我覺得你很困惑,因爲你將'InitialFileName'分配給與'File2'有關的東西,並且你認爲將該對話框附加到該文件。它不會 - 它只是讀取「File2.Path」中的當前值並在內部變量中使用該名稱。在用戶告訴你他們已經選擇了一些東西之後,你仍然有責任改變'File2'。 –