我收到了一个由不再为公司工作的其他人写的VBA宏,并要求添加其他功能。此宏使用我不熟悉的QueryTables方法将数据从固定宽度的文本文件导入Excel。该文件在第一行中有一些基本信息(日期和时间,记录号等),实际数据从第二行开始。文本文件只有4列,并使用引号指示一个传感器的数据结束而另一个传感器的数据在该列内开始。例如:
20140529 15:11:42 Rec# 0001
'SENSOR1 ''SENSOR2 ''SENSOR3 ''SENSOR4 '
0.00000 1500.00 1.05400E-01 0.123799E-02
0.100000 1510.00 -7.68900E-01 0.404716E-02
'SENSOR5 ''SENSOR6 ''SENSOR7 ''SENSOR8 '
0.710000E-01 0.250000E-01 2.12500 1.87100
0.450000E-01 0.290000E-01 2.36200 2.19200
最初,宏将开始在第2行导入,跳过标题信息并将每个传感器粘贴到其自己的列中。这是原始的QueryTables代码:
' Input Unigraph file
fileName = "TEXT;H:\ModeShapeData.input"
With ActiveSheet.QueryTables.Add(Connection:=fileName, _
Destination:=Sheets("Data").Range("$A$1"))
.Name = "ModeShapeData.input"
.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 = 2
.TextFileParseType = xlFixedWidth
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1)
.TextFileFixedColumnWidths = Array(18, 18, 18)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
我将.TextFileStartRow
值更改为1,这样我就可以获得标题信息以及数据,但是导致数据导入的数据与文本文件中的数据完全相同,而不是将每个传感器放入它自己的专栏。
我只能假设有一种简单的方法来获取导入的标题信息,或者单独保留此代码并单独导入第一行或者通过更改With块中的某些内容来获取超过4列。
更新
我找到了解决问题的方法,将原始代码保留原样,然后创建一个额外的子程序,再次执行到第1行而不是第2行的新工作表,然后从中提取信息该表而不是数据表。如果有人想出一个更清洁的解决方案,我会把它留在这里。