我对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
答案 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编程不是很熟悉,请尝试使用以下步骤录制宏:
通过这种方式,您将获得所要求的数据数组,现在分配给您想要的任何变量应该不是问题。
编辑(不使用Excel):
看一下FSO方法。
替换
MsgBox strLing
有某种分割功能,比如
strTemp = Split(strLine, " ")
您将能够遍历源文件中的所有值,这会起作用吗?