我有代码要求用户提供一系列代码,然后创建这样的一维数组:
Dim strDaysTimes As String
Dim arrDaysTimes() As String
strDaysTimes = InputBox("What days and times do you want to schedule meetings for? (write as 6c,7b)", "Enter Days and Times")
arrDaysTimes() = Split(strDaysTimes, ",")输入的数量没有定义,但格式是。可以是"6c,7b“或"5a,6b,7b”。
我想把它转换成一个多维数组,它将带有这样的值(一个维度有数字部分,另一个有字母部分):
5a
6 b
7 b
我知道我需要使用嵌套的For...Next语句来处理多维数组,但是我希望有任何建议。
发布于 2022-09-18 09:40:52
下面的代码将帮助您到达那里。
GetDaysAndTimes函数将返回一个锯齿数组(即数组数组)。这意味着要获得第3项的日期和时间,您可以使用ArrayName(2)(0)和ArrayName(2)(1),其中arrayname是您使用的数组的名称(arrayDaysTimes?)
函数SplitAlphaNumString允许用户输入代码,如AB23。
Option Explicit
' This function takes the string returned by your input box
Public Function GetDaysAndTimes(ByRef ipString As String) As Variant
    Dim myItems As Variant
    myItems = VBA.Split(ipString, ",")
    
    Dim myDayTimes As Variant
    
    Dim myindex As Long
    For myindex = LBound(myItems) To UBound(myItems)
       myDayTimes(myindex) = SplitAlphaNumString(myItems(myindex))
    Next
    GetDaysAndTimes = myDayTimes
    
End Function
Public Function SplitAlphaNumString(ByVal ipString As String) As Variant
    Dim myindex As Long
    For myindex = 1 To VBA.Len(ipString)
       
        If VBA.Asc(VBA.Mid(ipString, myindex, 1)) < 58 Then
        
            Dim myAlphas As String
            myAlphas = VBA.Mid(ipString, 1, myindex - 1)
            
            Dim myNums As String
            myNums = VBA.Mid(ipString, myindex)
            
            SplitAlphaNumString = Array(myAlphas, myNums)
            Exit Function
            
        End If
        
    Next
            
End Function
Sub Test()
    Dim myArray As Variant
    myArray = SplitAlphaNumString("D5")
    Debug.Print myArray(0), myArray(1)
    
End Sub发布于 2022-09-18 09:29:21
使用ReDim
Public Function DivideArray()
    Dim strDaysTimes    As String
    Dim arrDaysTimes()  As String
    Dim DaysTimes()     As String
    Dim Index           As Integer
    
    strDaysTimes = InputBox("What days and times do you want to schedule meetings for? (write as 6c,7b)", "Enter Days and Times")
    
    arrDaysTimes() = Split(strDaysTimes, ",")
    ReDim DaysTimes(UBound(arrDaysTimes) - LBound(arrDaysTimes) + 1, 0 To 1)
    
    For Index = LBound(arrDaysTimes) To UBound(arrDaysTimes)
        DaysTimes(Index, 0) = Left(LTrim(arrDaysTimes(Index)), 1)
        DaysTimes(Index, 1) = Right(RTrim(arrDaysTimes(Index)), 1)
    Next
    
    For Index = LBound(arrDaysTimes) To UBound(arrDaysTimes)
        Debug.Print DaysTimes(Index, 0), DaysTimes(Index, 1)
    Next
End Function输入示例:
a7, b8, c9输出:
a             7
b             8
c             9发布于 2022-09-19 11:42:48
仅仅是为了艺术的缘故,@Gustav的方法的另一种选择是,它还可以返回大于1的标记长度。
此外,它还得益于Val()函数能够返回。
Public Function tokenize(ByVal s As String)
    Dim arr() As String
    arr() = Split(Trim(s), ",")
    
    Dim tmp() As String
    ReDim tmp(0 To UBound(arr) - LBound(arr), 0 To 1)
    
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        Dim num: num = Val(arr(i))
        tmp(i, 0) = num
        tmp(i, 1) = Split(arr(i), num)(1)
    Next
    tokenize = tmp
End Function示例调用
Sub testTokenize()
'0. Get input string (e.g. "6c,7b")
    Dim strDaysTimes As String
    strDaysTimes = InputBox( _
        "What days and times do you want to schedule meetings for? (write as 6c,7b)", _
        "Enter Days and Times", _ 
        "6c,7b")
'1. Call help function
    Dim results As Variant
    results = tokenize(strDaysTimes)    ' << function tokenize()
'2. Show results in VB Editor's immediate window    
    Dim i As Long
    For i = LBound(results) To UBound(results)
        Debug.Print results(i, 0), results(i, 1) 
    Next
End Subhttps://stackoverflow.com/questions/73761253
复制相似问题