【问题标题】:How to split a cell value into multiple rows while keeping other cell data?如何在保留其他单元格数据的同时将单元格值拆分为多行?
【发布时间】:2019-10-16 15:28:17
【问题描述】:

我有一系列单元格,如下所示:

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

【问题讨论】:

  • 你可以有一个循环通过 A 分裂“苹果,橙色”,然后一个内循环分裂 B “红色,绿色”? Split 产生一个数组。
  • 所以我有两个不同的循环来拆分具有逗号分隔条目的列中的单元格。问题是每列会有多个我需要拆分的单元格,我需要从多个列拆分单元格。
  • 所以我想我需要两个数组——一个用于存储给定列范围内的每个单元格值,一个用于存储我拆分的单元格的结果。我的问题是,一旦我拆分单元格,我不知道如何最好地将元素存储在这个新的第二个数组中,然后再访问它们。
  • 例如如果我最初得到一个包含“苹果、橙子”、“香蕉、梨、葡萄”作为两个元素的数组,我想创建一个新数组“苹果”、“橙子”,它有两个元素和另一个数组“香蕉”, “梨”包含三个元素。但是我需要的不仅仅是两个新数组 - 每次拆分单元格时我都需要继续创建一个新数组,并且以后能够访问它的元素。有没有办法做到这一点?
  • 我已经在下面发布了一个答案,所以试试看,让我知道你的进展情况。

标签: arrays excel vba


【解决方案1】:

根据您的示例,这可行。

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

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

【讨论】:

  • 抱歉耽搁了……正在将它调整为我的真实程序,我让它工作了。非常感谢你的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多