6


нажмите, чтобы увеличить

Я пытаюсь помассировать этот документ Excel.  У него есть группы последовательных строк, которые идентичны, за исключением столбца AdminTime (столбец H).  Когда группа последовательных строк имеет одинаковое значение для LastRxNo (столбец C), тогда я знаю, что они идентичны, за исключением столбца H Я хочу объединить строки в группе в одну строку со AdminTime содержащим значения AdminTime из всех строк в группе, разделенных запятыми.

Вот картинка, на которой я хочу, чтобы она выглядела


нажмите, чтобы увеличить

Есть идеи? Я думал о функции IF, но я не слишком знаком с Excel, чтобы заставить его работать.


Все извлекается из таблицы SQL с помощью инструмента Microsoft Query в Excel; вот запрос:

5 ответов5

1

Создайте столбец, который добавляет количество к коду

= B5 & "" & COUNTIF($ B $ 2:$ B5, B5)

Затем вы можете найти каждую отдельную запись и объединить текст, формула которого в d2:

= IF($ B2 & "" & 1 = D2, ИНДЕКС (C:C, MATCH ($ B2 & "" & 1, D:D, 0))& "" & IFERROR (INDEX (C:C, MATCH ($ B2 & "" & 2 , D:D, 0)), "")& "" & IFERROR (INDEX (C:C, MATCH ($ B2 & "" & 3, D:D, 0)), "")& "" & IFERROR (INDEX (C):C, MATCH ($ B2 & "" & 4, D:D, 0)), ""), "")

для каждой возможности вам нужно будет добавить &" "&IFERROR(INDEX(C:C,MATCH($B5&" "&5,D:D,0)),"") где &5 становится &6 и т. д. тянется до 4 экземпляров.

1

Вы можете просто сделать сводную таблицу из этих данных, хотя вместо того, чтобы быть представленными в строках, она идет вниз в столбце. то есть выберите все данные, Вставьте> Сводную таблицу, перетащите PatID, LastRxNo и Admintime в область "Метки строк" сводной таблицы, скройте все итоги или промежуточные итоги (я бы выложил фото, но моя репутация здесь еще достаточно высока - мой первый пост!) Создает сводную таблицу, которая выглядит примерно так (не уверен, что это будет выглядеть правильно в моем сообщении):855 87160 6 утра 2 вечера 10 вечера (и так далее ...)

В качестве альтернативы, если вы изменили SQL-запрос в выбранной статистике, чтобы вернуть все имя в одной ячейке (выберите ........ Пациенты.PatLName+','+Patients.PatFname, ........) Вы могли бы сделать так, чтобы сводка возвращала полное имя пациента, а не номер, что-то вроде этого ... Паркер, Corde 87160 6 утра 2 вечера 10 вечера (и так далее ...)

Возможно, это не тот формат, о котором вы изначально просили, но он кажется мне разборчивым (если вы используете его для проверки, когда лекарства были введены?)

0

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

Option Explicit

Sub combineAdminTimes()

    'Declarations
    Dim tbl1 As ListObject  'Original table
    Dim tbl2 As ListObject  'Abbreviated table
    Dim arrColumns()        'Array of column numbers in which to search for duplicate values
    Dim rcd1 As ListRow     'Generic list row in original table
    Dim rcd2 As ListRow     'Generic list row in abbreviated table
    Dim i As Long           'Generic counter
    Dim blnMatch As Boolean 'Whether or not the two records match and should be combined
    Dim s As String         'String in which to store the combined result

    'Initialize
    Set tbl1 = Sheet1.ListObjects(1)
    Set tbl2 = Sheet2.ListObjects(1)

    'Clear the old filtered list
    If Not tbl2.DataBodyRange Is Nothing Then tbl2.DataBodyRange.Rows.Delete

    'Copy the unfiltered list
    tbl1.DataBodyRange.Copy tbl2.Range(2, 1)

    'Remove all duplicate values
    tbl2.Range.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7), Header:=xlYes

    'Loop through records in abbreviated table
    For Each rcd2 In tbl2.ListRows
        s = ""
        'Loop through records in original table
        For Each rcd1 In tbl1.ListRows
            'Check if any fields in the two records do not match
            blnMatch = True
            For i = 1 To tbl1.ListColumns.Count - 1
                If rcd1.Range(1, i).Value <> rcd2.Range(1, i).Value Then blnMatch = False
            Next

            'If all matched, then add the time value to the string
            If blnMatch Then
                If LenB(s) > 0 Then s = s & ", "    'Separate each entry by a comma
                s = s & tbl1.ListColumns("AdminTime").Range(rcd1.Range.Row, 1).Value
            End If
        Next

        'Finally, store the combined string in the abbreviated table
        tbl2.ListColumns("AdminTime").Range(rcd2.Range.Row, 1).Value = s
    Next

End Sub
0

Я бы использовал Power Query Add-In для этого. Я думаю, что вы могли бы решить эту задачу без написания строки кода.

Сначала я бы использовал команду Duplicate Column для дублирования столбца AdminTimes. Затем я использовал бы команду Pivot для преобразования данных AdminTimes в столбцы:

https://support.office.com/en-US/Article/Pivot-columns-abc9c8da-3be9-44c4-886e-0be331ab387a?ui=en-US&rs=en-US&ad=US

В определении Pivot в столбце "Значения" я должен установить столбец "Copy of AdminTimes", созданный ранее, а для функции "Aggregate Value" - "Не объединять". Это автоматически объединит все остальные столбцы.

Затем я бы использовал команду Merge Columns для объединения сгенерированных новых столбцов в один. Я бы использовал пользовательский разделитель "," (запятая, затем пробел), чтобы получить презентацию, которую вы ищете.

0

Это довольно быстрый и грязный макрос, который оставляет много работы, но вы поймете идею. Это также предполагает, что ваш исходный лист ("Sheet1") отсортирован по LastRxNo. Если бы у вас была возможность добавлять и вызывать функцию в SQLServer, это была бы более простая и менее подверженная ошибкам задача. надеюсь, это поможет вам начать. выводит на лист, называемый "сводка"

Sub conCatTimes()
Dim rx As String
Dim admTimes As String
Dim tmp As String
Dim i As Long
Dim LastRow As Long
LastRow = Sheets("Sheet1").Range("C" & ActiveSheet.Rows.Count).End(xlUp).Row
rx = ""
i = 1
For Each cell In Sheets("Sheet1").Range("C2:C" & LastRow)
    If rx <> cell Then
        rx = cell
        i = i + 1
        tmp = ""
    End If
tmp = cell.Offset(0, 11)
admTimes = admTimes + tmp + ", "
    If cell.Offset(1, 0) <> rx Then
        Sheets("summary").Range("A" & i) = rx
        Sheets("summary").Range("B" & i) = Left(admTimes, Len(admTimes) - 2)
        admTimes = ""
    End If
Next

End Sub

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