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の名前を変更して[OK]をクリックすると、エラーが発生します。

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

2つ編集:コメントに基づいて、私はあなたが望むことを正確に実行しているように見えるサンプルをまとめました。もちろん、同じファイルを「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

お役に立てれば。エラーが発生した場合、次に再開するのは最善の方法ではありませんが、この例では、バリアントにファイルがない場合にエラーが発生しなくなります。

于 2011-11-18T03:59:17.940 に答える