0

使用 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

但是当我重命名 file2 并单击“确定”时,出现错误:

Run-time error '53': File not found

然后进入调试器显示 file2.name 的值为<File not found>.

我不确定这里发生了什么——文件重命名后对象引用是否丢失?有没有更简单的方法让用户从显示目标目录中所有文件的对话框中重命名?我还想为文件提供一个默认的新名称,但我看不出如何使用这种方法来做到这一点。

编辑:此时我正在考虑制作一个用户窗体,其中包含一个列表框,该列表框填充了相关文件名,以及一个带有用于输入新名称的默认值的输入框。不过,仍然不确定如何在文件重命名后保留对象引用。

4

2 回答 2

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
于 2011-11-19T00:12:57.307 回答
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

希望这可以帮助。On error resume next 不是最好的办法,但在这个例子中,如果变体没有文件,它会停止出错

于 2011-11-18T03:59:17.940 回答