Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Обработка крупных отчетов с точки зрения оптимизации - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Обработка крупных отчетов с точки зрения оптимизации (Макросы/Sub)
Обработка крупных отчетов с точки зрения оптимизации
messir Дата: Понедельник, 14.10.2019, 15:23 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Всем доброго времени суток!

Хотел бы с вами проконсультироваться, как правильней поступить при написании кода VBA, который преобразует данные в таблице с большим кол-вом строк (100К+).
В данный момент таблица обрабатывается вручную путем замены, применения различных формул Excel и т.д. Сами данные выгружаются в .csv и многие поля некорректно отображаются.
Главной проблемой является формула массива =МОДА.НСК с несколькими условиями, которая при протягивании по всей таблице отправляет комп в астрал на 60-90 минут.
Из-за чего появилась необходимость более быстрой обработки таблицы в нужный вид для дальнейшего использования в сводной таблице.

Изменения с помощью формул в Excel:
1) Замена по столбцу даты с заменой символа "/" на "." (необходимо для дальнейшей фильтрации пользователем по дате)
2) Создание в новом столбце расчета дня недели от даты. Формула:
Код
=ТЕКСТ(B:B; "ДДДД")

3) Создание в новом столбце определения названия ряда из колонки места. Формула:
Код
=ЕСЛИ(ИЛИ(E:E="A";E:E="B");"AA1";ЕСЛИ(ИЛИ(E:E="C";E:E="D";E:E="E");"AA2";...
. и так далее перебор для более чем 20 наименований мест и определения для них более 15 названий рядов.
4) Определение наиболее часто встречающихся значений в поле "Время отправления" с критериями совпадения по "Номер Маршрута", "День Недели" и "Маршрут". Тут как раз и была формула массива {
Код
=МОДА.НСК(ЕСЛИ(($C:$C=C2)*($A:$A=A2)*($G:$G=G2);$D:$D))
}
5) Определение временного интервала на основании данных, полученных в 4 пункте. Формула:
Код
=ЕСЛИ(H:H<0.875;ЕСЛИ(H:H<0.75;...
[аналогичные условия]..."18:00 - 20:59");"21:00 - 23:59")

Так как знания VBA довольно скудны, я начал реализовывать каждую задачу по отдельности: сначала нашел функцию замены символа путем выделения столбца и использования Replace. Далее по тому же принципу начал заменять по очереди названия ряда на основании поля "Место" и уже на данном этапе скрипт при проверке задумывается секунд на 10-20. Тут я и задумался, что так как мне все равно придется перебирать все строки таблицы для определения наиболее часто встречающихся значений, то может быть имеет смысл вносить все правки в процессе обработки каждой строки?
С этой мыслью я и зашел в тупик, так как не знаю, что будет с точки зрения оптимизации корректней, с учетом того, что данные для наиболее часто встречающихся значений я получу лишь в конце проверки всей таблицы. Поэтому и прошу совета: лучше сначала подготовить таблицу по каждому столбцу, а после производить пересчет построчно, или же сразу заполнять таблицу по мере прохождения скрипта по каждой из строк?

P.S. Ребят, честно хотел объяснить как можно понятней. Сори, если перемудрил.
Пример куска выгрузки прикрепляю.
К сообщению приложен файл: 5502743.xlsx (11.5 Kb)


Сообщение отредактировал Pelena - Среда, 16.10.2019, 07:42
 
Ответить
СообщениеВсем доброго времени суток!

Хотел бы с вами проконсультироваться, как правильней поступить при написании кода VBA, который преобразует данные в таблице с большим кол-вом строк (100К+).
В данный момент таблица обрабатывается вручную путем замены, применения различных формул Excel и т.д. Сами данные выгружаются в .csv и многие поля некорректно отображаются.
Главной проблемой является формула массива =МОДА.НСК с несколькими условиями, которая при протягивании по всей таблице отправляет комп в астрал на 60-90 минут.
Из-за чего появилась необходимость более быстрой обработки таблицы в нужный вид для дальнейшего использования в сводной таблице.

Изменения с помощью формул в Excel:
1) Замена по столбцу даты с заменой символа "/" на "." (необходимо для дальнейшей фильтрации пользователем по дате)
2) Создание в новом столбце расчета дня недели от даты. Формула:
Код
=ТЕКСТ(B:B; "ДДДД")

3) Создание в новом столбце определения названия ряда из колонки места. Формула:
Код
=ЕСЛИ(ИЛИ(E:E="A";E:E="B");"AA1";ЕСЛИ(ИЛИ(E:E="C";E:E="D";E:E="E");"AA2";...
. и так далее перебор для более чем 20 наименований мест и определения для них более 15 названий рядов.
4) Определение наиболее часто встречающихся значений в поле "Время отправления" с критериями совпадения по "Номер Маршрута", "День Недели" и "Маршрут". Тут как раз и была формула массива {
Код
=МОДА.НСК(ЕСЛИ(($C:$C=C2)*($A:$A=A2)*($G:$G=G2);$D:$D))
}
5) Определение временного интервала на основании данных, полученных в 4 пункте. Формула:
Код
=ЕСЛИ(H:H<0.875;ЕСЛИ(H:H<0.75;...
[аналогичные условия]..."18:00 - 20:59");"21:00 - 23:59")

Так как знания VBA довольно скудны, я начал реализовывать каждую задачу по отдельности: сначала нашел функцию замены символа путем выделения столбца и использования Replace. Далее по тому же принципу начал заменять по очереди названия ряда на основании поля "Место" и уже на данном этапе скрипт при проверке задумывается секунд на 10-20. Тут я и задумался, что так как мне все равно придется перебирать все строки таблицы для определения наиболее часто встречающихся значений, то может быть имеет смысл вносить все правки в процессе обработки каждой строки?
С этой мыслью я и зашел в тупик, так как не знаю, что будет с точки зрения оптимизации корректней, с учетом того, что данные для наиболее часто встречающихся значений я получу лишь в конце проверки всей таблицы. Поэтому и прошу совета: лучше сначала подготовить таблицу по каждому столбцу, а после производить пересчет построчно, или же сразу заполнять таблицу по мере прохождения скрипта по каждой из строк?

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

Автор - messir
Дата добавления - 14.10.2019 в 15:23
boa Дата: Вторник, 15.10.2019, 13:47 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
Здравствуйте, messir,
что бы не цитировать пишу по пунктам
1)импорт данных из csv лучше дать через OLEDBConnect для правильного отображения данных вам понадобится Schema.ini файл. это все можно загуглить.
2) здесь и далее не используйте ссылки на всю колонку, а лишь на строки с данными
3) я бы написал по другому формулу
Код
=INDEX({"AA1";"AA1";"AA2";"AA2";"AA2"};MATCH(E2;{"A";"B";"C";"D";"E"};0))

4) здесь таже ошибка (п.2) не ссылайтесь на всю колонку! и если бы вы приложили пример с расчетами, то было бы понятней
5) можно сделать проще через Лукап
Код
=VLOOKUP(K4;$J$11:$K$18;2;1)


примеры во вложении
К сообщению приложен файл: 5948445.xlsx (20.2 Kb)


 
Ответить
СообщениеЗдравствуйте, messir,
что бы не цитировать пишу по пунктам
1)импорт данных из csv лучше дать через OLEDBConnect для правильного отображения данных вам понадобится Schema.ini файл. это все можно загуглить.
2) здесь и далее не используйте ссылки на всю колонку, а лишь на строки с данными
3) я бы написал по другому формулу
Код
=INDEX({"AA1";"AA1";"AA2";"AA2";"AA2"};MATCH(E2;{"A";"B";"C";"D";"E"};0))

4) здесь таже ошибка (п.2) не ссылайтесь на всю колонку! и если бы вы приложили пример с расчетами, то было бы понятней
5) можно сделать проще через Лукап
Код
=VLOOKUP(K4;$J$11:$K$18;2;1)


примеры во вложении

Автор - boa
Дата добавления - 15.10.2019 в 13:47
messir Дата: Вторник, 15.10.2019, 16:39 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Приветствую, boa!

Спасибо, что откликнулись.
Как я и предполагал - слишком сильно намудрил с описанием задачи.
1) Бегло почитав не совсем понял, как преобразовывать уже загруженные данные, но почитаю позже внимательней. Спасибо за инфу. В принципе проблему конвертации данных удалось решить путем
[vba]
Код

Columns(cTo).Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
OtherChar:="/", FieldInfo:=Array(0, 4), TrailingMinusNumbers:=True
[/vba]
2) Это была вынужденная мера, так как на момент создания формул была задача "унифицировать" их для любых ячеек определенного столбца вне зависимости от того, в какую строку формулу вставят.
С этим пунктом я бился сегодня весь день. Все тщетно :( Не прибегая к построчному перебору, получить день недели (именно значение, а не дату в формате ДДДД!) мне не удалось, поэтому пришлось применить в VBA код установки формулы Excel и применить ее ко всем строкам:
[vba]
Код

Cells(2, cTo).Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1], ""ДДДД"")"
Selection.AutoFill Destination:=Range("C2:C" & Cells(Rows.Count, 1).End(xlUp).Row)
[/vba]
3) С формулами все понятно, но ищу решение для VBA. Чтобы можно было задать соответствие, что место "A" или "B" будут в новой колонке "Ряд" обозначаться как "АА1". Предполагаю, что нужно создавать массив, и обрабатывать его при построчном пересчете?
4) Вот тут как раз и надо ссылаться на всю колонку. Дело в том, что в таблице отображается фактическое время отправления маршрутки. По расписанию оно, к примеру, в 2:55 (и чаще всего оно таким и будет), но бывает, что отправление состоялось с задержкой или же раньше срока. Причем сравнивать надо на уровне "номер маршрута" вкупе с "маршрут" и в купе с "День недели", так как номера маршрутов могут быть иногда одинаковыми на разных маршрутах, а время по расписанию может отличаться по дням недели. В итоге конечный результат должен получиться как часто упоминающееся значения для каждого номера маршрута & дня недели & маршрута. Вот тут я не знаю как решить задачу в рамках VBA: пока в голове пытаюсь придумать как реализовать создание переменных, имя которых будет равным содержанию ячеек "номер маршрута", "день недели", "маршрут" а так же "Время отправления". Значением переменной будет счетчик кол-ва полного совпадения условий. По окончании строк запускается новый построчный алгоритм, который будет выставлять наиболее популярное по критериям значения для каждого совпадения.
Но мне кажется есть возможность намного проще реализовать этот процесс.
5) Опять же решение нужно в рамках VBA. По идее функцию ВПР и надо описать, только внутри кода VBA.
 
Ответить
СообщениеПриветствую, boa!

Спасибо, что откликнулись.
Как я и предполагал - слишком сильно намудрил с описанием задачи.
1) Бегло почитав не совсем понял, как преобразовывать уже загруженные данные, но почитаю позже внимательней. Спасибо за инфу. В принципе проблему конвертации данных удалось решить путем
[vba]
Код

Columns(cTo).Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
OtherChar:="/", FieldInfo:=Array(0, 4), TrailingMinusNumbers:=True
[/vba]
2) Это была вынужденная мера, так как на момент создания формул была задача "унифицировать" их для любых ячеек определенного столбца вне зависимости от того, в какую строку формулу вставят.
С этим пунктом я бился сегодня весь день. Все тщетно :( Не прибегая к построчному перебору, получить день недели (именно значение, а не дату в формате ДДДД!) мне не удалось, поэтому пришлось применить в VBA код установки формулы Excel и применить ее ко всем строкам:
[vba]
Код

Cells(2, cTo).Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1], ""ДДДД"")"
Selection.AutoFill Destination:=Range("C2:C" & Cells(Rows.Count, 1).End(xlUp).Row)
[/vba]
3) С формулами все понятно, но ищу решение для VBA. Чтобы можно было задать соответствие, что место "A" или "B" будут в новой колонке "Ряд" обозначаться как "АА1". Предполагаю, что нужно создавать массив, и обрабатывать его при построчном пересчете?
4) Вот тут как раз и надо ссылаться на всю колонку. Дело в том, что в таблице отображается фактическое время отправления маршрутки. По расписанию оно, к примеру, в 2:55 (и чаще всего оно таким и будет), но бывает, что отправление состоялось с задержкой или же раньше срока. Причем сравнивать надо на уровне "номер маршрута" вкупе с "маршрут" и в купе с "День недели", так как номера маршрутов могут быть иногда одинаковыми на разных маршрутах, а время по расписанию может отличаться по дням недели. В итоге конечный результат должен получиться как часто упоминающееся значения для каждого номера маршрута & дня недели & маршрута. Вот тут я не знаю как решить задачу в рамках VBA: пока в голове пытаюсь придумать как реализовать создание переменных, имя которых будет равным содержанию ячеек "номер маршрута", "день недели", "маршрут" а так же "Время отправления". Значением переменной будет счетчик кол-ва полного совпадения условий. По окончании строк запускается новый построчный алгоритм, который будет выставлять наиболее популярное по критериям значения для каждого совпадения.
Но мне кажется есть возможность намного проще реализовать этот процесс.
5) Опять же решение нужно в рамках VBA. По идее функцию ВПР и надо описать, только внутри кода VBA.

Автор - messir
Дата добавления - 15.10.2019 в 16:39
boa Дата: Вторник, 15.10.2019, 18:13 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
messir,
переходите на координаты листа R1C1 и формулы будут "унифицированные"
например: что бы получить номер дня недели достаточно в любой строке написать формулу
Код
=WEEKDAY(DATEVALUE(RC2);1)

а для ряда, если желаете, можно пользовательскую функцию использовать
[vba]
Код
Function РЯД_$(rng As Range)
Dim Arr1(), Arr2(), i&
Arr1 = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "G", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V")
Arr2 = Array("AA1", "AA1", "AA2", "AA2", "AA3", "AA3", "AA3", "AA3", "AA3", "AA4", "AA4", "AA4", "AA4", "AA4", "AA4", "AA4", "AA5", "AA5", "AA5", "AA5", "AA5", "AA5")

  For i = LBound(Arr1) To UBound(Arr1)
    If Arr1(i) = rng.Value Then РЯД_ = Arr2(i): Exit For
  Next i
End Function
[/vba]
хотя можно и лукапом и индексом реализовать

а последнюю ячейку на странице можно задать формулой через менеджер имен
Код
=INDEX(C1;COUNTA(C1))


Как я и предполагал - слишком сильно намудрил с описанием задачи.

если бы вы приложили пример с расчетами, то было бы понятней


вариантов множество.
К сообщению приложен файл: 5502743.xlsb (24.6 Kb)


 
Ответить
Сообщениеmessir,
переходите на координаты листа R1C1 и формулы будут "унифицированные"
например: что бы получить номер дня недели достаточно в любой строке написать формулу
Код
=WEEKDAY(DATEVALUE(RC2);1)

а для ряда, если желаете, можно пользовательскую функцию использовать
[vba]
Код
Function РЯД_$(rng As Range)
Dim Arr1(), Arr2(), i&
Arr1 = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "G", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V")
Arr2 = Array("AA1", "AA1", "AA2", "AA2", "AA3", "AA3", "AA3", "AA3", "AA3", "AA4", "AA4", "AA4", "AA4", "AA4", "AA4", "AA4", "AA5", "AA5", "AA5", "AA5", "AA5", "AA5")

  For i = LBound(Arr1) To UBound(Arr1)
    If Arr1(i) = rng.Value Then РЯД_ = Arr2(i): Exit For
  Next i
End Function
[/vba]
хотя можно и лукапом и индексом реализовать

а последнюю ячейку на странице можно задать формулой через менеджер имен
Код
=INDEX(C1;COUNTA(C1))


Как я и предполагал - слишком сильно намудрил с описанием задачи.

если бы вы приложили пример с расчетами, то было бы понятней


вариантов множество.

Автор - boa
Дата добавления - 15.10.2019 в 18:13
messir Дата: Вторник, 15.10.2019, 23:13 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
boa,
Да эта "унификация" не для меня) Пользователи, которые будут использовать этот макрос из серии "кто в лес, кто по дрова": у каждого может быть своя версия Excel со своими надстройками или их отсутствием. Да чего далеко ходить. Даже выгружаемая таблица с данными может быть у каждого по своему отображена в рамках расположения и кол-во столбцов. Именно поэтому написания макроса я начал с того, что он удаляет из файла все листы, кроме основного и листа, куда пользователь копирует данные из выгрузки. Далее создает новый лист и копирует туда только нужные столбцы и только после этого начинает эти данные преобразовывать.

За функцию ряда респект и уважуха! Скопипазжу себе на заметку)))

Теперь нужно придумать как реализовать расчет часто встречающихся значений времени)
Сегодня я уже пробовал реализовать задумку с указанием в новом столбце по сути склееные воедино данные ячеек. Получилось что-то вроде "114685вторникМРЧ-ЛЛА" для каждой строки. Дальше я пришел в тупик, так как не знаю, как рассчитать сколько у меня в таблице разновидностей отклонений по времени отправления, чтобы потом выявить эталонное (чаще встречающееся).
Далее еще подумалось, что можно было бы создавать многомерный массив, в который бы заносились данные по принципу добавления нового значения массива при не совпадении данных, но потом понял, что сравнивать при переборе вообще непонятно реализовать - отложил эту мысль.

Зато вспомнились слова учительницы по русскому: Плохо когда не знаешь, да еще и забудешь (С)
 
Ответить
Сообщениеboa,
Да эта "унификация" не для меня) Пользователи, которые будут использовать этот макрос из серии "кто в лес, кто по дрова": у каждого может быть своя версия Excel со своими надстройками или их отсутствием. Да чего далеко ходить. Даже выгружаемая таблица с данными может быть у каждого по своему отображена в рамках расположения и кол-во столбцов. Именно поэтому написания макроса я начал с того, что он удаляет из файла все листы, кроме основного и листа, куда пользователь копирует данные из выгрузки. Далее создает новый лист и копирует туда только нужные столбцы и только после этого начинает эти данные преобразовывать.

За функцию ряда респект и уважуха! Скопипазжу себе на заметку)))

Теперь нужно придумать как реализовать расчет часто встречающихся значений времени)
Сегодня я уже пробовал реализовать задумку с указанием в новом столбце по сути склееные воедино данные ячеек. Получилось что-то вроде "114685вторникМРЧ-ЛЛА" для каждой строки. Дальше я пришел в тупик, так как не знаю, как рассчитать сколько у меня в таблице разновидностей отклонений по времени отправления, чтобы потом выявить эталонное (чаще встречающееся).
Далее еще подумалось, что можно было бы создавать многомерный массив, в который бы заносились данные по принципу добавления нового значения массива при не совпадении данных, но потом понял, что сравнивать при переборе вообще непонятно реализовать - отложил эту мысль.

Зато вспомнились слова учительницы по русскому: Плохо когда не знаешь, да еще и забудешь (С)

Автор - messir
Дата добавления - 15.10.2019 в 23:13
boa Дата: Среда, 16.10.2019, 00:56 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
messir,
Даже в математике одну и туже теорему можно по разному доказывать
а вы хотите, что бы ваши Идеи были поняты "на слух"
покажите, что вы там считаете... на примере


 
Ответить
Сообщениеmessir,
Даже в математике одну и туже теорему можно по разному доказывать
а вы хотите, что бы ваши Идеи были поняты "на слух"
покажите, что вы там считаете... на примере

Автор - boa
Дата добавления - 16.10.2019 в 00:56
messir Дата: Среда, 16.10.2019, 10:03 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
boa,
Собрал пример таблички с формулами Excel, которые применяются пользователями в данный момент. Оставил строки только по одному коду места, чтобы не раздувать данные в примере таблицы.
И даже сделал сводную, для примера.
Надеюсь так будет понятней :)
К сообщению приложен файл: 6598575.xlsx (35.0 Kb)
 
Ответить
Сообщениеboa,
Собрал пример таблички с формулами Excel, которые применяются пользователями в данный момент. Оставил строки только по одному коду места, чтобы не раздувать данные в примере таблицы.
И даже сделал сводную, для примера.
Надеюсь так будет понятней :)

Автор - messir
Дата добавления - 16.10.2019 в 10:03
boa Дата: Среда, 16.10.2019, 17:48 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
messir,
День недели
Код
=INDEX({"Пн";"Вт";"Ср";"Чт";"Пт";"Сб";"Вс"};WEEKDAY(($B2);2))

Время по расписанию
Код
{=MODE(IF(($C2:INDEX($C:$C;COUNTA($C:$C))=C2)*($A2:INDEX($A:$A;COUNTA($A:$A))=A2)*($D2:INDEX($D:$D;COUNTA($D:$D))=D2);$E2:INDEX($E:$E;COUNTA($E:$E))))}
Хотя это основной "тормоз" в ваших расчетах. Подумайте, может чем-то заменить эту формулу...

Интервал времени
Код
=INDEX({"00:00 - 02:59";"03:00 - 05:59";"06:00 - 08:59";"09:00 - 11:59";"12:00 - 14:59";"15:00 - 17:59";"18:00 - 20:59";"21:00 - 23:59"};ROUNDUP(F2*8;0))

РЯД
Код
=IFERROR(INDEX({"AA1";"AA1";"AA2";"AA2";"AA2";"AB1";"AC1";"AC2";"AC2";"BA5";"CA1";"CA2";"CA2";"CA2";"CA7";"CA3";"CA3";"CA3";"BA2";"CA4";"CA4";"CA4";"CA5";"CA6";"BA3";"BA4"};
MATCH($H2;{"A";"B";"C";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";"P";"Q";"R";"S";"T";"U";"V";"W";"X";"Y";"Z"};0));"ERROR")
Здесь обнаружил ошибку в вашей формуле(наверное): вместо X стояла S
К сообщению приложен файл: 6598575-2.xlsx (59.5 Kb)




Сообщение отредактировал boa - Среда, 16.10.2019, 17:49
 
Ответить
Сообщение messir,
День недели
Код
=INDEX({"Пн";"Вт";"Ср";"Чт";"Пт";"Сб";"Вс"};WEEKDAY(($B2);2))

Время по расписанию
Код
{=MODE(IF(($C2:INDEX($C:$C;COUNTA($C:$C))=C2)*($A2:INDEX($A:$A;COUNTA($A:$A))=A2)*($D2:INDEX($D:$D;COUNTA($D:$D))=D2);$E2:INDEX($E:$E;COUNTA($E:$E))))}
Хотя это основной "тормоз" в ваших расчетах. Подумайте, может чем-то заменить эту формулу...

Интервал времени
Код
=INDEX({"00:00 - 02:59";"03:00 - 05:59";"06:00 - 08:59";"09:00 - 11:59";"12:00 - 14:59";"15:00 - 17:59";"18:00 - 20:59";"21:00 - 23:59"};ROUNDUP(F2*8;0))

РЯД
Код
=IFERROR(INDEX({"AA1";"AA1";"AA2";"AA2";"AA2";"AB1";"AC1";"AC2";"AC2";"BA5";"CA1";"CA2";"CA2";"CA2";"CA7";"CA3";"CA3";"CA3";"BA2";"CA4";"CA4";"CA4";"CA5";"CA6";"BA3";"BA4"};
MATCH($H2;{"A";"B";"C";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";"P";"Q";"R";"S";"T";"U";"V";"W";"X";"Y";"Z"};0));"ERROR")
Здесь обнаружил ошибку в вашей формуле(наверное): вместо X стояла S

Автор - boa
Дата добавления - 16.10.2019 в 17:48
messir Дата: Среда, 16.10.2019, 23:28 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Хотя это основной "тормоз" в ваших расчетах. Подумайте, может чем-то заменить эту формулу...

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

Я поэтому и пытаюсь всё это реализовать с помощью VBA, описав эту формулу иным способом, который так и не могу найти.

Автор - messir
Дата добавления - 16.10.2019 в 23:28
messir Дата: Четверг, 17.10.2019, 11:04 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Интервал времени

Код
=ИНДЕКС({"00:00 - 02:59";"03:00 - 05:59";"06:00 - 08:59";"09:00 - 11:59";"12:00 - 14:59";"15:00 - 17:59";"18:00 - 20:59";"21:00 - 23:59"};ОКРУГЛВВЕРХ(F2*8;0))

Тут кстати проблема. Если время отправления, например 9:00, то такая запись попадет в интервал 06:00 - 08:59 по этой формуле
 
Ответить
Сообщение
Интервал времени

Код
=ИНДЕКС({"00:00 - 02:59";"03:00 - 05:59";"06:00 - 08:59";"09:00 - 11:59";"12:00 - 14:59";"15:00 - 17:59";"18:00 - 20:59";"21:00 - 23:59"};ОКРУГЛВВЕРХ(F2*8;0))

Тут кстати проблема. Если время отправления, например 9:00, то такая запись попадет в интервал 06:00 - 08:59 по этой формуле

Автор - messir
Дата добавления - 17.10.2019 в 11:04
boa Дата: Четверг, 17.10.2019, 11:55 | Сообщение № 11
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
Прибавьте 1 минуту к F2, т.е. F2+1/24/60, а потом умножьте на 8




Сообщение отредактировал boa - Четверг, 17.10.2019, 11:56
 
Ответить
СообщениеПрибавьте 1 минуту к F2, т.е. F2+1/24/60, а потом умножьте на 8

Автор - boa
Дата добавления - 17.10.2019 в 11:55
messir Дата: Четверг, 17.10.2019, 12:34 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Прибавьте 1 минуту к F2, т.е. F2+1/24/60, а потом умножьте на 8

тогда 23:59 становится 0:00 и определяется в 0:00 - 2:59 :)))
Ну в целом я понял принцип. Интересная механика с перемножением)) я даже не подумал в эту сторону))

Кстати такой метод подстановки по индексу в VBA чем реализуется? А то гугл на запрос "VBA аналог =ИНДЕКС" ничего толкового не выдает :(
 
Ответить
Сообщение
Прибавьте 1 минуту к F2, т.е. F2+1/24/60, а потом умножьте на 8

тогда 23:59 становится 0:00 и определяется в 0:00 - 2:59 :)))
Ну в целом я понял принцип. Интересная механика с перемножением)) я даже не подумал в эту сторону))

Кстати такой метод подстановки по индексу в VBA чем реализуется? А то гугл на запрос "VBA аналог =ИНДЕКС" ничего толкового не выдает :(

Автор - messir
Дата добавления - 17.10.2019 в 12:34
boa Дата: Четверг, 17.10.2019, 15:02 | Сообщение № 13
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
Интересная механика с перемножением
все просто:
1 день = 24 часа = 1, 1 час =1/24, 1 мин =1/24/60
вы делите сутки на 8 равных частей(по 3 часа)
соответственно если значение времени умножить на 8 и округлить в большую сторону до целого, мы получим номер части в которой данный промежуток находится.
подобие функции Индекс на VBA я вам приводил в 4-м сообщении




Сообщение отредактировал boa - Четверг, 17.10.2019, 16:23
 
Ответить
Сообщение
Интересная механика с перемножением
все просто:
1 день = 24 часа = 1, 1 час =1/24, 1 мин =1/24/60
вы делите сутки на 8 равных частей(по 3 часа)
соответственно если значение времени умножить на 8 и округлить в большую сторону до целого, мы получим номер части в которой данный промежуток находится.
подобие функции Индекс на VBA я вам приводил в 4-м сообщении

Автор - boa
Дата добавления - 17.10.2019 в 15:02
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Обработка крупных отчетов с точки зрения оптимизации (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!