Excel VBA:为QueryTable.TextFileColumnDataTypes赋值变量是否可行?
关于VBA中QueryTables.TextFileColumnDataTypes赋值方式的疑问解答
嘿,这个写法是不正确的哦,我来给你捋清楚问题出在哪,以及怎么改才对:
问题根源
TextFileColumnDataTypes属性要求接收的是一个Variant类型的数组,而你现在把strMyArray定义成了字符串类型,直接将字符串赋值给这个属性会触发类型不匹配的错误——VBA没办法自动把"Array(1,1,1,9)"这样的字符串转换成实际的数组对象。
正确的实现方式
方法1:用Variant变量直接存储数组(推荐)
这是最稳妥、可读性最高的写法,直接把数组赋值给Variant类型的变量,再传递给属性:
Dim arrColumnTypes As Variant Dim someVariable As Integer ' 这里替换成你的分支判断变量 Select Case someVariable Case 1 arrColumnTypes = Array(1, 1, 1, 9) Case 2 arrColumnTypes = Array(1, 1, 1, 1, 1, 1, 1, 9) ' 可以继续添加其他Case分支 End Select With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & strFileToOpen, Destination:=Range(rngFirstCell.Address)) .TextFileColumnDataTypes = arrColumnTypes End With
方法2:用Eval函数转换字符串(不推荐)
如果一定要用字符串形式存储数组定义,可以借助Eval函数把字符串转换成数组,但这种方式存在安全风险(Eval会执行字符串中的代码),而且可读性差,仅作了解:
Dim strMyArray As String Dim someVariable As Integer Select Case someVariable Case 1 strMyArray = "Array(1,1,1,9)" Case 2 strMyArray = "Array(1,1,1,1,1,1,1,9)" End Select With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & strFileToOpen, Destination:=Range(rngFirstCell.Address)) .TextFileColumnDataTypes = Eval(strMyArray) End With
总结
优先选择方法1,直接用Variant变量存储数组,既避免了类型错误,代码也更清晰易维护。
内容的提问来源于stack exchange,提问作者GavinX
相关产品推荐
相关产品推荐

