我使用Workbooks.OpenText方法在Excel中使用VBA打开文本文件,并希望将活动工作簿的单元格(例如B5)中的值传递到FieldInfo参数中。具体来说,我想修改以下代码:
Dim inputDir As String
Dim outputDir As String
Dim myFile As String
Dim inputDelim As String
Dim formatOptions As Variant
myFile = Range("B1").Value
inputDir = Range("B2").Value
outputDir = Range("B3").Value
inputDelim = Range("B4").Value
formatOptions = Range("B5").Value
Workbooks.OpenText Filename:=inputDir & myFile, StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlNone, _
Other:=True, OtherChar:=inputDelim, _
FieldInfo:=formatOptions
B5中的值是
Array(Array(1, 2), Array(2, 2), Array(3, 1), Array(4, 2), _
Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1))
当您将此值硬编码到上面代码的最后一行中的formatOptions时,一切正常,即...
Workbooks.OpenText Filename:=inputDir & myFile, StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlNone, _
Other:=True, OtherChar:=inputDelim, _
FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 1), Array(4, 2), _
Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1))
我认为问题在于传递被引号包围的文本。对于OtherChar参数中的分隔符规范,如果您对其进行硬编码,则应包括引号:" |"例如。但是在formatOptions参数中,你不要在数组代码周围加上引号。
我知道可能有更好的方法将列类型数组传递给Workbooks.OpenText但我认为这个问题会出现在其他环境中,并且想要了解它为什么不起作用以及可以做些什么来代替传递一个字符串,它将数组作为对象/代码传递(Set方法不起作用)。我已经搜索了几个小时的解决方案但找不到一个,虽然我觉得答案非常简单,我不是在寻找正确的单词。我在整个网络上看到过类似的问题,但没有具体解决这个问题。如果我忽略了某些事情,我会道歉。
提前感谢您提供的任何帮助。
答案 0 :(得分:1)
基于MSDN documentation fieldInfo
输入参数
包含各个数据列的解析信息的数组。解释取决于DataType的值。当。。。的时候 data是分隔的,这个参数是一个双元素数组的数组, 每个双元素数组指定a的转换选项 特别栏目。第一个元素是列号(从1开始), 第二个元素是XlColumnDataType常量之一 指定如何解析列。
因此,为了能够使用它,您需要定义一组数字数组:
1,2
2,2
3,1
...
我保存这个:
Array(Array(1, 2), Array(2, 2), Array(3, 1), Array(4, 2), _
Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1))
为:
1,2;2,2;3,1;4,2;5,1;6,1;7,1;8,1
然后我会尝试使用类似于以下的函数将其拆分:
Function GetFieldInfoFromCell(ByVal rCell As Range) As Variant
Dim i As Integer
Dim fi As String, fis() As String
Dim fieldInfo() As Variant
fi = rCell
fis = Split(fi, ";")
ReDim Preserve fieldInfo(UBound(fis))
For i = LBound(fis) To UBound(fis)
fieldInfo(i) = Array(Split(fis(i), ","))
Next
GetFieldInfoFromCell = fieldInfo
End Function
用法:
Dim fieldInfo As Variant
'later
fieldInfo = GetFieldInfoFromCell(ThisWorkbook.Worksheets(1).Range("B5"))
注意:未经测试!