Лист сканирования в Excel на предмет отсутствия идентификатора - PullRequest
0 голосов
/ 15 октября 2019

Я очень плохо знаком с VBA и даже не знаю, с чего начать. Но я пытаюсь сделать так, чтобы у меня была рабочая таблица с удостоверениями личности (людьми) и их посещениями в определенные дни. Смотрите картинку для простого примера. То, что я пытаюсь сделать, это иметь код, который сканирует все идентификаторы, если они пропустили день посещения. Когда визиты 1, 2, 3, 4 и 5 являются обязательными.

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

Я надеюсь, что кто-то может помочь мне с этим.

С уважением.

пример

1 Ответ

0 голосов
/ 16 октября 2019

Следующее решение использует Power Query , который доступен в Excel 2010 Professional Plus и во всех более поздних версиях Excel. Моя демонстрация использует Excel 365 .

Предположим, у вас есть две таблицы:

  • Table1 называется Tbl_Visitday , который является 2-столбцомтаблица в вашем примере;
  • Таблица2 называется Rng_Obligated , которая представляет собой таблицу из 1 столбца, содержащую все обязательные дни.

Tables

  1. Перейдите на вкладку Data на ленте Excel, используйте функцию Из таблицы , чтобы добавить обе таблицы в редактор мощных запросов одну за другой. При первом доступе к редактору убедитесь, что настроили Query Options, как показано ниже, чтобы не загружать каждый запрос на новый лист;

Query Option

После добавления обеих таблиц в редактор создайте дубликат Tbl_Visitday в разделе Queries слева, как показано ниже:

Queries

Давайте сначала поработаем с Rng_Obligated, выделим столбец, используем функцию Транспонирование на вкладке Transform, чтобы транспонировать данные из строк в столбцы, а затем используем функцию Слияние столбцов чтобы объединить все столбцы точкой с запятой ;, тогда у вас должно получиться что-то вроде следующего:

Tbl_Obligated

Давайте перейдем к Tbl_Obligated(2), удалим столбец Visitday, удалим дубликаты в столбце ID и отсортируем их по возрастанию, тогда у вас должно быть:

Sorted

Используйте Добавить функцию запросов на вкладке Home, чтобы добавить таблицу Rng_Obligated к текущей таблице, а затем щелкните правой кнопкой мыши заголовок столбца Merged и выберите Заполнить -> Вверх , чтобы быстро заполнить объединенный столбец той же строкой, тогда у вас должно быть что-то вроде следующего:

Append

Отфильтровал столбец ID, чтобы скрыть null, затем используйте функцию Разделить столбцы на вкладке Transform, чтобы разделить столбец Merged на точку с запятой ; и врасширенные опции для выбора, чтобы поместить результаты в Строки , как показано ниже:

Splited

Используйте функцию Объединить запросы на вкладке Home, чтобы объединить таблицу Tbl_Visitday с текущей таблицей, удерживая клавишу Ctrl и последовательно выбирая первый и второй столбцы в каждомтаблица, как показано ниже:

Merged

Разверните новый столбец слияния, чтобы показать только Visitday столбец, добавьте пользовательский столбец , используя эту формулу =[Merged]=[Visitday], затем отфильтруйте столбец Custom, чтобы показать только FALSE результаты, затем выдолжно иметь:

Filtered

Измените формат столбца Merged на Text, затем используйте функцию Группировать по на вкладке Transform, чтобы сгруппировать столбец Merged по ID, как показано ниже,результат будет error, что ожидается:

Group By

Вернитесь к последнему шагу в разделе APPLIED STEPS с правой стороны, перейдите на панель формул и замените эту часть формулы List.Sum([Merged]) на Text.Combine([Merged],","), нажмите введите , и вы увидите, что error стал текстовой строкой, как показано ниже:

Result

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

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

Power Query позволяет обновлять исходные таблицы и пересчитывать выходные данные (если вы решили обновитьданные) в фоновом режиме, как правило, в течение нескольких секунд. Если вы не хотите, чтобы вывод обновлялся, вы можете скопировать и вставить вывод в новую таблицу, чтобы результаты остались без изменений.

Вот запрос мощности M Code для двух таблиц для вашей справки. Дайте знать, если у вас появятся вопросы. Приветствия:)

Rng_Obligated

let
    Source = Excel.CurrentWorkbook(){[Name="Rng_Obligated"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"obligated", Int64.Type}}),
    #"Transposed Table" = Table.Transpose(#"Changed Type"),
    #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Transposed Table", {{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}}, "en-AU"),{"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged")
in
    #"Merged Columns"

Tbl_Visitday (2)

let
    Source = Excel.CurrentWorkbook(){[Name="Tbl_Visitday"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", type text}, {"Visitday", type text}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Visitday"}),
    #"Removed Duplicates" = Table.Distinct(#"Removed Columns"),
    #"Sorted Rows" = Table.Sort(#"Removed Duplicates",{{"ID", Order.Ascending}}),
    #"Appended Query" = Table.Combine({#"Sorted Rows", Rng_Obligated}),
    #"Filled Up" = Table.FillUp(#"Appended Query",{"Merged"}),
    #"Filtered Rows" = Table.SelectRows(#"Filled Up", each ([ID] <> null)),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Filtered Rows", {{"Merged", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Merged"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Merged", Int64.Type}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type1",{"ID", "Merged"},Tbl_Visitday,{"ID", "Visitday"},"Table6",JoinKind.LeftOuter),
    #"Expanded Table6" = Table.ExpandTableColumn(#"Merged Queries", "Table6", {"Visitday"}, {"Visitday"}),
    #"Added Custom" = Table.AddColumn(#"Expanded Table6", "Custom", each [Merged]=[Visitday]),
    #"Filtered Rows1" = Table.SelectRows(#"Added Custom", each ([Custom] = false)),
    #"Changed Type2" = Table.TransformColumnTypes(#"Filtered Rows1",{{"Merged", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type2", {"ID"}, {{"MissedDay", each Text.Combine([Merged],","), type text}})
in
    #"Grouped Rows"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...