从文本文件加载VBA中的数据

时间:2010-05-21 18:50:26

标签: file vba text load

我对VBA不是很熟悉,但需要将它用于我正在使用的新软件程序(不是微软相关的)

我有一个文本文件,其中包含我想要读入VBA的数据列。

具体来说,文本文件每行有4个条目。因此,我想加载列向量(N乘1)。

文本文件由每个条目之间的空格分隔。

所以例如我想加载第一列并将其保存为数组A,然后保存为第二列并保存为数组B,然后保存为第三列并保存为数组C,然后保存为第四列并保存为数组D.

我在http://www.tek-tips.com/faqs.cfm?fid=482下面找到的代码片段是我发现的可以在文本中加载到数组的东西,但我需要调整它以便能够将列保存为上面指定的不同数组... < / p>

Open "MyFile.txt" For Input As #1
ReDim Txt$(0)
Do While Not EOF(1)
ReDim Preserve Txt$(UBound(Txt$) + 1)
Input #1, Txt$(UBound(Txt$))
Loop
Close #1

3 个答案:

答案 0 :(得分:1)

对于此示例,您需要在与文本文件相同的目录中使用名为schema.ini的文件。它应该包含:

[Import.txt]
Format=Delimited( )

其中Import.txt是文件的名称(http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx)。

然后你可以使用它,它应该在VBScript或VBA中工作,几乎没有篡改:

Set cn = CreateObject("ADODB.Connection")

'Note HDR=Yes, that is, first row contains field names '
'and FMT delimted, ie CSV '

strCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Docs\;" _
& "Extended Properties=""text;HDR=Yes;FMT=Delimited"";"

cn.Open strcon

strSQL="SELECT * FROM Import.txt" _

set rs = createobject("adodb.recordset")

rs.open strSQL,cn

MsgBox rs(2)
MsgBox rs.GetString

第一个消息框应该返回第一行的第三列,它是一个可以运行的测试。

第二个消息框应该返回整个文件,因此不要将它与大集合一起使用。可以操作记录集,也可以使用.GetRows创建值数组(http://www.w3schools.com/ado/met_rs_getrows.asp

答案 1 :(得分:1)

似乎剩下的问题是从一个行数组转换为四个列数组。 也许这个片段有帮助

Option Explicit
Option Base 0

Sub import()
    Dim sTxt() As String
    Dim sLine As Variant
    Dim iCountLines As Long
    Dim iRowIterator As Long
    Dim i As Long
    Dim sRow() As String
    Dim sColumnA() As String
    Dim sColumnB() As String
    Dim sColumnC() As String
    Dim sColumnD() As String

    ' read in file '
    Open "MyFile.txt" For Input As #1
    ReDim sTxt(0)

    Do While Not EOF(1)
        Input #1, sTxt(UBound(sTxt))
        ReDim Preserve sTxt(UBound(sTxt) + 1)
    Loop
    Close #1

    ' dim array for each columns '
    iCountLines = UBound(sTxt)
    Debug.Print "working with ", iCountLines, "lines"
    ReDim sColumnA(iCountLines)
    ReDim sColumnB(iCountLines)
    ReDim sColumnC(iCountLines)
    ReDim sColumnD(iCountLines)

    ' "transpose" sTxt '
    iRowIterator = 0
    For Each sLine In sTxt
        sRow = Split(sLine, " ")
        If UBound(sRow) = 3 Then
            sColumnA(iRowIterator) = sRow(0)
            sColumnB(iRowIterator) = sRow(1)
            sColumnC(iRowIterator) = sRow(2)
            sColumnD(iRowIterator) = sRow(3)
            iRowIterator = iRowIterator + 1
        End If
    Next sLine

    ' now work with sColumnX '
    Debug.Print "Column A"
    For i = 0 To iCountLines
        Debug.Print sColumnA(i)
    Next i

End Sub

答案 2 :(得分:0)

你的问题中很少有细节,但我建议使用“Text to column”

如果您对VBA编程不是很熟悉,请尝试使用以下步骤录制宏:

  1. 将文件导入Excel
  2. 选择A列
  3. 选择“文本到列”表单工具菜单
  4. 选择以空格分隔
  5. 通过这种方式,您将获得所要求的数据数组,现在分配给您想要的任何变量应该不是问题。

    编辑(不使用Excel):

    看一下FSO方法。

    替换

      

    MsgBox strLing

    有某种分割功能,比如

    strTemp = Split(strLine, " ")
    

    您将能够遍历源文件中的所有值,这会起作用吗?