遍历文本文件以将行读入excel VBA中的类模块

时间:2018-08-16 19:47:43

标签: excel vba

我实际上需要做的:将文本文件读入VBA,并使文件的每一行成为类模块的单独实例

我的文本文件中有数据

2018-08-10 12:00:00 | B | 34328 | SPY | ARCA || 100 | 200.4
2018-08-10 13:43:00 | B | 343 | SPY | ARCA || 100 | 200.8
2018-08-10 13:50:00 | S | 2809 | SPY || 100 | 201.2
2018-08-10 13:55:00 | B | 34878 | SPY || 100 | 200.9

我正在做VBA练习。我需要将该文件读入一个类模块,以便该模块的每个实例都是文件的一行。最终,我将不得不对包含的数字进行分析。

我的准则是: -该文件只需要读取一次 -代码必须是纯vba-我不必修改现有的电子表格

到目前为止,我已经尝试过:

-创建类模块

' Class Module: Trade
Public Fill As String

---在其他模块中

Public myFile As String
Sub defineVar()
myFile = Range("$A$2")
End Sub
Sub readFills()

Call defineVar

Dim dict
Set dict = CreateObject("Scripting.Dictionary")

Dim fill_ID As Long
fill_ID = 0

Open myFile For Input As #1

Do Until EOF(1)
Line Input #1, fileLine
dict.Add Key:=fill_ID, Item:=fileLine
 Dim name As New trade
 name.Fill = dict(fill_ID)
 fill_ID = fill_ID + 1
 Debug.Print name.Fill
Loop
Close #1

End Sub

这可以读取文件的每一行,但是我只有一个实例(文件的最后一行),尽管我有完整的字典。是否可以动态创建类模块的“实例”?我会以错误的方式处理吗?

2 个答案:

答案 0 :(得分:0)

Do Until EOF(1)
Line Input #1, fileLine
dict.Add Key:=fill_ID, Item:=fileLine
 Dim name As New trade
 name.Fill = dict(fill_ID)
 fill_ID = fill_ID + 1
 Debug.Print name.Fill
Loop
Close #1

在上面的代码中,好像您的“交易”对象在循环的每次迭代中都被覆盖(这就是为什么您仅看到文件的最后一行的原因)。

如果您希望文件的所有行都作为“交易”类型的对象的集合,则应将其添加到容器中。我经常为此使用收藏,例如:

dim trades as New Collection

然后在循环中简单地编写

trades.add name 'this creates a collection of trade objects from each line from the file

如果您将贸易对象名称添加到也是集合的字典中,则可以执行类似的操作

答案 1 :(得分:0)

您需要对代码进行几处更改。首先,在循环外声明您的类变量。其次,在循环内创建一个新实例。第三,将该实例添加到集合中。例如,

Dim name As Trade
Dim names As Collection

Set names = New Collection
Open myFile For Input As #1

Do Until EOF(1)
   Line Input #1, fileLine
   dict.Add Key:=fill_ID, item:=fileLine
   Set name = New Trade
   name.Fill = dict(fill_ID)
   names.Add name
   fill_ID = fill_ID + 1
   Debug.Print name.Fill
Loop

Close #1