2017-11-08 3 views
0

これは本当に愚かな方法ですが、3つのユーザー入力を許可するユーザーフォームがあります。テキストファイルテキストファイルの名前、およびテキストファイルからデータをインポートする場所を指定します。私がしたいのは、ユーザーが入力したパスをたどり、ユーザーが入力した名前でテキストファイルを取得し、ユーザーが入力した範囲にテキストファイルの内容を置きます。VBA Excel:ユーザーフォームのテキストボックスを使用してテキストファイルをインポートするパスを指定する

私はそれがApplication.GetOpenFilenameを使用して簡単に簡略化することができますが、あなたは何をしなければならないのか分かります。私がする必要があるのは、パスを指定し、テキストファイルを指定し、テキストファイルからすべてのテキストをカンマ区切り文字で範囲にロードする場所を指定できるようにすることです。現在、プログラムは ".Refresh BackgroundQuery:= False"という行を改行するか、まったく何もしないので、前進する方法はわかりません。私のコードは以下の通りです。もしあなたが助けることができるなら私に教えてください!テキストファイルが配置されているパス、テキストファイルの名前、およびからデータをインポートする場所:

Private Sub OKButton_Click() 

Dim filePath As String, destin As String, fileName As Variant 

destin = DestinationTextBox.Value 
fileName = TextFileNameTextBox.Value 

filePath = Dir(FileLocationTextBox.Value) 

'filePath = Application.GetOpenFilename("Text Files (*.txt), *.txt") 
'oh, if only 

    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & _ 
    filePath, Destination:=Range(destin)) 
     .Name = fileName & ".txt" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 437 
     .TextFileStartRow = 1 
     .TextFileParseType = xlDelimited 
     .TextFileTextQualifier = xlTextQualifierNone 
     .TextFileConsecutiveDelimiter = True 
     .TextFileTabDelimiter = False 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = True 
     .TextFileSpaceDelimiter = False 
     .TextFileOtherDelimiter = "" & Chr(10) & "" 
     .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, _ 
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _ 
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _ 
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 
End With 
End Sub 
+0

ます[編集] carifyすることができます –

+0

を私はしました。?それを編集しました。もっと明確にする必要がある場合はお知らせください。 –

答えて

1

が、私は3つの事のためにユーザーの入力を可能にするユーザーフォームを持っていますテキストファイル。

私はパスとファイル名を分離するのにはまったく理由がないと思うことがあります。特にそうすると、ユーザエラーの機会が増えてしまいます。つまり、多くのエラー処理太い指や間違ったファイル名やパスに対処するロジック、パスの末尾にパスセパレータを一貫して使用する(または後で連結するなど)などを保証するロジック。

これは適切なトラックにあなたを設定する必要があります。 TextBoxイベントのいずれかを使用してApplication.FileDialog(msoFileDialogFilePicker)を呼び出し、選択した項目に値(フルパス)をTextBoxに戻します。

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
' this event fires when user clicks in the textbox 
' you may need to use other events also, but this is to illustrate 
' call the procedure that actually does the work: 
TextBox1.Value = getFileToOpen 
End Sub 
Private Function getFileToOpen() 
' this function opens the FileDialog and returns the name of the selected file 
Dim fileName As String 
Dim fdlg As FileDialog 
Dim f As FileDialogFilter 
Set fdlg = Application.FileDialog(msoFileDialogFilePicker) 
fdlg.Filters.Clear 
Set f = fdlg.Filters.Add("Text Files", "*.txt", 1) 
fdlg.FilterIndex = 1 
If fdlg.Show Then 
    fileName = fdlg.SelectedItems(1) 
End If 
getFileToOpen = fileName 

End Function 

あなた絶対にgetFileToOpen関数から結果の値を解析し、必要に応じて、いくつかのテキストボックスに割り当て、その後、2つのTextBoxアプローチを維持する必要があります。

また、DestinationTextBox.Valueは、ではなく、RefEditのコントロールである必要があります。 RefEditコントロールは、ユーザーが一連のセルを選択できるように特別に設計されています。あなたのクエリテーブルで1004エラーを想定し

は、1人のおそらく犯人はあなたがパスではなく、ファイルの名前を提供したことです。これを行うと:

filePath = Dir(FileLocationTextBox.Value) 

filePathは今ないパスを表すが、ファイルName!したがって、識別子filePathは混乱します。なぜなら、それは含まれていないからです。

With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & _ 
    filePath 

そして、このファイル名前は(そう、しかし可能)アクティブなブックのディレクトリに存在しない限り、1004エラーがこのコードの唯一の可能な結果であり、あなたがfilePath変数にを参照しているファイルをbecuaseアクティブディレクトリに存在しません。

(技術的にはこのだけの作業ディレクトリ内のファイルに解決することができますが、オッズは、そのようなファイル名は、私はあなたが有効なを持っていることを確認するためにFileDialogを使用して(上記の提供ソリューションにより構築し、その代わり

存在しないことがありますファイルパス/ファイル名の不器用なユーザの入力に依存することなく、使用するために)、次の操作を行います。私は二度あなたのポスト、質問が何であるかは考えて読んだ

Dim fullFileName as String 
fullFileName = TextFileNameTextBox.Value 
' Make sure there's a value here 
If fullFileName = vbNullString Then Exit Sub 
' double-check that it's a valid path: 
If Len(Dir(fullFileName)) = 0 Then Exit Sub 

With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & _ 
    fullFileName & , ... 
+0

これは非常に役に立ちました。私はすぐに問題を理解しました。悲しいことに、2つのテキストボックスのフォーマットを維持する必要がありますが(ヒューマンエラーの可能性は非常に高いですが)、ファイルパスで名前として指定した作業は、完璧な道。名声<3 –

関連する問題