VBA将单元格引用传递给方法参数值

我正在使用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,但我认为这个问题会出现在其他上下文中,并想了解为什么它不工作,可以做什么,而不是通过一个string,它作为对象/代码传递数组(Set方法不起作用)。 我已经search了很多小时的解决scheme,找不到一个,虽然我有一个感觉,答案是非常简单的,我不是在寻找正确的话。 我在整个networking中看到过类似的问题,但没有具体解决这个问题。 道歉,如果我忽略了一些东西。

提前感谢您的帮助,我可以得到。

基于MSDN文档的 fieldInfoinput参数是

包含单个数据列的parsing信息的数组。 解释取决于DataType的值。 数据分隔时,此参数是一个由两个元素组成的数组,每个两元素数组指定特定列的转换选项。 第一个元素是列号(从1开始),第二个元素是指定如何parsing列的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来分割它:

 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")) 

注意:未testing!