транспонировать, а если - excel [duplicate]

Для меня это работало со следующими аннотациями:

@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids")  List<Long> ids);
1
задан Community 9 July 2018 в 18:41
поделиться

3 ответа

Вы не можете объединить ряд ячеек (иначе Письма ), используя собственные функции рабочего листа, не зная области заранее. Поскольку ваша коллекция строк в группы имеет случайное число элементов, подход к циклу VBA представляется лучшим (если не единственным) способом решения проблемы. Цикл может делать определения так, что функция рабочего листа просто неспособна выполнить.

Нажмите Alt + F11 и, когда откроется редактор Visual Basic (aka VBE), немедленно используйте раскрывающиеся меню для вставки ► Модуль (Alt + I, M). Вставьте одно или оба из следующего в новую панель под названием «g1» Book1 - Module1 (Code) .

Чтобы объединить строки, ограниченные пробелом:

Sub concatenate_and_transpose_to_delim_string()
    Dim rw As Long, lr As Long, pid As Long, str As String
    Dim bPutInColumns As Boolean

    With ActiveSheet
        lr = .Cells(Rows.Count, 1).End(xlUp).row
        .Cells(1, 4).Resize(1, 2) = Array("Id", "Letters")
        pid = .Cells(2, 1).Value
        For rw = 2 To lr
            If IsEmpty(.Cells(rw, 1)) Then
                str = str & Chr(32)
                If pid <> .Cells(rw + 1, 1).Value Then
                    .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = pid
                    .Cells(Rows.Count, 4).End(xlUp).Offset(0, 1) = str
                End If
            ElseIf pid <> .Cells(rw, 1).Value Then
                pid = .Cells(rw, 1).Value
                str = .Cells(rw, 2).Value
            Else
                str = str & .Cells(rw, 2).Value
            End If
        Next rw
        .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = pid
        .Cells(Rows.Count, 4).End(xlUp).Offset(0, 1) = str
    End With
End Sub

Чтобы разбить группы строк на столбцы:

Sub concatenate_and_transpose_into_columns()
    Dim rw As Long, lr As Long, nr As Long, pid As Long, str As String

    With ActiveSheet
        lr = .Cells(Rows.Count, 1).End(xlUp).row
        .Cells(1, 4).Resize(1, 2) = Array("Id", "Letters")
        For rw = 2 To lr
            If IsEmpty(.Cells(rw, 1)) Then
                .Cells(nr, Columns.Count).End(xlToLeft).Offset(0, 1) = str
                str = vbNullString
            ElseIf pid <> .Cells(rw, 1).Value Then
                pid = .Cells(rw, 1).Value
                nr = .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).row
                .Cells(nr, 4) = pid
                str = .Cells(rw, 2).Value
            Else
                str = str & .Cells(rw, 2).Value
            End If
        Next rw
        .Cells(nr, Columns.Count).End(xlToLeft).Offset(0, 1) = str
    End With
End Sub

Нажмите Alt + Q, чтобы вернуться на рабочий лист. С вашими примерными данными на активном листе, начиная с Id в A1, нажмите Alt + F8, чтобы открыть диалог «Макросы» и «Запустить макрос».

Результаты из concatenate_and_transpose_to_delim_string:

Concatenate and Transpose to delim strang [/g2]

Результаты concatenate_and_transpose_into_columns:

Concatenate and Transpose [/g3]

Результаты будут записаны в ячейки, начинающиеся с D2. Вероятно, лучше, если раньше не было ничего важного, которое было бы перезаписано.

Добавление:

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

6
ответ дан Jeeped 16 August 2018 в 02:49
поделиться

Для таких задач, как этот, Microsoft добавила «Get & amp; Transform» в Excel 2016. Чтобы использовать эту функциональность в более ранних версиях, вы должны использовать надстройку Power Query. M-код очень короткий:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    FillIdDown = Table.FillDown(Source,{"Id"}),
    ReplaceNull = Table.ReplaceValue(FillIdDown,null," ",Replacer.ReplaceValue,{"Letter"}),
    Transform = Table.Group(ReplaceNull, {"Id"}, {{"Count", each Text.Combine(_[Letter])}})
in
    Transform

Ваши данные должны размещаться в «Таблице 1». https://www.dropbox.com/s/bnvchofmpvd048v/SO_AggregateCollateAndTransposeColsIntoRows.xlsx?dl=0

0
ответ дан ImkeF 16 August 2018 в 02:49
поделиться
4
ответ дан ZygD 16 August 2018 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: