只有VBA – 有一种更简单的方法来连接arrays值的基础上,他们的立场?

我看了一下,发现了类似的问题,但似乎都是如何将一个列表添加到另一个列表的末尾。

我最近用Excel中的一个技巧来解答一个问题,那就是依靠创build一个公式填充的第三列来为每一行的col1和col2进行连接。 我觉得必须有更好的方法来做到这一点,所以有一点在VBA玩,从我能find的问题提出以下。 但是现在我有几个问题:

有没有办法摆脱设置第三个数组的x的任意值将被replace无论如何? ReDim something maybe

总体来说,有没有更好的方法可以将arr1和arr2中的元素根据其位置进行组合,而无需循环遍历每个元素? (使用内置的数组命令或其他)

(道歉,如果这复制任何线程的地方,我看,诚实!)

 Private Sub CommandButton1_Click() Dim arr1() As Variant Dim arr2() As Variant Dim arr3() As Variant Dim element As Variant Dim pos As Integer arr1 = Array("ONE", "TWO", "THREE") arr2 = Array("1111", "2222", "3333") arr3 = Array("x", "x", "x") For Each element In arr1 pos = Application.WorksheetFunction.Match(element, arr1, False) - 1 arr3(pos) = arr1(pos) & arr2(pos) 'MsgBox (arr1(pos) & arr2(pos) & arr3(pos)) Next 'Where arr3 will equal ("ONE1111", "TWO2222", "THREE3333") End Sub 

编辑 – 感谢所有的答案,给我20个事情要考虑,并在接下来的几天玩。

如果你不需要保持arr1的原始forms,那么:

 arr1 = Array("ONE", "TWO", "THREE") arr2 = Array("1111", "2222", "3333") For x =lbound(arr1) to ubound(arr1) arr1(x) = arr1(x) & arr2(x) Next 

VBA中有几个有用的内置数组函数/方法,但循环并不一定是坏事。

你总是可以做这样的事情,但它可能不能很好地扩展,我认为是一个更糟糕的方法:

 Dim r, arr1, arr2 arr1 = Array("ONE", "TWO", "THREE") arr2 = Array("1111", "2222", "3333") r = ActiveSheet.Evaluate("={""" & Join(arr1, """,""") & """} & {""" & _ Join(arr2, """,""") & """}") Debug.Print Join(r, ",") '>> ONE1111,TWO2222,THREE3333 

为了扩展我的评论,你可能使用的任何代码都会循环访问数组元素。 与内置代码的唯一区别是你没有看到循环代码。 这里有一些代码可以让你做一个简单的函数调用,并支持任意数量的input数组。 JoinArrayElements函数完成你所要求的function,你可以使用它,而不必编写代码来每次循环遍历元素。

 Public Sub Main() Dim arr1, arr2 arr1 = Array("ONE", "TWO", "THREE") arr2 = Array("1111", "2222", "3333") arr3 = Array("!@!@", "@#@#", "#$#$") Debug.Print arrayToString(joinArrayElements(arr1, arr2)) Debug.Print arrayToString(joinArrayElements(arr1, arr2, arr3)) End Sub Public Function arrayToString(arr As Variant) As String Dim output As String output = "[" If UBound(arr) - LBound(arr) > 0 Then output = output & """" & arr(LBound(arr)) & """" For index = LBound(arr) + 1 To UBound(arr) output = output & ", " & """" & arr(index) & """" Next End If output = output & "]" arrayToString = output End Function Public Function joinArrayElements(ParamArray args() As Variant) As Variant 'Validation to add: ' Are all the passed parameters actual valid arrays? ' Are they all the same length? Dim arrayNumber As Long Dim index As Long Dim arrOutput() As Variant ReDim arrOutput(LBound(args(0)) To UBound(args(0))) For arrayNumber = LBound(args) To UBound(args) For index = LBound(args(0)) To UBound(args(0)) arrOutput(index) = arrOutput(index) & args(arrayNumber)(index) Next Next joinArrayElements = arrOutput End Function 

这个代码的输出是:

[“ONE1111”,“TWO2222”,“THREE3333”]

[“ONE1111!@!@”,“TWO2222 @#@#”,“THREE3333#$#$”]

这里是你如何ReDimarrays。 首次调整数组的大小时,使用ReDim array(size) ,之后使用ReDim Preserve array(size)来保存已经存在于数组中的信息。

在这里输入图像描述

 Private Sub CommandButton1_Click() Dim arr1() As Variant, arr2() As Variant, arr3() As Variant Dim pos As Integer arr1 = Array("ONE", "TWO", "THREE") arr2 = Array("1111", "2222", "3333") ReDim arr3(pos) For pos = 0 To UBound(arr1) ReDim Preserve arr3(pos) arr3(pos) = arr1(pos) & arr2(pos) Next End Sub 

您可以看看只使用UDT。

 Public Type Car Manufacturer As String Model As String Price As Currency Doors As Integer Manufactured As Date End Type Dim myCars(0 To 2) as Car myCars(0).Manufacturer="Toyota" myCars(0).Model="86" myCars(1).Manufacturer="Mazda" myCars(1).Model="MX5" 'Then you can just use the fields together when needed like... msgbox myCars(0).Manufacturer & " " & myCars(0).Model msgbox myCars(1).Manufacturer & " " & myCars(1).Model 'Or even a function to return.. Public Function CarInfo(intCarID as Integer) CarInfo = myCars(intCarID).Manufacturer & " " & myCars(intCarID).Model End function