Есть ли в Excel способ отобразить определенную ячейку, если другая содержит определенный текст?

#excel

#excel

Вопрос:

Привет всем, у меня есть документ Excel, который представляет собой список людей и действий, которые эти люди выполняют, например:

 People programmming swimming golf
David       Yes        Yes    No
Lucy        Yes        No     Yes
Martin      No         Yes    Yes  

Мне нужно иметь список действий, подсчитывающий количество людей, которые выполняют это действие, и их имена. Например:

 Programming 2 people
     David
     Lucy

Swimming 2 people
     David
     Martin  

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

Что я могу использовать?

Комментарии:

1. Рассматривали ли вы возможность использования фильтра? support.office.com/en-us/article /…

2. Можете ли вы объяснить, что вы имеете в виду, говоря, что вам не нужны пробелы между именами? Будет лучше, если вы сможете показать желаемый результат в терминах ячеек Excel в вопросе. Вы можете прикрепить скриншот.

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

4. Я думаю, вы ищете Pivot Tables . Вы пробовали их?

5. Да, сводная таблица может помочь, но я искал, есть ли способ сделать это с помощью функции

Ответ №1:

Вы, кажется, довольно одержимы подходом VBA, и если это так, скопируйте и вставьте приведенный ниже код в новый модуль в вашей книге…

 Option Explicit

Public Sub TransformData()
    Dim rngCells As Range, lngCol As Long, lngRow As Long, strHeader As String
    Dim lngWriteRow As Long, objDict As Scripting.Dictionary, arrNames() As String
    Dim objDestSheet As Worksheet, i As Long, x As Long

    Set objDestSheet = Worksheets("Transformed")
    Set objDict = New Scripting.Dictionary
    Set rngCells = Selection

    objDestSheet.Cells.Clear

    With rngCells
        For lngCol = 2 To .Columns.Count
            strHeader = .Cells(1, lngCol)

            ' Reset the array in case no names are found to have a yes next to them.
            ReDim Preserve arrNames(0)
            arrNames(0) = ""

            For lngRow = 2 To .Rows.Count
                If Left(UCase(.Cells(lngRow, lngCol)), 1) = "Y" Then
                    ReDim Preserve arrNames(UBound(arrNames)   1)
                    arrNames(UBound(arrNames)) = .Cells(lngRow, 1)
                End If
            Next

            objDict.Add strHeader, arrNames
        Next
    End With

    With objDestSheet
        For i = 0 To objDict.Count - 1
            strHeader = objDict.Keys(i)
            arrNames = objDict.Items(i)

            strHeader = strHeader amp; " " amp; UBound(arrNames) amp; " people"

            lngWriteRow = lngWriteRow   1
            .Cells(lngWriteRow, 1) = strHeader

            For x = 1 To UBound(arrNames)
                lngWriteRow = lngWriteRow   1
                .Cells(lngWriteRow, 1) = arrNames(x)
            Next

            lngWriteRow = lngWriteRow   1
        Next
    End With

    objDestSheet.Activate
End Sub
  

… затем создайте в своей книге лист с именем Transformed .

Добавьте ссылку на приведенную ниже библиотеку…

введите описание изображения здесь

Теперь выберите свою матрицу данных и запустите макрос.

введите описание изображения здесь

Надеюсь, это сработает для вас.