如何在保留其他单元格数据的同时将单元格值分成多行?

时间:2019-10-16 15:28:17

标签: arrays excel vba

我的单元格范围如下:

Col A         | Col B      | Col C | Col D
apple, orange | red, green | 5     | 10
pear, banana  | blue       | 20    | 40

我想要一个看起来像这样的结果

Col A 
apple-red-5-10
apple-green-5-10
orange-red-5-10
orange-green-5-10
pear-blue-20-40
banana-blue-20-40

我正在将多行中的每一行中的值连接在一起,但是如果单元格包含一个用逗号分隔的项列表,则需要将每个条目视为它们属于新行且包含其他列数据。

我首先引用属于我感兴趣的四列的范围。

Dim cellRef1 As Range
Set cellRef1 = ThisWorkbook.Worksheets(1).Range("I2:I60")
Dim cellRef2 As Range
Set cellRef2 = ThisWorkbook.Worksheets(1).Range("E2:E60")
Dim cellRef3 As Range
Set cellRef3 = ThisWorkbook.Worksheets(1).Range("D2:D60")
Dim cellRef4 As Range
Set cellRef4 = ThisWorkbook.Worksheets(1).Range("H2:H60")

然后对于用逗号分隔的条目(第二和第四个)的列,我创建一个数组来存储每个值,例如:

Dim Array_Two As Variant
Array_Two = cellRef2.Value

所以我将沿着

 ("apple, orange", "pear,banana")

我想遍历每个数组以创建一个子数组,在该数组中我想用逗号分隔条目并将它们存储在新数组中。

例如我想要:

Array_Two_A = ("apple", "orange")
Array_Two_B = ("pear", "banana)

所以我以后可以访问每个条目并将它们连接起来。

我想使用:

Dim Array_Two_New() As String

For x = LBound(Array_Two) To UBound(Array_Two)
    Array_Two_New = Split(Array_Two(x, 1), ",")
Next x

哪种方法可行,但问题是我无法弄清楚如何动态创建以后可以访问的数组。

例如因为我的代码将继续用Array_Two(x,1)中的字符串拆分成的第一个值覆盖Array_Two_New数组。

我认为我可以在代码中添加Array_Two_New(x),以便得到类似以下结果:

Array_Two_New(1) = ("apple", "orange")
Array_Two_New(2) = ("pear", "banana")

然后我可以访问所需的值,例如

Array_Two_New(1)(1) = "apple"
Array_Two_New(1)(2) = "orange"
Array_Two_New(2)(1) = "pear" // etc.

我认为我在这里混淆语法。

我认为我需要使用一个对象,但是我对它们不太熟悉。

我找到了这些文章,但我听不懂这些解释。

VBA: Split cell values into multiple rows and keep other data
Splitting an array into multiple rows

1 个答案:

答案 0 :(得分:3)

根据您的示例,此方法有效。

如果您有大量数据,则可能需要考虑将数据写入数组,并且仅在完成配置后才回读,因为这将大大加快速度。

Sub x()

Dim vA As Variant, vB As Variant, i As Long, j As Long, r As Range

For Each r In Range("A1:A10")
    vA = Split(r, ",")
    vB = Split(r.Offset(, 1), ",")
    For i = LBound(vA) To UBound(vA)
        For j = LBound(vB) To UBound(vB)
            Range("F" & Rows.Count).End(xlUp)(2) = Trim(vA(i)) & "-" & Trim(vB(j)) & "-" & r.Offset(, 2).Value & "-" & r.Offset(, 3).Value
        Next j
    Next i
Next r

End Sub

enter image description here