1

Я совершенно новичок в VBA и пытаюсь реализовать превосходное решение здесь от Raystafarian. Как объединить значения из нескольких строк в одну строку в Excel? (пересмотренная версия). Однако, поскольку я действительно не понимаю решение, я изо всех сил пытаюсь запустить его там, где номера столбцов и т.д. Отличаются. Кто-нибудь может мне объяснить, на что ссылаются переменные, чтобы я мог применить их к другому примеру? Моя проблема точно такая же - несколько строк для одной точки данных и поиск таблицы с именем /data1 /data2 /data3 в одной строке для анализа данных Spotfire.

3 ответа3

0

Вот объяснения для наиболее важных строк сценария:


For each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))

Выполните итерацию по всему столбцу A от A2 до последней использованной ячейки, присваивая значение переменной c .

Поскольку c - это ячейка, она имеет значение строки и столбца, поэтому она действует как точка отсчета, откуда мы можем двигаться, используя Offset .


If c = c.Offset(1) And c.Offset(,4) = c.Offset(1,4) Then

Сравните ячейку c с ячейкой в следующем ряду c.Offset(1) И ячейка в той же строке, но в столбце 4 c.Offset(,4) с ячейкой в следующем ряду столбца 4 c.Offset(1,4) .


c.Offset(,3) = c.Offset(1,3)

Присвойте ячейке строку и столбец 3 c.Offset(,3) значение ячейки в следующей строке и столбце 3 c.Offset(1,3) .


c.Offset(1).EntireRow.Delete

Удаляет следующий ряд

0

Это довольно грубый макрос, но

Option Explicit

Sub CombineRowsRevisited()

'c is a CELL or a range
Dim c As Range
'i is a number
Dim i As Integer

'for each CELL in this range
For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
'if the CELL is the same as the cell to the right AND
'if the cell 4 to the right is the same as the cell below that one
If c = c.Offset(1) And c.Offset(, 4) = c.Offset(1, 4) Then
            'then make the cell 3 to the right the same as the cell below it
            c.Offset(, 3) = c.Offset(1, 3)
            'and delete the row below the CELL
            c.Offset(1).EntireRow.Delete
End If

Next

End Sub

Это было бы легче понять, учитывая вышеизложенное

Sub CombineRowsRevisitedAgain()
    Dim myCell As Range
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    For Each myCell In Range(Cells("A2"), Cells(lastRow, 1))
        If (myCell = myCell.Offset(1)) And (myCell.Offset(0, 4) = myCell.Offset(1, 4)) Then
            myCell.Offset(0, 3) = myCell.Offset(1, 3)
            myCell.Offset(1).EntireRow.Delete
        End If
    Next
End Sub

Однако, в зависимости от проблемы, может быть лучше сделать step -1 для номера строки, чтобы ничего не пропускалось.

Sub CombineRowsRevisitedStep()
    Dim currentRow As Long
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For currentRow = lastRow To 2 Step -1
        If Cells(currentRow, 1) = Cells(currentRow - 1, 1) And _
        Cells(currentRow, 4) = Cells(currentRow - 1, 4) Then
            Cells(currentRow - 1, 3) = Cells(currentRow, 3)
            Rows(currentRow).EntireRow.Delete
        End If
    Next

End Sub
0

Как VBA, я предлагаю другой способ обработки этого шага преобразования.

Вы можете попробовать бесплатный Microsoft Power Add-In Query (из Excel 2010). Это довольно интуитивно понятно для загрузки и преобразования ваших данных. По сути, вы импортируете данные в Power Query, отключаете их и восстанавливаете.

Сначала определите ваши данные в виде таблицы в Excel.

| Customer   | Value A | Value B | Year |
|------------|---------|---------|------|
| Customer 1 | 134     |         | 2009 |
| Customer 1 |         | 3       | 2009 |
| Customer 1 | 175     |         | 2010 |
| Customer 1 |         | 5       | 2010 |
| Customer 1 | 7784    |         | 2011 |
| Customer 2 | 515     |         | 2009 |
| Customer 2 | 1943    |         | 2010 |
| Customer 2 |         | 1       | 2010 |
| Customer 2 | 9745    |         | 2011 |
| Customer 2 |         | 154     | 2011 |

Поместите курсор где-нибудь в таблице

Перейдите на вкладку Power Query и нажмите "Из таблицы". Откроется редактор Power Query.

Выберите столбцы Value A/B (с помощью Ctrl). Щелкните правой кнопкой мыши по одному из выбранных заголовков столбцов, чтобы открыть меню параметров. Откройте меню «Удалить столбцы».

Следующий шаг: выберите столбец Attribut (значение A/B) и поверните таблицу. Выберите столбец Значение для разворота.

Вывод будет выглядеть так:

| Customer   | Year | Value A | Value B |
|------------|------|---------|---------|
| Customer 1 | 2009 | 134     | 3       |
| Customer 1 | 2010 | 175     | 5       |
| Customer 1 | 2011 | 7784    |         |
| Customer 2 | 2009 | 515     |         |
| Customer 2 | 2010 | 1943    | 1       |
| Customer 2 | 2011 | 9745    | 154     |

Сценарий Power Query для этих трех шагов

let
    Source= Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(Source, {"Customer", "Year"}, "Attribut", "Value"),
    #"Pivot Column" = Table.Pivot(#"Unpivoted Columns", List.Distinct(#"Unpivoted Columns"[Attribut]), "Attribut", "Value", List.Sum)
in
    #"Pivot Column"

Вы также можете найти пошаговое руководство по отмене поворота здесь.

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