Как разбить значение ячейки на несколько строк, сохраняя при этом другие данные ячейки? - PullRequest
1 голос
/ 16 октября 2019

У меня есть диапазон ячеек, как показано ниже:

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_New первым значением, на которое разбита строка в Array_Two (x, 1).

Я подумал, что мог бы добавить 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: разбить значения ячеек на несколько строк и сохранить другие данные
Разделение массива на несколько строк

1 Ответ

3 голосов
/ 16 октября 2019

Это работает, основываясь на вашем примере.

Если у вас много данных, вы можете рассмотреть возможность записи своих данных в массив и их считывания только после того, как вы выполните конкатенацию, так как это будетзначительно ускорить процесс.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...