为什么Join()需要双转位的1-昏暗长数组?
由于使用了女士帮助,Join()函数需要一个源射线作为“包含子字符串的一维数组来连接”(顺便说一下,帮助站点不管它是变体还是长的都没有区别)。
注意:在https://learn.microsoft.com/de-de/office/vba/language/glossary/vbe-glossary#array中,数组被定义为具有相同内部数据类型的序列索引元素集。
通过Join()连接1-dim变体数组没有问题,甚至可以连接数字,因为它们似乎在内部被解释为“将我们转换为字符串”。
声明为长的一维数组的问题。
在某些情况下,我希望将元素类型限制为Long,并避免使用上面提到的Variant解决方案。-声明一个“平面”数组-在这里:Numbers() -作为Long,但是,如果您试图通过一个简单的连接结果,则会引发错误5“无效的过程调用或参数”
'[2] Failing
Join(Numbers, "|") .通过基本冗余的双转位 (c.f ),我在周围发现了一个有趣的►工作。[1]**)**,,因为它“转换”一个平面的1-昏暗数组最终返回到相同的维度。
'[1] work around
Join(Application.Transpose(Application.Transpose(Numbers)), "|")问题
VBA对待这两种情况的内部区别是什么?为什么
Join()需要在这里对1-昏暗的长数组进行双换位?
示例调用,以加入声明为长的“平面”数组
为了显示解决方案代码行[1]和错误引发代码行[2],我还集成了一个显示用户定义错误行(ERL)的基本错误处理。
VB编辑器的即时窗口显示ERL 200中的错误5:
OK: [1] 3 elems: ~> 100|200|300
ERL: 200 Error No 5 Invalid procedure call or argument示例调用
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
Sub FillNumbers(ByVal n As Long, arr)
ReDim arr(1 To n)
arr(1) = 100
arr(2) = 200
arr(3) = 300
End Sub发布于 2020-03-23 21:39:48
尝试Join()一个Long数组将失败:
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的数组来解决这个问题:
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数组:
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然后:
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 Subhttps://stackoverflow.com/questions/60820439
复制相似问题