首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将VBA中的一维数组更改为多维数组以进行访问。

将VBA中的一维数组更改为多维数组以进行访问。
EN

Stack Overflow用户
提问于 2022-09-18 08:41:17
回答 3查看 68关注 0票数 0

我有代码要求用户提供一系列代码,然后创建这样的一维数组:

代码语言:javascript
运行
复制
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语句来处理多维数组,但是我希望有任何建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-18 09:40:52

下面的代码将帮助您到达那里。

GetDaysAndTimes函数将返回一个锯齿数组(即数组数组)。这意味着要获得第3项的日期和时间,您可以使用ArrayName(2)(0)和ArrayName(2)(1),其中arrayname是您使用的数组的名称(arrayDaysTimes?)

函数SplitAlphaNumString允许用户输入代码,如AB23。

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2022-09-18 09:29:21

使用ReDim

代码语言:javascript
运行
复制
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

输入示例:

代码语言:javascript
运行
复制
a7, b8, c9

输出:

代码语言:javascript
运行
复制
a             7
b             8
c             9
票数 2
EN

Stack Overflow用户

发布于 2022-09-19 11:42:48

仅仅是为了艺术的缘故,@Gustav的方法的另一种选择是,它还可以返回大于1的标记长度。

此外,它还得益于Val()函数能够返回。

  • a)输入字符串的起始数值和
  • b)通过上述数字值拆分结束的字符串作为分隔符。

代码语言:javascript
运行
复制
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

示例调用

代码语言:javascript
运行
复制
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 Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73761253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档