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
しかし、私はFILE2の名前を変更し、「OK」をクリックすると、私はエラーを取得する:その後、
Run-time error '53': File not found
とデバッガに行くことというの値を示していますfile2.nameは<File not found>
です。
私はここで何が起こっているのか分かりません - ファイルの名前が変更されたらオブジェクト参照が失われていますか?ターゲットディレクトリ内のすべてのファイルを表示するダイアログから名前を変更できるようにする簡単な方法はありますか?私はまた、ファイルの既定の新しい名前を提供したいと思いますが、私はこの方法を使用して私はそれをやってみることができません。
編集:この時点では、関連するファイル名で入力されたリストボックスと新しい名前を入力するための既定値を持つ入力ボックスを持つユーザーフォームを作成しています。しかし、ファイルの名前が変更されたらオブジェクト参照を保持する方法はまだわかりません。
ダイアログを表示した後、「File2.Name」を変更することは何もしていません。あなたが変えようとしている変数が魔法のように分かっているわけではありません。ユーザーが指定した値を新しいファイル名として取得して使用する必要があります。ダイアログを表示し、そこから使用できるものをすべて破棄し、元のフォルダとファイル名を使用して元の移動操作を実行しようとしています。 –
@KenWhite、私はFile2.Nameが何らかの形でシステム内のファイルの名前に何らかの形でリンクしていると思っていました。そして、ユーザーがファイルをダブルクリックしてファイル名を変更して再入力するとFile2の値が変わります。名前の変更。これはそうではありません? – sigil
いいえ、そうではありません。あなたはファイルを開いています。ダイアログにはディスクフォルダの内容が表示され、ユーザは場所を選択できますが、あなたの心やコードを何とか読んでも、その場所が何らかの形で「File2」に影響することを意味することはわかりません。私はあなたが 'InitialFileName'を 'File2'に関連するものに割り当てるので、あなたは混乱していると思います。あなたはそのファイルにダイアログを添付すると思います。それは単に 'File2.Path'にある値を読み込み、その名前を内部変数で使用するだけです。ユーザーが何かを選択したことを知らせた後、あなたは 'File2'を変更する責任があります。 –