2011-11-18 64 views
0

使用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,以及一個用於輸入新名稱的默認值的輸入框。但是,一旦文件被重命名,仍然不確定如何保持對象引用。

+3

顯示對話框後,您無需更改'File2.Name'。它不會神奇地知道你想要改變什麼變量;您必須檢索用戶提供的作爲新文件名的值並使用它。您正在顯示對話框,放棄可能使用的任何對象,並嘗試使用原始文件夾和文件名繼續執行原始移動操作。 –

+0

@KenWhite,我認爲File2.Name以某種方式動態鏈接到系統中文件的名稱,並且如果用戶通過在對話框中單擊它並重新命名文件來重命名該文件,File2的值。名稱更改。不是這種情況? – sigil

+1

不,它不是。你已經打開文件。該對話框顯示磁盤文件夾的內容,並讓用戶選擇一個位置,但它不會以某種方式讀取您的頭腦或代碼,並知道您對該位置的意思是以某種方式影響'File2'。我覺得你很困惑,因爲你將'InitialFileName'分配給與'File2'有關的東西,並且你認爲將該對話框附加到該文件。它不會 - 它只是讀取「File2.Path」中的當前值並在內部變量中使用該名稱。在用戶告訴你他們已經選擇了一些東西之後,你仍然有責任改變'File2'。 –

回答

1

下面是使用Application.FileDialog返回用戶選擇的文件名的示例。也許它會有所幫助,因爲它展示了用戶提供的價值。

編輯:修改爲「另存爲」對話框而不是「文件打開」對話框。

Sub TestFileDialog() 
    Dim Dlg As FileDialog 
    Set Dlg = Application.FileDialog(msoFileDialogSaveAs) 

    Dlg.InitialFileName = "D:\Temp\Testing.txt" ' Set suggested name for user 
               ' This could be your "File2" 

    If Dlg.Show = -1 Then 
    Dim s As String 
    s = Dlg.SelectedItems.Item(1) ` Note that this is for single-selections! 
    Else 
    s = "No selection" 
    End If 
    MsgBox s 
End Sub 

編輯二:根據評論,我拼湊了一個看似完全符合你想要的樣本。當然,您需要修改變量賦值,除非您想一遍又一遍地將同一個文件從「D:\ Temp」複製到「D:\ Temp \ Backup」。 :)

Sub TestFileMove() 
    Dim fso As FileSystemObject 

    Dim SourceFolder As String 
    Dim DestFolder As String 
    Dim SourceFile As String 
    Dim DestFile As String 

    Set fso = New FileSystemObject 
    SourceFolder = "D:\Temp\" 
    DestFolder = "D:\Temp\Backup\" 
    SourceFile = "test.txt" 
    Set InFile = fso.GetFile(SourceFolder & SourceFile) 
    DestFile = DestFolder & SourceFile 
    If fso.FileExists(DestFile) Then 
    Dim Dlg As FileDialog 
    Set Dlg = Application.FileDialog(msoFileDialogSaveAs) 
    Dlg.InitialFileName = DestFile 
    Do While True 
     If Dlg.Show = 0 Then 
     Exit Sub 
     End If 
     DestFile = Dlg.Item 

     If Not fso.FileExists(DestFile) Then 
     Exit Do 
     End If 
    Loop 
    End If 

    InFile.Move DestFile 
End Sub 
+0

測試了這個 - 當我輸入一個文件名不在目錄中(模擬一個用戶爲所選文件輸入改變後的文件名),點擊「打開」沒有返回值 - 它只是讓我在FileDialog直到通過選擇文件或單擊取消退出。 – sigil

+0

我使用了原始帖子中的'm​​soFileDialogOpen'。這使得這個文件*打開*對話框。目的是向您展示如何在顯示對話框後從用戶中檢索選擇內容。改爲將其改爲'msoFileDialogSaveAs'。 (對不起 - 我想你會修改它以適應你的需要。)你可以找到'msoFileDialogType'的文檔[here](http://msdn.microsoft.com/en-us/library/aa208726(v = office 0.11)的.aspx)。 :) –

+0

我感謝您的耐心和您的意願,協助我。我瞭解如何檢索用戶從文件對話框中選擇的文件名。我正在嘗試將重命名合併到同一個對話框中,因此用戶不必移動多個對話框來重命名文件。我已經通過包含文件列表,顯示原始文件名的輸出框以及用於輸入新文件名的輸入框來解決用戶窗體的問題。但如果你知道使用FileDialog的方法,那就太好了。 – sigil

0

下面是一些非常快速的代碼,但我基本上從不同的角度看它。您可以將一個組合框放在一個用戶窗體上,並讓它按用戶鍵入的內容列出這些項目。不是很漂亮,但是讓你更健壯的做法是一個開始。我硬編碼的目錄c:\這裏,但這可能來自一個文本框

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, 
     ByVal Shift As Integer) 

Dim varListing() As Variant 
Dim strFilename As String 
Dim strFilePart As String 
Dim intFiles As Integer 

ComboBox1.MatchEntry = fmMatchEntryNone 

strFilePart = ComboBox1.Value 

strFilename = Dir("C:\" & strFilePart & "*.*", vbDirectory) 

Do While strFilename <> "" 
    intFiles = intFiles + 1 
    ReDim Preserve varListing(1 To intFiles) 
    varListing(intFiles) = strFilename 
    strFilename = Dir() 
Loop 

On Error Resume Next 
ComboBox1.List() = varListing 
On Error GoTo 0 

ComboBox1.DropDown 

End Sub 

希望這會有所幫助。在錯誤繼續下一個不是最好的事情要做,但在這個例子中停止錯誤,如果變體沒有文件

+0

這將給組合框中的目錄列表,但我不明白這有助於重命名該文件。 – sigil

相關問題