Veseliy.4el

Veseliy.4el

Пикабушник
114К рейтинг 9990 подписчиков 12 подписок 126 постов 95 в горячем
Награды:
более 1000 подписчиковПикабу 15 лет!5 лет на ПикабуС Днем рождения Пикабу!выполнение всех достиженийС Днем рождения, Пикабу! За победу в продуктовом сёрфинге За исследование параллельных миров объединение 500 и более тегов За серию постов об Excel и Google docsболее 10000 подписчиков самый сохраняемый пост недели самый сохраняемый пост недели редактирование тегов в 1000 и более постах объединение 1000 и более тегов

Редизайнер таблиц в Excel

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


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

- простая однострочная шапка, где у каждого столбца будет свое уникальное название (имя поля)

- одна строка - одна законченная операция (сделка, продажа, проводка, проект и т.д.)

- без объединенных ячеек

- без разрывов в виде пустых строк и столбцов


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

из такой таблицы

Редизайнер таблиц в Excel Microsoft Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

сделать

Редизайнер таблиц в Excel Microsoft Excel, Макрос, Vba, Таблица, Полезное, На заметку, Длиннопост

В терминах баз данных нижнюю таблицу обычно называют плоской (flat) - именно по таким таблицам лучше всего строить отчеты сводных таблиц (pivot tables) и проводить аналитику.


Преобразовать двумерную таблицу в плоскую можно при помощи простого макроса. Откройте редактор Visual Basic через вкладку Разработчик - Visual Basic (Developer - Visual Basic Editor) или сочетанием клавиш Alt+F11. Вставьте новый модуль (Insert - Module) и скопируйте туда текст этого макроса:

Sub Redesigner()

Dim i As Long

Dim hc As Integer, hr As Integer

Dim ns As Worksheet

hr = InputBox("Сколько строк с подписями сверху?")

hc = InputBox("Сколько столбцов с подписями слева?")

Application.ScreenUpdating = False

i = 1

Set inpdata = Selection

Set ns = Worksheets.Add

For r = (hr + 1) To inpdata.Rows.Count

For c = (hc + 1) To inpdata.Columns.Count

For j = 1 To hc

ns.Cells(i, j) = inpdata.Cells(r, j)

Next j

For k = 1 To hr

ns.Cells(i, j + k - 1) = inpdata.Cells(k, c)

Next k

ns.Cells(i, j + k - 1) = inpdata.Cells(r, c)

i = i + 1

Next c

Next r

End Sub

После этого можно закрыть редактор VBA и вернуться в Excel. Теперь можно выделить исходную таблицу (полностью, с шапкой и первым столбцом с месяцами) и запустить наш макрос через Разработчик - Макросы (Developer - Macros) или нажав сочетание Alt+F8.


Макрос вставит в книгу новый лист и создаст на нем новый, реконструированный вариант выделенной таблицы. С такой таблицей можно работать "по полной программе", применяя весь арсенал средств Excel для обработки и анализа больших списков.


Также есть второй вариант для работы с большими таблицами

Sub Redesigner()

Dim inpdata As Range, realdata As Range, ns As Worksheet

Dim i&, j&, k&, c&, r&, hc&, hr&

Dim out(), dataArr, hcArr, hrArr

hr = Val(InputBox("Сколько строк с подписями данных сверху?"))

hc = Val(InputBox("Сколько столбцов с подписями данных слева?"))

Set inpdata = Selection

If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub

Set realdata = inpdata.Offset(hr, hc).Resize(inpdata.Rows.Count - hr, inpdata.Columns.Count - hc)

dataArr = realdata.Value

If hr Then hrArr = inpdata.Offset(0, hc).Resize(hr, inpdata.Columns.Count - hc).Value

If hc Then hcArr = inpdata.Offset(hr, 0).Resize(inpdata.Rows.Count - hr, hc).Value

ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)

Set ns = Worksheets.Add

For i = 1 To UBound(dataArr, 1)

For j = 1 To UBound(dataArr, 2)

If Not IsEmpty(dataArr(i, j)) Then

k = k + 1

For c = 1 To hc: out(k, c) = hcArr(i, c): Next c

For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r

out(k, c + r - 1) = dataArr(i, j)

End If

Next j, i

ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out

End Sub

Редизайн таблиц сэкономит кучу времени, нервов и сил, чтобы в оставшееся время почитать пикабу))

Взято отсюда

Показать полностью 2

Отслеживание входа пользователей в книгу Excel

Как понятно из заголовка, мы сделаем так, чтобы открытие рабочего файла на общем сетевом диске не осталось бесследным. Макрос будет фиксировать на отдельном (скрытом) листе имя пользователя, открывшего файл, а также дату-время открытия и закрытия файла.


Этап 1. Создаем "Лог"

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

Отслеживание входа пользователей в книгу Excel Microsoft Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 2. Макросы фиксации входа-выхода

Теперь добавим макросы для записи на лист Лог даты-времени и имен пользователей при открытии и закрытии книги. Для этого нужно открыть редактор Visual Basic с помощью сочетания Alt+F11 или с помощью кнопки Visual Basic на вкладке Разработчик (Developer) и найти в левом верхнем углу панель Project (если она не отображается, то включить ее можно сочетанием клавиш Ctrl+R):

Отслеживание входа пользователей в книгу Excel Microsoft Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Двойным щелчком откройте модуль ЭтаКнига (ThisWorkbook) и вставьте туда пару наших макросов для обработки событий открытия и закрытия книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow>1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub

Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

End Sub

Попробуйте открыть-закрыть этот файл пару раз и убедитесь, что на лист Лог попадает ваше имя пользователя (логин входа в Windows) и дата-время:

Отслеживание входа пользователей в книгу Excel Microsoft Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Этап 3. Улучшаем надежность

Можно было бы скрыть лист Лог и на этом остановиться, но есть одно "но": если у пользователя, который открывает нашу книгу, макросы разрешены по умолчанию либо он сам их разрешает, нажав в окне предупреждения на кнопку Включить содержимое, то все в порядке:

Отслеживание входа пользователей в книгу Excel Microsoft Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Но что если пользователь не разрешит выполнение макросов или они отключены у него по умолчанию? Тогда наши макросы отслеживания выполняться не будут и фиксации имени и даты не произойдет :( Как же заставить пользователя разрешить использование макросов?

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

Отслеживание входа пользователей в книгу Excel Microsoft Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Суть в том, чтобы по умолчанию скрыть в книге все листы кроме этого, а рабочие листы с данными отображать с помощью специального макроса. Если пользователь не разрешил выполнение макросов, то он увидит в книге только один лист с предупреждением. Если же макросы разрешены, то наш макрос обработки события открытия книги скроет лист с предупреждением и отобразит листы с данными. Чтобы пользователь сам не отобразил их - используем суперскрытие вместо обычного скрытия листов (параметр xlSheetVeryHidden вместо обычного False).

Чтобы реализовать все описанное, слегка изменим наши процедуры в модуле ЭтаКнига (ThisWorkbook)

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим дату-время выхода из файла

If lastrow > 1 Then Worksheets("Лог").Cells(lastrow, 3) = Now

'скрываем все листы, кроме листа ПРЕДУПРЕЖДЕНИЕ

Worksheets("Предупреждение").Visible = True

For Each sh In ActiveWorkbook.Worksheets

If sh.Name = "Предупреждение" Then

sh.Visible = True

Else

sh.Visible = xlSheetVeryHidden

End If

Next sh

'сохраняемся перед выходом

ActiveWorkbook.Save

End Sub


Private Sub Workbook_Open()

'ищем последнюю занятую строчку в логах

lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row

'заносим имя пользователя и дату-время входа в файл

Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")

Worksheets("Лог").Cells(lastrow + 1, 2) = Now

'отображаем все листы

For Each sh In ActiveWorkbook.Worksheets

sh.Visible = True

Next sh

'скрываем листы ПРЕДУПРЕЖДЕНИЕ и ЛОГ

Worksheets("Предупреждение").Visible = xlSheetVeryHidden

Worksheets("Лог").Visible = xlSheetVeryHidden

End Sub

Чтобы просмотреть скрытый Лог откройте редактор VisualBasic (Alt+F11), выделите лист на панели Project и измените его видимость на панели Properties, используя свойство Visible:

Отслеживание входа пользователей в книгу Excel Microsoft Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Если пользователи настолько продвинутые, что знают про суперскрытые листы и могут их отобразить через редактор Visual Basic или нарушить работу наших макросов, то можно дополнительно поставить пароль на просмотр и изменение макросов. Для этого щелкните правой кнопкой мыши по имени файла в панели Project (строка VBAProject (blackbox.xls)), выберите команду VBA Project Properties и включите флажок Lock project for viewing и задайте пароль на вкладке Protection:

Отслеживание входа пользователей в книгу Excel Microsoft Excel, Vba, Макрос, Полезное, Контроль, На заметку, Длиннопост, Системное администрирование

Теперь точно никто не уйдет безнаказанным.


Интересные поправки в макрос из комментария источника:

Вместо поиска последней занятой строки в таких случаях я обычно вставляю новую строку сразу после "шапки". Все предыдущие строки сдвигаются вниз, конечно. В результате немного упрощается код, сортировка получается обратная, "новые сверху", что позволяет быстрее просматривать последние записи, не прокручивая лист. При открытии - вставляется строка, её номер всегда будет 2. При закрытии файла в строку 2 добавляется время. Переполнение этого стека маловероятно, но и проверку такого переполнения проводить не нужно, просто отрезать строки ниже запланированного количества записей, без проверки.

Private Sub Workbook_Open()

Worksheets("Реестр изменений").Rows("2:2").Insert Shift:=xlDown 'вставляем между строками 1 и 2 новую строку

Worksheets("Реестр изменений").Rows("501:501").Delete Shift:=xlUp 'удаляем строку 501 (реестр на 500 строк)

Worksheets("Реестр изменений").Cells(2, 1) = Environ("USERNAME") 'запись в первую ячейку второй строки

Worksheets("Реестр изменений").Cells(2, 2) = Now 'запись во вторую ячейку второй строки

Показать полностью 6

Макрос для выделения дубликатов разными цветами

Как известно, чтобы выделить дубликаты цветом в Excel можно воспользоваться специальной опцией в «условном форматировании».

Достаточно выделить диапазон, задать цвет заливки, - и все повторяющиеся (или, наоборот, уникальные) значения будут выделены.

Но иногда требуется, чтобы различные повторяющиеся значения были выделены РАЗНЫМИ ЦВЕТАМИ.

В этом случае, без макросов не обойтись. Нажимаем сочетание клавиш Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), вставляем новый пустой модуль через меню Insert - Module и копируем туда код этого макроса:

Sub ВыделитьДубликатыРазнымиЦветами()

On Error Resume Next

' массив цветов, используемых для заливки ячеек-дубликатов

Colors = Array(12900829, 15849925, 14408946, 14610923, 15986394, 14281213, 14277081, _

9944516, 14994616, 12040422, 12379352, 15921906, 14336204, 15261367, 14281213)

Dim coll As New Collection, dupes As New Collection, _

cols As New Collection, ra As Range, cell As Range, n&

Err.Clear: Set ra = Intersect(Selection, ActiveSheet.UsedRange)

If Err Then Exit Sub

ra.Interior.ColorIndex = xlColorIndexNone: Application.ScreenUpdating = False

For Each cell In ra.Cells ' запонимаем значение дубликатов в коллекции dupes

Err.Clear: If Len(Trim(cell)) Then coll.Add CStr(cell.Value), CStr(cell.Value)

If Err Then dupes.Add CStr(cell.Value), CStr(cell.Value)

Next cell

For i& = 1 To dupes.Count ' заполняем коллекцию cols цветами для разных дубликатов

n = n Mod (UBound(Colors) + 1): cols.Add Colors(n), dupes(i): n = n + 1

Next

For Each cell In ra.Cells ' окрашиваем ячейки, если для её значения назначен цвет

cell.Interior.color = cols(CStr(cell.Value))

Next cell

Application.ScreenUpdating = True

End Sub

Теперь можно выделить любой диапазон с данными на листе и запустить макрос с помощью сочетания клавиш Alt+F8 или через кнопку Макросы (Macros) на вкладке Разработчик (Developer).

Макрос для выделения дубликатов разными цветами Microsoft Excel, Макрос, Vba, Полезное, На заметку

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

Показать полностью 1

Сравнение скорости работы функции ВПР

Сравнение проведено Николаем Павловым на таблице в 500.000 и 600 строк. Тестируемые функции:

1. ВПР

2. ВПР с выделением столбцов целиком

3. ИНДЕКС и ПОИСКПОЗ

4. СУММЕСЛИ

5. СУММПРОИЗВ

6. ПРОСМОТР

7. Новая функция ПРОСМОТРХ

8. Запрос Power Query

- Итоговая таблица и выводы

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Это книга Excel с одним листом, где расположены две таблицы: отгрузки (500 000 строк) и прайс-лист (600 строк).

Задача - подставить цены из прайс-листа в таблицу отгрузок. Для каждого способа будем вводить формулу в ячейку С2 и копировать вниз на весь столбец, замеряя время, которое потребуется Excel, чтобы просчитать весь столбец из полумиллиона ячеек. Полученные значения, безусловно, зависят от множества факторов (поколение процессора, объем оперативной памяти, текущая загрузка системы, версия Office и т.д.), но нам важны не конкретные цифры, а, скорее, их сравнение друг с другом. Важно понимать прожорливость каждого способа и их ограничения.


Способ 1. ВПР

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Здесь участвуют следующие аргументы:

B2 - искомое значение, т.е. название товара, который мы хотим найти в прайс-листе

$G$2:$H$600 - закреплённая знаками доллара (чтобы не сползала при копировании формулы вниз) абсолютная ссылка на прайс

2 - номер столбца в прайс-листе, откуда мы хотим взять цену

0 или ЛОЖЬ - переключение в режим поиска точного соответствия, когда любое некорректное название товара (например, ФОНЕРА) в столбце "B" в таблице отгрузок приведёт к появлению ошибки #Н/Д как результата работы функции.

Время вычисления = 4,3 сек.

Способ 2. ВПР с выделением столбцов целиком

Многие пользователи, применяя ВПР, во втором аргументе этой функции, где нужно задать поисковую таблицу (прайс), выделяют не ограниченный диапазон ($G$2:$H$600), а сразу столбцы G:H целиком. Это проще, быстрее, позволяет не думать про F4 и то, что завтра прайс-лист может быть на несколько строк больше. Формула в этом случае выглядит тоже компактнее:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

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

Время вычисления = 14,5 сек.

Способ 3. ИНДЕКС и ПОИСКПОЗ

Следующей после ВПР ступенью эволюции для многих пользователей Excel обычно является переход на использование связки функций ИНДЕКС (INDEX) и ПОИСКПОЗ (MATCH). Выглядит эта формула так:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Здесь:

Функция ИНДЕКС извлекает из заданного в первом аргументе диапазона (столбца $H$2:$H$600 с ценами в прайс-листе) содержимое ячейки с заданным номером. А номер этот, в свою очередь, определяется функцией ПОИСКПОЗ, у которой три аргумента:

- Что нужно найти - название товара из B2

- Где мы это ищем - столбец с названиями товаров в прайсе ($G$2:$G$600)

- Режим поиска: 0 - точный, 1 или -1 - приблизительный с округлением в меньшую или большую сторону, соответственно.


Формула выходит чуть сложнее, но, при этом имеет несколько ощутимых преимуществ перед классической ВПР, а именно:

- Не нужно отсчитывать номер столбца (как в третьем аргументе ВПР).

- Можно извлекать данные, которые находятся левее столбца, где происходит поиск.

По скорости, однако же, этот способ проигрывает ВПР почти в два раза:

Время вычисления = 7,8 сек.

Если же, вдобавок, полениться и выделять не ограниченные диапазоны, а столбцы целиком:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

... то результат получается совсем печальный:

Время вычисления = 28,5 сек.

Способ 4. СУММЕСЛИ

Если нужно найти не текстовые, а именно числовые данные (как в нашем случае - цену), то вместо ВПР вполне можно использовать функцию СУММЕСЛИ (SUMIF). Изначально она задумывалась как инструмент для выборочного суммирования данных по условию (найди и сложи мне все продажи кабелей, например), но можно заставить её искать нужный нам товар и в прайс-листе. Если грузы в нём не повторяются, то суммировать будет не с чем и эта функция просто выведет искомое значение:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Здесь:

- Первый аргумент СУММЕСЛИ - это диапазон проверяемых ячеек, т.е. названия товаров в прайсе ($G$2:$G$600).

- Второй аргумент (B2) - что мы ищем.

- Третий аргумент - диапазон ячеек с ценами $H$2:$H$600, числа из которых мы хотим просуммировать, если в соседних ячейках проверяемого диапазона есть искомое значение.


Очевидным минусом такого подхода является то, что он работает только с числами. Также этот способ не удобен, если прайс-лист находится в отдельном файле - придется всё время держать его открытым, т.к. функция СУММЕСЛИ не умеет брать данные из закрытых книг, в отличие от ВПР, для которой это не проблема.


В плюсы же можно записать удобство при поиске сразу по нескольким столбцам - для этого идеально подходит более продвинутая версия этой функции - СУММЕСЛИМН (SUMIFS). Скорость вычислений же, при этом, весьма посредственная:

Время вычисления = 12,8 сек.

При выделении столбцов целиком, т.е. использовании формулы вида =СУММЕСЛИ(G:G; B2; H:H) всё ещё хуже:

Время вычисления = 41,7 сек.

Способ 5. СУММПРОИЗВ

Этот подход сейчас встречается не часто, но всё ещё достаточно регулярно. Обычно так любят извращаться пользователи старой школы, ещё хорошо помнящие те времена, когда в Excel было всего 255 столбцов и 56 цветов :)


Суть этого метода заключается в использовании функции СУММПРОИЗВ (SUMPRODUCT), изначально предназначенной для поэлементного перемножения нескольких диапазонов с последующим суммированием полученных произведений. В нашем случае, вместо одного из массивов будет выступать условие, а вторым будут цены:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Выражение ($G$2:$G$600=B2), по сути, проверяет каждое название груза в прайс-листе на предмет соответствия искомому значению (ФАНЕРА ПР). Результатом каждого сравнения будет логическое значение ИСТИНА (TRUE) или ЛОЖЬ (FALSE), что в Excel интерпретируется как 1 и 0, соответственно. Последующее умножение этих нулей и единиц на цены оставит в живых цену только того товара, который нам, в данном случае, и нужен.


Эта формула является, по сути, формулой массива, но не требует нажатия обычного для них сочетания клавиш Ctrl+Shift+Enter, т.к. функция СУММПРОИЗВ поддерживает массивы уже сама по себе. Возможно, по этой же причине (формулы массива всегда медленнее, чем обычные) такой скорость пересчёта такой формулы - не очень:

Время вычисления = 11,8 сек.

К плюсам же такого подхода можно отнести:

- Совместимость с любыми, самыми древними версиями Excel.

- Возможность задавать сложные условия (и несколько)

- Способность этой формулы работать с данными из закрытых файлов, если добавить перед ней двойное бинарное отрицание (два подряд знака "минус"). СУММЕСЛИМН таким похвастаться не может.


Способ 6. ПРОСМОТР

Ещё один относительно экзотический способ поиска и подстановки данных, наравне с ВПР - это использование функции ПРОСМОТР (LOOKUP). Только не перепутайте её с новой функцией ПРОСМОТРХ (XLOOKUP) - про неё мы поговорим дальше особо. Функция ПРОСМОТР существовала в Excel начиная с самых ранних версий и тоже вполне может решить нашу задачу:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Здесь:

- B2 - название груза, которое мы ищем

- $G$2:$G$600 - одномерный диапазон-вектор (столбец или строка), где мы ищем совпадение

- $H$2:$H$600 - такого же размера диапазон, откуда нужно вернуть найденный результат (цену)


На первый взгляд всё выглядит очень удобно и логично, но всю картину портят два неочевидных момента:

- Эта функция требует обязательной сортировки прайс-листа по возрастанию (алфавиту) и без этого не работает.

- Если в таблице отгрузок искомое значение будет написано с опечаткой (например, АГЕДОЛ вместо АГИДОЛ), то функция ПРОСМОТР выдаст не ошибку #Н/Д, а цену для ближайшего предыдущего товара:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

При работе с неидеальными данными в реальном мире это гарантированно создаст проблемы, как вы понимаете.

Скорость же вычислений у функции ПРОСМОТР (LOOKUP) весьма приличная:

Время вычисления = 7,6 сек.

Способ 7. Новая функция ПРОСМОТРХ

Эта функция пришла с одним из недавних обновлений пока только пользователям Office 365 и пока отсутствует во всех остальных версиях (Excel 2010, 2013, 2016, 2019). По сравнению с классической ВПР у этой функции есть масса преимуществ (упрощенный синтаксис, возможность искать не только сверху-вниз, возможность сразу задать значение вместо #Н/Д и т.д.) Формула для решения нашей задачи будет выглядеть в этом случае так:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Если не брать в расчёт необязательные 4,5,6 аргументы, то синтаксис этой функции полностью совпадает с её предшественником - функцией ПРОСМОТР (LOOKUP). Скорость вычислений при тестировании на наши 500000 строк тоже оказалась аналогичной:

Время вычисления = 7,6 сек.

Почти в два раза медленнее, чем у ВПР, вместо которой Microsoft предлагает теперь использовать ПРОСМОТРХ. Жаль.

И, опять же, если полениться и выделить диапазоны в прайс-листе целыми столбцами:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

... то скорость падает до совершенно неприличных уже значений:

Время вычисления = 28,3 сек.

А если на динамических массивах?

Прошлогоднее (осень 2019) обновление вычислительного движка Microsoft Excel добавило ему поддержку динамических массивов (Dynamic Arrays). Это принципиально новый подход к работе с данными, который можно использовать почти с любыми классическими функциями Excel. На примере ВПР это будет выглядеть так:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Разница с классическим вариантом в том, что первым аргументом ВПР здесь выступает не одно искомое значение (а формулу потом нужно копировать вниз на остальные строки), а сразу весь массив из полумиллиона грузов B2:B500000, цены для которых мы хотим найти. Формула при этом сама распространяется вниз, занимая требуемое количество ячеек.


Скорость пересчета в таком варианте меня, откровенно говоря, ошеломила - пауза между нажатием на Enter после ввода формулы и получением результатов почти отсутствовала.

Время вычисления = 1 сек.

Что интересно, и новая ПРОСМОТРХ, и старая ПРОСМОТР, и связка ИНДЕКС+ПОИСКПОЗ в таком режиме тоже были очень быстрыми - время вычислений не больше 1 секунды! Фантастика.


А вот олдскульные подходы на основе СУММПРОИЗВ и СУММЕСЛИ(МН) с динамическими массивами работать отказались :(


Что с умными таблицами?

Обрадовавшись фантастическим результатам, полученным на динамических массивах, я решил вдогон попробовать протестировать разницу в скорости при работе с обычными и "умными" таблицами. Я имею ввиду те самые "красивые таблицы", в которые вы можете преобразовать ваш диапазон с помощью команды Форматировать как таблицу на вкладке Главная (Home - Format as Table) или с помощью сочетания клавиш Ctrl+T.


Если предварительно превратить наши отгрузки и прайс в "умные" (по умолчанию они получат имена Таблица1 и Таблица2, соответственно), то формула с той же ВПР будет выглядеть как:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Здесь:

[@Груз] - ссылка на ячейку B2, означающая, в данном случае, что нужно взять значение из той же строки из столбца Груз текущей умной таблицы.

Таблица2 - ссылка на прайс-лист


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


Скорость же, как выяснилось, тоже вырастает очень значительно и примерно равна скорости работы на динамических массивах:

Время вычисления = 1 сек.

У меня есть подозрение, что дело тут не в самих "умных" таблицах, а всё в том же обновлении вычислительного движка, т.к. на старых версиях Excel такого прироста в скорости на умных таблицах я не помню.


Бонус. Запрос Power Query

Замерять, так замерять! Давайте, для полноты картины, сравним наши перечисленные способы еще и с запросом Power Query, который тоже может решить нашу задачу. Кто-то скажет, что некорректно сравнивать пересчёт формул с механизмом обновления запроса, но мне, откровенно говоря, просто самому было интересно - кто быстрее?

Итак:

1. Превращаем обе наши таблицы в "умные" с помощью команды Форматировать как таблицу на вкладке Главная (Home - Format as Table) или с помощью сочетания клавиш Ctrl+T.

2. По очереди загружаем таблицы в Power Query с помощью команды Данные - Из таблицы / диапазона (Data - From Table/Range).

3. После загрузки в Power Query возвращаемся обратно в Excel, оставляя загруженные данные как подключение. Для этого в окне Power Query выбираем Главная - Закрыть и загрузить - Закрыть и загрузить в... - Только создать подключение (Home - Close&Load - Close&Load to... - Only create connection).

4. После того, как обе исходные таблицы будут загружены как подключения, создадим ещё один, третий запрос, который будет объединять их между собой, подставляя цены из прайса в отгрузки. Для этого на вкладке Данные выберем Получить данные / Создать запрос - Объединить запросы - Объединить (Get Data / New Query - Merge queries - Merge):

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

5. В открывшемся окне выберем исходные таблицы в выпадающих списках и выделим столбцы, по которым произойдет связывание:

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

После нажатия на ОК мы вернемся в окно Power Query, где увидим нашу таблицу отгрузок с добавленным к ней столбцом, где в каждой ячейке будет лежать фрагмент прайс-листа, соответствующий этому грузу. Развернем вложенные таблицы с помощью кнопки с двойными стрелками в шапке столбца, выбрав нужные нам данные (цены):

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

7. Останется выгрузить готовую таблицу обратно на лист с помощью уже знакомой команды Главная - Закрыть и загрузить (Home - Close&Load).


В отличие от формул, запросы Power Query не обновляются автоматически "на лету", а требуют щелчка правой кнопкой мыши по таблице (или запросу в правой панели) и выбору команды Обновить (Refresh). Также можно воспользоваться командой Обновить все (Refresh All) на вкладке Данные (Data).

Время обновления = 8,2 сек.

Итоговая таблица и выводы

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

Сравнение скорости работы функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Само-собой, у каждого из нас свои предпочтения, задачи и тараканы, но для себя я сформулировал выводы после этого тестирования так:

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

- Не нужно лениться и выделять столбцы целиком - для всех способов без исключения это ухудшает результаты почти в 3 раза.

- Экзотические способы из прошлого типа СУММПРОИЗВ и СУММЕСЛИ - в топку. Они работают очень медленно и, вдобавок, не поддерживают динамические массивы.

- Динамические массивы и умные таблицы - это будущее.

Показать полностью 17

Ад Условного Форматирования в Excel

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


Этот пост будет полезен для тех, кто использует условное форматирование и сталкивался с проблемой, когда удалив/переместив/добавив лишь одну строку сбивались правила УФ и появлялся ад. Для примера рассмотрим простую таблицу продаж:

Ад Условного Форматирования в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Для наглядности к таблице добавлены три правила условного форматирования:

Ад Условного Форматирования в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Первое правило делает синие гистограммы на столбце с суммами сделок.

Второе - подсвечивает желтым ячейки с именами менеджеров, которые не выполнили план, т.е. сумма их сделки меньше, чем зелёная ячейка H2.

Третье - делает нижнюю границу всей строки красной, если день меняется на следующий, т.е. дата в текущей строке не равна дате в следующей.


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

Ад Условного Форматирования в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Красная линия между 2 и 3-м марта почему-то исчезла, а наше правило условного форматирования для разделения дат развалилось на два, причем одно из них с ошибкой #ССЫЛКА (т.е. не работает), а другое применяется к двум не смежным диапазонам A2:E8 и A10:E29 (не ко всей таблице!).

Шикарно, правда?!


Теперь представим, что Кирилл Краснов повторил свою сделку в Тольятти с магазином "Лента" (строка 25) и вам нужно внести эти данные в таблицу.

Как вы поступите?

Скорее всего, как любой нормальный человек, вы скопируете 25-ю строчку и вставите её в конец таблицы, верно?

Ад Условного Форматирования в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Ага, и получите в наследство вот такой бардак в правилах условного форматирования:

Ад Условного Форматирования в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Excel зачем-то продублировал те же правила для добавленной строки вместо того, чтобы просто растянуть диапазон в поле Применяется к (Applied to).


Ну, и на десерт вставим пустую строку в середину таблицы, между 4 и 5-й строчками:

Ад Условного Форматирования в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

В списке правил условного форматирования это приведёт к появлению еще одного дубликата и раздроблению диапазона уже существующего 5-го правила на кучу фрагментов:

Ад Условного Форматирования в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

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


Причем весь этот быстро разрастающийся бардак очень скоро начнёт нещадно тормозить. Условное форматирование, само по себе, весьма ресурсоёмкая штука, т.к. Excel пересчитывает правила УФ гораздо чаще, чем те же формулы. А когда этих правил несколько десятков, то даже самый мощный ПК начнёт "тупить".


Как же всё исправить?

Способ 1. Вручную


Несмотря на кажущуюся запущенность, лечится это всё достаточно легко. Идея в том, что правила УФ "ломаются", обычно, для строк ниже первой. Первая же строка, в большинстве случаев, остается в порядке. Поэтому, чтобы всё починить, нам нужно просто очистить все правила в таблице и заново распространить их с первой строки на все остальные.


Для этого делаем следующее:

1. Выделяем в нашей таблице все строки кроме первой.

2. Удаляем все правила условного форматирования с выделенных ячеек через Главная - Условное форматирование - Удалить правила - Удалить правила из выделенных ячеек (Home - Conditional formatting - Clear rules - Clear rules from selected cells).

3. Выделяем первую строку, жмём кнопку-кисточку Формат по образцу на Главной (Home - Format Painter) и выделяем все остальные строки, копируя на них формат с первой.


Способ 2. Макросом


Если есть ощущение, что подобную процедуру вам придётся проделывать ещё не раз, то имеет смысл автоматизировать весь процесс с помощью макроса. Для этого:

1. Жмём сочетание клавиш Alt+F11 или на вкладке Разработчик кнопку Visual Basic (Developer - Visual Basic).

2. В открывшемся окне редактора макросов добавляем в нашу книгу новый модуль через меню Insert - Module.

3. Вставляем в созданный пустой модуль наш макрос:

Sub Fix_СF_Hell()

'создаем ссылки на диапазоны

Set rngAll = Selection

Set rngRow1 = Selection.Rows(1)

Set rngRow2 = Selection.Rows(2)

Set rngRowLast = Selection.Rows(rngAll.Rows.Count)

'удаляем все правила форматирования со всех строк кроме первой

Range(rngRow2, rngRowLast).FormatConditions.Delete

'копируем форматы с первой строки на все остальные

rngRow1.Copy

Range(rngRow1, rngRowLast).PasteSpecial Paste:=xlPasteFormats

Application.CutCopyMode = False

End Sub

Теперь можно будет просто выделить все строки в таблице (кроме шапки) и запустить макрос через Разрабочик - Макросы (Developer - Macros) или сочетанием клавиш Alt+F8.

И всё будет хорошо :)


P.S.

Не забудьте сохранить файл в формате с поддержкой макросов (xlsm).

Если нужно применять этот макрос в других файлах, то имеет смысл поместить его в Личную Книгу Макросов (Personal Macro Workbook).


Здоровья вам и вашим близким) материал взят отсюда

Показать полностью 7

Приблизительный поиск с помощью функции ВПР

Продолжаем раскрывать тему ВПР. В этот раз мы рассмотрим, как рассчитать доплаты к окладам сотрудников за выслугу лет или добавочные бонусы к зарплате.

Приблизительный поиск с помощью функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Если сотрудник проработал в компании меньше года – он не получает ничего. Если проработал от года до двух – получает 10% доплаты. Если от двух до трёх – 15%. Если от трёх до пяти – 25% и т.д. Максимальный бонус в 100% полагается тем, кто работает в компании больше 10 лет.


Выделяем первую ячейку (G2), куда будем вводить функцию ВПР, на вкладке «Формулы» нажимаем «Вставить функцию». В категории «Ссылки и массивы» (Lookup and Reference) находим ВПР (VLOOKUP) и жмём ОК. В появившемся окне вводим аргументы для функции:

Приблизительный поиск с помощью функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Искомое значение – стажа сотрудника, для которого мы определяем бонус.

Таблица – сама таблица бонусов. Не забываем нажать клавишу F4, чтобы сделать ссылку абсолютной.

Номер столбца – порядковый номер столбца в таблице бонусов, откуда мы берем размер доплаты (у нас всего два столбца и номер, очевидно, 2).

Интервальный просмотр – этот аргумент нужно задать равным 1, чтобы Excel производил поиск ближайшего наименьшего числа в первой колонке таблицы. Для точного поиска используется значение 0.


Вот ещё примеры использования функции ВПР:

Найти нужную скидку в таблице скидок, если размер скидки зависит от количества купленного товара или его стоимости (от 1 до 5 шт. – скидки нет, от 6 до 10 шт. – скидка уже 3%, свыше 11 шт. – скидка 5% и т.д.):

Приблизительный поиск с помощью функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Определить цену билета для пригородной зоны, если известно, до какой станции (на какое расстояние) едет пассажир:

Приблизительный поиск с помощью функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Определить, на какой стадии выполнения проекта мы на данный момент находимся:

Приблизительный поиск с помощью функции ВПР Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост
Показать полностью 4

Функция ВПР в Excel1

Многим знакома функция ВПР в Excel, которая ищет заданное значение в столбце указанной таблицы, и если находит, то выдаёт значение из требуемого столбца той же строки, где было совпадение.

=ВПР(Искомое_значение; Таблица_где_ищем; Номер_столбца_результатов; Тип_поиска)

Тема ВПР достаточно объёмная и интересная. Знание ВПР превращает обычного пользователя Excel в продвинутого)). Не сомневаюсь, что в сообществе имеется много знатоков этой функции, которые каждый день используют её на работе, думаю новичкам было бы интересно узнать о способах применения ВПР на практике.

Итак, начнём повышать уровень знаний в период самоизоляции))


Допустим, у нас имеются две таблицы – Заказы и прайс-лист:

Функция ВПР в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

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


Примеры использования ВПР:

- подставить из штатного расписания данные о сотруднике (адрес, оклад, телефон) по его ФИО;

- подставить из каталога продукции подробную информацию о товаре по его артикулу;

- подставить из реестра договоров по номеру договора все подробности его заключения (с кем заключен, реквизиты, сумму и т.д.);

- и так далее.


Выделяем первую ячейку (D3), куда будем вводить функцию ВПР, на вкладке «Формулы» нажимаем «Вставить функцию». В категории «Ссылки и массивы» (Lookup and Reference) находим ВПР (VLOOKUP) и жмём ОК

Функция ВПР в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Появится окно ввода аргументов для функции:

Функция ВПР в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Заполняем поля по очереди:

- Искомое значение – наименование товара, которое функция должна найти в крайнем левом столбце прайс-листа (слово «Вода» из ячейки B3).

- Таблица – таблица, из которой берутся искомые значения, т.е. наш прайс-лист. Чтобы при копировании функции вниз на весь столбец ссылка на прайс не сбилась, ее нужно сделать абсолютной, нажав клавишу F4.

- Номер_столбца – порядковый номер (не буква!) столбца в прайс-листе, из которого берём значения цены. Первый столбец прайс-листа с названиями имеет номер 1, следовательно, нам нужна цена из столбца с номером 2.

- Интервальный_просмотр – ЛОЖЬ (0) или ИСТИНА (1):

- ЛОЖЬ КЛАДИ - поиск точного соответствия. Если товар отсутствует в прайс-листе или написан с ошибкой, то функция выдаст ошибку #Н/Д.

- ИСТИНА - поиск приблизительного соответствия. Функция попытается найти товар с максимально похожим наименованием и выдаст цену для этого товара.

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

После ввода всех аргументов нажимаем ОК и протягиваем введенную функцию на весь столбец.


Функция ВПР выдаёт ошибку #Н/Д если:

1. Включен точный поиск (Интервальный просмотр=0) и искомого наименования нет в Таблице.

2. Включен приблизительный поиск (Интервальный просмотр=1), но Таблица, в которой происходит поиск, не отсортирована по возрастанию наименований.

3. Форматы ячеек первого столбца и образцовой таблицы отличаются (числовой и текстовый). Можно использовать функции Ч и ТЕКСТ для преобразования форматов данных.

4. Функция не может найти нужного значения, потому что в коде есть пробелы или невидимые непечатаемые знаки (перенос строки и т.п.). В этом случае можно использовать текстовые функции СЖПРОБЕЛЫ и ПЕЧСИМВ для их удаления:

=ВПР(СЖПРОБЕЛЫ(ПЕЧСИМВ(B3));$G$3:$H$19;0)

=VLOOKUP(TRIM(CLEAN(B3));$G$3:$H$19;0)

Для подавления сообщения об ошибке #Н/Д в тех случаях, когда функция не может найти точного соответствия, можно воспользоваться функцией ЕСЛИОШИБКА (IFERROR). В результате любые ошибки, создаваемые ВПР, заменятся на нули или пустые строки:

Функция ВПР в Excel Microsoft Excel, Таблица, Полезное, На заметку, Длиннопост

Итого получаем, 5 минут на заполнение формулы и куча сэкономленного времени и нервов, в которое имитируем бурную деятельность и читаем Пикабу)) Всем здоровья, берегите себя!

Дополнение к посту: #comment_166519497

Показать полностью 4

Коробка мистера Мисикса

В ожидании новых серий "Рика и Морти" решил сделать подарок для любимой супруги))

Идею увидел у @WinterIsComming, которая помогла с созданием коробочки мистера Мисикса, за что ей отдельное огромное спасибо)))

Вот её пост с процессом Коробочка Magic Box "Рик и Морти"

Коробка мистера Мисикса Рик и Морти, Коробка, Подарки, Гифка, Длиннопост

При поднятии крышки, стенки коробки раскрываются в стороны

Коробка мистера Мисикса Рик и Морти, Коробка, Подарки, Гифка, Длиннопост

Внутри находится сам мистер Мисикс и лежат коробочки с "Глазочками" (грильяж) и "Клубничными хохотушками" (мармеладки).

Подарок делал на 8 марта, сразу не сфоткал, а теперь вкусняшки давно уже съедены))

Коробка мистера Мисикса Рик и Морти, Коробка, Подарки, Гифка, Длиннопост

При создании коробочки главное не переборщить с клеем, иначе при высыхании бумага будет кривой.

Денежные резинки держат коробочки, чтобы они не распадались внутри

Коробка мистера Мисикса Рик и Морти, Коробка, Подарки, Гифка, Длиннопост

Саму основную коробку и крышку я загибал с помощью биговочного аппарата

Коробка мистера Мисикса Рик и Морти, Коробка, Подарки, Гифка, Длиннопост

Чтобы аккуратно сложить коробочки я проводил тупым предметом по внутренней стороне линии сгиба, затем легко складывал, получилась как бы ручная биговка)

Коробка мистера Мисикса Рик и Морти, Коробка, Подарки, Гифка, Длиннопост

Во внутрь я ещё накидал шоколадных конфет и получилась довольно увесистая коробочка. Жене очень понравилось, это был необычный и прикольный подарок)

Коробка мистера Мисикса Рик и Морти, Коробка, Подарки, Гифка, Длиннопост
Показать полностью 7
Отличная работа, все прочитано!