好的,我知道这是一个非常愚蠢的方法,但我有一个userform,允许用户输入3件事:文本文件所在的路径,文本文件的名称,以及从文本文件导入数据。我想要做的是遵循用户输入的路径,通过用户输入的名称获取文本文件,并将文本文件包含的内容放入用户输入的范围。
我知道可以使用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 :(得分:1)
但我有一个userform,允许用户输入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
如果你绝对必须保持两个TextBox
方法,那么从getFileToOpen
函数解析结果值并根据需要分配给几个文本框。
此外,您的DestinationTextBox.Value
应该是RefEdit
控件,而不是TextBox
。 RefEdit
控件专门用于允许用户选择一系列单元格。
假设您的QueryTable出现1004错误,可能的罪魁祸首是您提供了路径而不是文件的名称。当你这样做时:
filePath = Dir(FileLocationTextBox.Value)
filePath
现在代表不是 路径,而是文件Name
!因此标识符filePath
令人困惑,因为它不是它所包含的内容。
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & _
filePath
除非此文件 name 存在于活动工作簿的目录中(不太可能,但可能),否则1004错误是此代码的唯一可能结果,因为您在{中引用的文件活动目录中不存在{1}}变量。
(从技术上讲,这个只能解析到工作目录中的文件,但很可能没有这样的文件名
相反,建立在我上面提供的解决方案(使用filePath
以确保您使用有效的文件路径/文件名,而不依赖于笨拙的用户输入),执行此操作:
FileDialog