2

Я надеюсь, что один из вас сможет помочь мне начать в этом вопросе. Мне нужно создать какой-то макрос или код VBA для разделения и обработки строк данных в Excel.

Для этого примера у нас есть 5 строк данных. Первые 3 строки представляют информацию об элементе для заказа № 0000000000-00, а последние 2 строки представляют информацию об элементе для заказа № 0000000000-01. Мне нужна одна строка ("HDR") для каждого номера заказа и одна строка ("ITM") для каждого продукта на заказ. Ниже я привел пример, показывающий данные, которые я получу, и желаемый результат.

Необработанные данные:

order-id        product-num     date        buyer-name  product-name    quantity-purchased
0000000000-00   10000000000000  5/29/2014   John Doe    Product 0       1
0000000000-00   10000000000001  5/29/2014   John Doe    Product 1       2
0000000000-00   10000000000002  5/29/2014   John Doe    Product 2       1
0000000000-01   10000000000002  5/30/2014   Jane Doe    Product 2       1
0000000000-01   10000000000003  5/30/2014   Jane Doe    Product 3       1

Желаемый результат:

HDR 0000000000-00   John Doe    5/29/2014
ITM 10000000000000  Product 0   1
ITM 10000000000001  Product 1   2
ITM 10000000000002  Product 2   1
HDR 0000000000-01   Jane Doe    5/30/2014
ITM 10000000000002  Product 2   1
ITM 10000000000003  Product 3   1

Любая помощь будет высоко ценится !!! Спасибо.

1 ответ1

0

Этот макрос делает то, что вы хотите, но он проверяется только с данными, которые вы дали (хотя, если он продолжается таким же образом, все будет в порядке, проблема будет, если вы добавите больше столбцов, но код должен быть действительно простым обновлять)

Sub SortMeOut()

Dim previousOrderId As String

Dim row As Integer
row = 2


previousOrderId = Worksheets("Sheet1").Range("A2").Value

Dim offset As Integer
offset = 0

Do While (True)

        If Worksheets("Sheet1").Range("A" & row).Value = "" Then
        Exit Do
        End If

    Dim isHeader As Boolean
    isHeader = True
    Do While (True) 'loop through all columns with a match

        If Worksheets("Sheet1").Range("A" & row).Value <> previousOrderId Then
        Exit Do
        End If

        If Not isHeader Then
           Worksheets("Sheet2").Range("A" & row + 1 + offset).Value = "ITM"
            Worksheets("Sheet2").Range("B" & row + 1 + offset).Value = Worksheets("Sheet1").Range("B" & row).Value ' product num
            Worksheets("Sheet2").Range("C" & row + 1 + offset).Value = Worksheets("Sheet1").Range("E" & row).Value ' product name
            Worksheets("Sheet2").Range("D" & row + 1 + offset).Value = Worksheets("Sheet1").Range("F" & row).Value ' quantity
            End If


        If isHeader Then
            Worksheets("Sheet2").Range("A" & row + offset).Value = "HDR"
            Worksheets("Sheet2").Range("B" & row + offset).Value = Worksheets("Sheet1").Range("A" & row).Value 'order id
            Worksheets("Sheet2").Range("C" & row + offset).Value = Worksheets("Sheet1").Range("D" & row).Value ' name of the dude
            Worksheets("Sheet2").Range("D" & row + offset).Value = Worksheets("Sheet1").Range("C" & row).Value ' date

            'we also have to do the first item as well...
             Worksheets("Sheet2").Range("A" & row + 1 + offset).Value = "ITM"
            Worksheets("Sheet2").Range("B" & row + 1 + offset).Value = Worksheets("Sheet1").Range("B" & row).Value ' product num
            Worksheets("Sheet2").Range("C" & row + 1 + offset).Value = Worksheets("Sheet1").Range("E" & row).Value ' product name
            Worksheets("Sheet2").Range("D" & row + 1 + offset).Value = Worksheets("Sheet1").Range("F" & row).Value ' quantity
            isHeader = False
        End If

      row = row + 1

    Loop

offset = offset + 1
previousOrderId = Worksheets("Sheet1").Range("A" & row).Value


Loop

End Sub

Предполагается, что данные находятся на рабочем листе1, а результаты выводятся на рабочий лист2.

До

После

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .