#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 .
Добавьте ссылку на приведенную ниже библиотеку…
Теперь выберите свою матрицу данных и запустите макрос.
Надеюсь, это сработает для вас.