2011-11-18 25 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 

しかし、私はFILE2の名前を変更し、「OK」をクリックすると、私はエラーを取得する:その後、

Run-time error '53': File not found 

とデバッガに行くことというの値を示していますfile2.nameは<File not found>です。

私はここで何が起こっているのか分かりません - ファイルの名前が変更されたらオブジェクト参照が失われていますか?ターゲットディレクトリ内のすべてのファイルを表示するダイアログから名前を変更できるようにする簡単な方法はありますか?私はまた、ファイルの既定の新しい名前を提供したいと思いますが、私はこの方法を使用して私はそれをやってみることができません。

編集:この時点では、関連するファイル名で入力されたリストボックスと新しい名前を入力するための既定値を持つ入力ボックスを持つユーザーフォームを作成しています。しかし、ファイルの名前が変更されたらオブジェクト参照を保持する方法はまだわかりません。

+3

ダイアログを表示した後、「File2.Name」を変更することは何もしていません。あなたが変えようとしている変数が魔法のように分かっているわけではありません。ユーザーが指定した値を新しいファイル名として取得して使用する必要があります。ダイアログを表示し、そこから使用できるものをすべて破棄し、元のフォルダとファイル名を使用して元の移動操作を実行しようとしています。 –

+0

@KenWhite、私はFile2.Nameが何らかの形でシステム内のファイルの名前に何らかの形でリンクしていると思っていました。そして、ユーザーがファイルをダブルクリックしてファイル名を変更して再入力するとFile2の値が変わります。名前の変更。これはそうではありません? – sigil

+1

いいえ、そうではありません。あなたはファイルを開いています。ダイアログにはディスクフォルダの内容が表示され、ユーザは場所を選択できますが、あなたの心やコードを何とか読んでも、その場所が何らかの形で「File2」に影響することを意味することはわかりません。私はあなたが 'InitialFileName'を 'File2'に関連するものに割り当てるので、あなたは混乱していると思います。あなたはそのファイルにダイアログを添付すると思います。それは単に 'File2.Path'にある値を読み込み、その名前を内部変数で使用するだけです。ユーザーが何かを選択したことを知らせた後、あなたは 'File2'を変更する責任があります。 –

答えて

1

ここでは、Application.FileDialogを使用してユーザーが選択したファイル名を返します。おそらく、ユーザーが提供した価値を引き出すことを示しているので、役立つでしょう。

EDIT:[ファイルを開く]ダイアログではなく[名前を付けて保存]ダイアログに変更しました。

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"に何度も何度もコピーしない限り、変数の割り当てを変更する必要があります。 :)

+0

これをテストしました - 選択したファイルの変更されたファイル名を入力しているユーザーをシミュレートしたディレクトリにまだ存在しないファイル名を入力したとき、 "開く"をクリックしても値は返されませんでした。ファイルを選択するか、[キャンセル]をクリックして終了します。 – sigil

+0

元の投稿から 'msoFileDialogOpen'を使用しました。これはファイル* open *ダイアログになります。その目的は、ダイアログを表示した後にユーザーから選択内容を取得する方法を示すことでした。代わりに 'msoFileDialogSaveAs'に変更してください。 (申し訳ありません - 私はあなたのニーズに合うように修正したいと思っていました) 'msoFileDialogType' [here]のドキュメントを見ることができます(http://msdn.microsoft.com/en-us/library/aa208726(v= office .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

関連する問題