如何将字符串类型数组转换为变体类型数组 - Excel VBA

时间:2016-05-29 21:57:09

标签: arrays string excel-vba cells variant

我正在尝试将存储在制表符分隔文本文件中的公式加载到工作表的范围中。我已经使用函数Split(Expression As String, Delimiter)将每一行依次正确加载到一维数组中,但是遇到了有关返回的数组类型的问题。

Split函数只返回字符串类型数组,我需要一个变量类型数组来设置范围。这是因为使用字符串类型数组设置单元格的公式会导致单元格值设置为原始文本,即使字符串以等号开头也是如此。

'Example code to demonstrate the problem:
Sub Tester()
    Dim StringArr(1 To 3) As String
    StringArr(1) = "= 1"
    StringArr(2) = "= 2"
    StringArr(3) = "= 3"
    Range("Sheet1!$A$1:$C$1").Formula = StringArr
    'Cells display raw string until edited manually

    Dim VariantArr(1 To 3) As Variant
    VariantArr(1) = "= 1"
    VariantArr(2) = "= 2"
    VariantArr(3) = "= 3"
    Range("Sheet1!$A$2:$C$2").Formula = VariantArr
    'Cells display formula result correctly
End Sub

结果输出:

output

我想知道是否有办法将从Split函数返回的数组转换为变量类型数组,最好没有循环。我知道我可以在循环中单独设置每个单元格公式,但我尽量保持它尽可能高效和整洁。

我正在使用Microsoft Excel for Mac 2011,版本14.5.5。 VBA正在推动我的发展。

2 个答案:

答案 0 :(得分:2)

您可以使用WorksheetFunction.Index(或Application.Index)将 String 的数组转换为 Variant / String 的数组:

Sub Test()

    StringArr = Split("=1 =2 =3")
    VariantArr = WorksheetFunction.Index(StringArr, 1, 0)
    Range("Sheet1!$A$1:$C$1").Formula = StringArr
    Range("Sheet1!$A$2:$C$2").Formula = VariantArr

End Sub

以下是数组类型:

locals

预期产量:

output

答案 1 :(得分:1)

我在那里创建了一个带有几个公式的文本文件。我用了“|”字符而不是“,”或制表符分隔。你可以使用find&在文本编辑器中替换函数以将四个空格替换为“|”如果可以的话。

Forumulas

然后我在VBA中创建了这段代码

Sub loadFormula()


Dim fso As Object, textFile As Object: Set fso = CreateObject("Scripting.FileSystemObject")
Dim textFileStr As String
Dim textFileArr As Variant
Dim outputArr() As Variant
Dim oneRow As Variant
Dim numRows, numColumns As Long

If Dir("C:\Users\dawsong4\Documents\Reports\WIP\formula.txt") = "" Then
    Exit Sub
Else
    potentialFileToLoad = "C:\Users\dawsong4\Documents\Reports\WIP\formula.txt"
End If

Set textFile = fso.OpenTextFile(potentialFileToLoad, 1)
textFileStr = textFile.ReadAll
textFile.Close

Set textFile = Nothing
Set fso = Nothing

textFileArr = Split(textFileStr, Chr(10))
numRows = UBound(textFileArr)
numColumns = UBound(Split(textFileArr(0), "|"))
ReDim outputArr(numRows, numColumns)

For ii = 0 To (numRows - 1)
    oneRow = Split(textFileArr(ii), "|")
    For jj = 0 To numColumns
    outputArr(ii, jj) = oneRow(jj)

    Next jj
Next ii

Worksheets("Data").Range("A2:P1048576").ClearContents
Worksheets("Data").Range("A2").Resize(numRows + 1, numColumns).Value = outputArr

End Sub

excel的结果是:

result

希望有所帮助!

P.S。 我想如果你使用“”四个空格(然而很多是制表符分隔的文本文件),而不是“|”它会工作相同的