Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String VBA:字符串和数组-将一维数组拆分为二维数组_String_Vba_Excel_Multidimensional Array - Fatal编程技术网

String VBA:字符串和数组-将一维数组拆分为二维数组

String VBA:字符串和数组-将一维数组拆分为二维数组,string,vba,excel,multidimensional-array,String,Vba,Excel,Multidimensional Array,我有一个字符串数组,其中包含一个以“.”分隔的项目字符串 例: 我需要将这些字符串拆分为一个2D字符串数组,每个数组有5个元素 例: 我有点挣扎,因为这不太像C或C 在测试和尝试时,这是有效的: 注意:testList是一个类似于第一个示例的数组,包含以“.”分隔的字符串项。它是这样创建的,来自一个名为strArray的长字符串: testList = Split(textline, "<") Dim temp() As String temp = Split(testList

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

例:

我需要将这些字符串拆分为一个2D字符串数组,每个数组有5个元素

例:

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

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

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

testList = Split(textline, "<")     

Dim temp() As String
temp = Split(testList(0), ".")
MsgBox Join(temp, vbCrLf)
这就产生了错误

Type mismatch
所以,很明显,我没有正确地声明或创建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字符串数组,并以最简单的方式填充它。只是没有超出这个范围

很抱歉,这里没有提供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

我已经删除了其他的更新,因为我认为它们会变得更加嘈杂和混乱。感谢那些回答和帮助我的人。

这就是我该如何解决的问题:

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数组(
lngrowth
lngColS
)的行和列总数,并使用嵌套循环写入它们。

此代码就可以了

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
如果需要更动态的版本,可以使用集合而不是临时变量数组,如下所示

Sub Macro4()
Dim testList(0 To 1) As String
Dim temp As New Collection

Dim resultArray(0 To 1, 0 To 4) As String

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

For i = 0 To UBound(testList)
    temp.Add (Split(testList(i), "."))
Next i


For i = 0 To UBound(testList)
    For j = 0 To UBound(resultArray, 2)
        resultArray(i, j) = IIf(i Mod 2 = 0, temp(i + 1)(j), temp(i + 1)(j))
    Next j
Next i

MsgBox resultArray(0, 2)

End Sub

无论我做什么,当我尝试创建initialArray()时,就像我创建testList()数组一样,当我尝试从arrTemp复制到arrResult时,我会得到一个下标超出范围的错误。我已经更新了关于如何创建testList()数组的详细信息。你能给我一些建议吗?我需要做些什么才能让你的代码使用它?我在用我的数组替换测试数组时出错。你一定忘了用strArray声明放置代码吗?你能再更新一下吗?对不起,你把strArray放在UPDATE1里了。好的,问题是我们定义了de resltArray 1D,但是您试图访问第二个维度。就像我在示例中所做的那样更正声明部分,不是吗?它被声明,然后用strArray=Split(textline)初始化,“这不是我所做的吗?请参阅更新。即使我用Dim resultaray(0到100,0到500)声明resultaray,这比需要的要高得多,我仍然会从rante中得到”下标““。我可以发布完整的代码,但我想我的问题随着所有的更新而变得有点大。不想给网站发垃圾邮件:-)
 0  0 Test1
 0  1 Test2
 0  2 Test3
 1  0 TestA
 1  1 TestB
 1  2 TestC
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
Sub Macro4()
Dim testList(0 To 1) As String
Dim temp As New Collection

Dim resultArray(0 To 1, 0 To 4) As String

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

For i = 0 To UBound(testList)
    temp.Add (Split(testList(i), "."))
Next i


For i = 0 To UBound(testList)
    For j = 0 To UBound(resultArray, 2)
        resultArray(i, j) = IIf(i Mod 2 = 0, temp(i + 1)(j), temp(i + 1)(j))
    Next j
Next i

MsgBox resultArray(0, 2)

End Sub