использование Application.FileDialog для переименования файла в VBA - PullRequest
0 голосов
/ 18 ноября 2011

Использование 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 и нажму «ОК»', Я получаю сообщение об ошибке:

Run-time error '53': File not found

и затем вход в отладчик показывает, что значение file2.name равно <File not found>.

Я не уверен, что здесь происходит-- ссылка на объект теряется после переименования файла?Есть ли более простой способ переименовать пользователя из диалогового окна, в котором отображаются все файлы в целевом каталоге?Я также хотел бы предоставить новое имя по умолчанию для файла, но не могу понять, как бы я это сделал, используя этот метод.

edit: на данный момент я пытаюсь создать пользовательскую формусо списком, который заполняется с соответствующими именами файлов, и полем ввода со значением по умолчанию для ввода нового имени.Тем не менее, вы не знаете, как удерживать ссылку на объект после переименования файла.

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Вот пример использования 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 голосов
/ 18 ноября 2011

Вот несколько действительно быстрых кодов, которые я набрал, но в основном смотрю на них под другим углом. Вы можете поместить комбинированный список в пользовательскую форму и заставить его перечислять элементы в качестве пользовательских типов. Не красиво, но это начало для вас, чтобы сделать более крепким. Я жестко закодировал каталог 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

Надеюсь, это поможет. Возобновление при следующей ошибке - не лучшая вещь, но в этом примере она останавливается с ошибкой, если у варианта нет файлов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...