VBA:字符串和数组 - 将1d数组拆分为2d数组

时间:2017-09-12 08:08:22

标签: string vba excel-vba multidimensional-array excel

我有一个String数组,其中包含以“。”分隔的项目字符串。

例:

0: Test1.Test2.Test3.Test4.Test5
1: Testa.Testb.Testc.Testd.Teste
...

我需要将这些字符串拆分为2D String数组,每个数组包含5个元素。

例:

0, 0: Test1
0, 1: Test2
...
1, 0: Testa
1, 1: Testb
...

我有点挣扎,因为这不像C或C#。

在测试和尝试时,这有效:

注意:testList是一个类似第一个例子的数组,包含“。”条目 - 分隔的字符串。它是这样创建的,来自一个名为strArray的长字符串:

testList = Split(textline, "<")     

Dim temp() As String
temp = Split(testList(0), ".")
MsgBox Join(temp, vbCrLf)

上面,我只是创建一个新的1D String数组temp()并将String数组testList的第一个索引拆分为该数组。工作正常。

但是,当我尝试创建一个2D String数组并将testList String数组的第一个索引拆分为第一个索引时,它不起作用:

Dim indTestsList() As String               'New String array
ReDim indTestsList(arrSize, 5)             'Initialize the 2D size
'MsgBox "arrSize " & arrSize
indTestsList(0) = Split(testList(0), ".")  'Split into the first array
'MsgBox Join(indTestsList(0), vbCrLf)

这给出了错误

Type mismatch

所以,很明显我没有正确地声明或创建2D数组,或者我试图将错误的地方插入到错误的地方。我只是看不到/在哪里?

但是,如果我只是将字符串插入2D数组而不是分割,它就可以工作:

Dim indTestsList() As String
ReDim indTestsList(arrSize, 5)
indTestsList(0, 0) = "dritt"
indTestsList(0, 1) = "piss"
MsgBox indTestsList(0, 0)
MsgBox indTestsList(0, 1)

'However, this does not work. Why? Subscript out of range...
MsgBox Join(indTestsList(0), vbCrLf) 

所以我似乎能够创建一个2D String数组并以最简单的方式填充它。不仅如此。

很抱歉没有在这里获得VBA语法和标准,但我一直在反对这一点。当然,网上可能会有这方面的帮助,但我发现的并不是我所需要的。这里有任何帮助,所有建设性的答案当然都会得到记录。

(最终)更新

下面有很多好的建议。我有点挣扎,但ExcelinEfendisi让我走上了一条简单易用的解决方案。我正在发布我在这里选择的解决方案,并将答案归功于他。

Dim intCount        As Integer
Dim intCount2       As Integer
Dim tempArray1d()   As String
Dim finalArray2d()  As String

...

'Resize the array for holding the final ordered sets of tests:
ReDim finalArray2d(arrSize, 5)

'Loop through the testList() array and Split each array into the 2d 
'finalArray2d:
For intCount = LBound(testList) To UBound(testList) - 2
    'Split the first line in testList() into tempArray1d():
    tempArray1d = Split(testList(intCount), ".")
    'Copy the elements from tempArray1d() to the current x index of 
    'tempArray2d():
    For intCount2 = 0 To 4
        finalArray2d(intCount, intCount2) = tempArray1d(intCount2)
    Next intCount2
Next intCount

我已经删除了其他更新,因为我认为它们发展成了比必要更多的噪音和混乱。感谢那些回答和帮助的人。

2 个答案:

答案 0 :(得分:1)

我将如何解决这个问题:

Public Sub TestMe()

    Dim arrInitial  As Variant
    Dim arrTemp     As Variant
    Dim arrResult   As Variant

    Dim lngRowS     As Long
    Dim lngColS     As Long

    Dim lngRow      As Long
    Dim lngCol      As Long

    arrInitial = Array("Test1.Test2.Test3", "TestA.TestB.TestC")
    lngRowS = UBound(arrInitial)
    lngColS = UBound(Split(arrInitial(0), "."))

    ReDim arrResult(lngRowS, lngColS)

    For lngRow = 0 To lngRowS
        For lngCol = 0 To lngColS
            arrTemp = Split(arrInitial(lngRow), ".")
            arrResult(lngRow, lngCol) = arrTemp(lngCol)
        Next lngCol
    Next lngRow

    For lngRow = 0 To lngRowS
        For lngCol = 0 To lngColS
            Debug.Print lngRow; lngCol; arrResult(lngRow, lngCol)
        Next lngCol
    Next lngRow

End Sub

这是你得到的输出:

 0  0 Test1
 0  1 Test2
 0  2 Test3
 1  0 TestA
 1  1 TestB
 1  2 TestC

可能用较少的变量可以完成,但这种方式是可以理解的。我们的想法是获取新2D阵列(lngRowSlngColS)的总行数和列数,并使用嵌套循环编写它们。

答案 1 :(得分:1)

此代码将执行

    $episode->published_at = $request->get('published_at');
    $episode->number       = $request->get('number');
    $episode->active       = $request->get('active');

    $episodeContent        = new EpisodeContent;
    $episodeContent->title = $request->get('title');

    $episode->content()->save($episodeContent);

如果您需要更多动态版本,可以使用集合而不是临时变量数组,如下所示

Sub Macro3()
Dim testList(0 To 1) As String
Dim temp1 As Variant
Dim temp2 As Variant
Dim resultArray(0 To 1, 0 To 4) As String

testList(0) = "Test1.Test2.Test3.Test4.Test5"
testList(1) = "Testa.Testb.Testc.Testd.Teste"


temp1 = Split(testList(0), ".")
temp2 = Split(testList(1), ".")


For i = 0 To 1 'actually UBound(testList)
    For j = 0 To 4 'actually UBound(temp, 2)
        resultArray(i, j) = IIf(i Mod 2 = 0, temp1(j), temp2(j))
    Next j
Next i

MsgBox resultArray(0, 2)

End Sub