首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Join()需要双转位的1-模糊长数组?

为什么Join()需要双转位的1-模糊长数组?
EN

Stack Overflow用户
提问于 2020-03-23 19:35:36
回答 1查看 1.3K关注 0票数 1

为什么Join()需要双转位的1-昏暗长数组?

由于使用了女士帮助,Join()函数需要一个源射线作为“包含子字符串的一维数组来连接”(顺便说一下,帮助站点不管它是变体还是长的都没有区别)。

注意:在https://learn.microsoft.com/de-de/office/vba/language/glossary/vbe-glossary#array中,数组被定义为具有相同内部数据类型的序列索引元素集。

通过Join()连接1-dim变体数组没有问题,甚至可以连接数字,因为它们似乎在内部被解释为“将我们转换为字符串”。

声明为长的一维数组的问题。

在某些情况下,我希望将元素类型限制为Long,并避免使用上面提到的Variant解决方案。-声明一个“平面”数组-在这里:Numbers() -作为Long,但是,如果您试图通过一个简单的连接结果,则会引发错误5“无效的过程调用或参数”

代码语言:javascript
复制
'[2] Failing
Join(Numbers, "|") .

通过基本冗余的双转位 (c.f ),我在周围发现了一个有趣的►工作。[1]**)**,,因为它“转换”一个平面的1-昏暗数组最终返回到相同的维度。

代码语言:javascript
复制
'[1] work around
Join(Application.Transpose(Application.Transpose(Numbers)), "|")

问题

VBA对待这两种情况的内部区别是什么?为什么Join()需要在这里对1-昏暗的长数组进行双换位?

示例调用,以加入声明为长的“平面”数组

为了显示解决方案代码行[1]和错误引发代码行[2],我还集成了一个显示用户定义错误行(ERL)的基本错误处理。

VB编辑器的即时窗口显示ERL 200中的错误5:

代码语言:javascript
复制
 OK: [1] 3 elems: ~> 100|200|300
ERL: 200 Error No 5 Invalid procedure call or argument

示例调用

代码语言:javascript
复制
Sub JoinArr()
    Dim Numbers() As Long      ' provide for long array Numbers()
    FillNumbers 3, Numbers      ' call sub procedure to assign 3 numbers to array Nums
    ' Numbers is now an array of 3 numbers

    On Error GoTo oops
    '[1] work around - why does Join() need a double transposition in a 1-dim array?
100 Debug.Print " OK: [1] " & UBound(Numbers) & " elems:" & _
                " ~> " & Join(Application.Transpose(Application.Transpose(Numbers)), "|")

    '[2] join an already existing "flat" array raises Error 5 "Invalid procedure call or argument" 
200 Debug.Print " OK [2] " & UBound(Numbers) & " elems:" & _
                " ~> " & Join(Numbers, "|")

Exit Sub

oops:     Debug.Print "ERL: " & Erl & " Error No " & Err.Number & " " & Err.Description
End Sub

上述主程序调用的FillNumbers Sub

代码语言:javascript
复制
Sub FillNumbers(ByVal n As Long, arr)  
    ReDim arr(1 To n)
    arr(1) = 100
    arr(2) = 200
    arr(3) = 300
End Sub
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-23 21:39:48

尝试Join()一个Long数组将失败:

代码语言:javascript
复制
Sub JoinTestFails()
    Dim Numbers(0 To 2) As Long, msg As String
    Numbers(0) = 0
    Numbers(1) = 1
    Numbers(2) = 2
    With Application.WorksheetFunction
        msg = Join(Numbers, "|")
    End With
    MsgBox msg
End Sub

TRANSPOSE()的双重使用可以通过生成一个一维、基于Variant的数组来解决这个问题:

代码语言:javascript
复制
Sub JoinTest()
    Dim Numbers(0 To 2) As Long, msg As String

    Numbers(0) = 0
    Numbers(1) = 1
    Numbers(2) = 2

    With Application.WorksheetFunction
        Arr = .Transpose(.Transpose(Numbers))
        msg = LBound(Arr) & "**" & UBound(Arr) & vbCrLf
        msg = msg & Join(.Transpose(.Transpose(Numbers)), "|") & vbCrLf & TypeName(Arr)
    End With
    MsgBox msg
End Sub

对我来说,TRANSPOSE的这种使用是不直观的.我宁愿使用以下方法来创建Variant数组:

代码语言:javascript
复制
Public Function MkVar(arr() As Long) As Variant
'   make a variant array from a long array

    Dim temp() As Variant, i As Long
    ReDim temp(LBound(arr) To UBound(arr))
    For i = LBound(arr) To UBound(arr)
        temp(i) = arr(i)
    Next i
    MkVar = temp

End Function

然后:

代码语言:javascript
复制
Sub JoinTest2()
    Dim Numbers(0 To 2) As Long, msg As String

    Numbers(0) = 0
    Numbers(1) = 1
    Numbers(2) = 2

    arr = MkVar(Numbers)

    msg = LBound(arr) & "**" & UBound(arr) & vbCrLf
    msg = msg & Join(MkVar(Numbers), "|") & vbCrLf & TypeName(arr)

    MsgBox msg
End Sub
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60820439

复制
相关文章

相似问题

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