将数据从分隔文件插入整个excel工作表范围

将数据从分隔文件插入整个excel工作表范围,excel,vba,Excel,Vba,我们正在处理一项作业,该作业需要将数据从分隔文本文件插入excel工作表。代码已经准备好并且可以工作了,但是它一个单元接一个单元地插入数据,这使得这个过程非常缓慢。请建议一种一次性将数据插入整个范围的方法,这将加快操作速度 找到下面的代码片段 Open FName For Input Access Read As #1 While Not EOF(1) Line Input #1, WholeLine If Right(WholeLine, 1) <> Se

我们正在处理一项作业,该作业需要将数据从分隔文本文件插入excel工作表。代码已经准备好并且可以工作了,但是它一个单元接一个单元地插入数据,这使得这个过程非常缓慢。请建议一种一次性将数据插入整个范围的方法,这将加快操作速度

找到下面的代码片段

    Open FName For Input Access Read As #1

While Not EOF(1)
    Line Input #1, WholeLine
    If Right(WholeLine, 1) <> Sep Then
        WholeLine = WholeLine & Sep
    End If
    ColNdx = SaveColNdx
    Pos = 1
    NextPos = InStr(Pos, WholeLine, Sep)
    While NextPos >= 1
        TempVal = Mid(WholeLine, Pos, NextPos - Pos)
        Cells(RowNdx, ColNdx).Value = TempVal
        Pos = NextPos + 1
        ColNdx = ColNdx + 1
        NextPos = InStr(Pos, WholeLine, Sep)
    Wend
    RowNdx = RowNdx + 1
Wend
打开FName以读取为#1的输入访问
而不是EOF(1)
行输入#1,整行
如果正确(整行,1)则为9月
整条线=整条线和Sep
如果结束
ColNdx=SaveColNdx
位置=1
NextPos=仪表(位置、全线、九月)
而NextPos>=1
TempVal=Mid(全线、Pos、下一个Pos-Pos)
单元格(RowNdx,ColNdx).Value=TempVal
Pos=NextPos+1
ColNdx=ColNdx+1
NextPos=仪表(位置、全线、九月)
温德
RowNdx=RowNdx+1
温德

您可以尝试在Excel中以csv/txt文件的形式打开带分隔符的文件:太快了
或者,您可以逐个单元格创建并填充二维变量数组,然后将变量数组指定给Excel范围。这会更快,因为它将对象模型开销降至最低。

为什么不能像在Excel中一样打开csv文件(或变体)

下面的代码将每一行作为变量数组导入,然后逐行转储到Excel。在将数据输入Excel之前,我可能应该更进一步,将每个行数组转储到单个组合数组中,但我这样做是因为我不清楚为什么您会忽略单个整体输入

此外,我认为这些行是多余的,因为它只是在最右边的单元格中添加了一条空白的“记录”

 If Right(WholeLine, 1) <> Sep Then    
 WholeLine = WholeLine & Sep   
 End If
如果正确(全行,1)则
整条线=整条线和Sep
如果结束
主代码

Sub Test()

Dim fName As String
Dim Sep As String
Dim WholeLine As String
Dim lngCnt As Long
Dim aRRSplit()

fName = "c:\test.csv"
Sep = ","

Open fName For Input Access Read As #1

While Not EOF(1)
    Line Input #1, WholeLine
    If Right$(WholeLine, 1) <> Sep Then
        WholeLine = WholeLine & Sep
    End If
    aRRSplit = Application.Transpose(Split(WholeLine, Sep))
    lngCnt = lngCnt + 1
    Cells(lngCnt, 1).Resize(1, UBound(aRRSplit)) = Application.Transpose(aRRSplit)
Wend
Close #1
End Sub
子测试()
作为字符串的Dim fName
将Sep设置为字符串
像细绳一样模糊的整条线
暗长
Dim arrspit()
fName=“c:\test.csv”
Sep=“,”
打开fName以读取为#1的输入访问
而不是EOF(1)
行输入#1,整行
如果正确$(整行,1)则为9月
整条线=整条线和Sep
如果结束
aRRSplit=Application.Transpose(Split(WholeLine,Sep))
lngCnt=lngCnt+1
单元格(lngCnt,1).Resize(1,UBound(arrspilt))=Application.Transpose(arrspilt)
温德
关闭#1
端接头

以下是我在网上找到的一些代码,这些代码对我来说很快就能生效

Function doFileQuery(fileName As String, outSheet As String) As Boolean

Dim rootDir As String

rootDir = "W:\Development"

Dim connectionName As String

connectionName = "TEXT;" + rootDir + "\" + fileName

With Worksheets(outSheet).QueryTables.Add(Connection:=connectionName, Destination:=Worksheets(outSheet).Range("A5"))

    .Name = fileName
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlOverwriteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileOtherDelimiter = "|"
    .Refresh BackgroundQuery:=False

End With
doFileQuery = True
End Function
希望这有帮助

我更倾向于你的第一个建议。直接使用Excel打开文本文件。这将非常快:)