Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
VBA: обработка 900 строк занимает более 1,5 минут
 
Цитата
БМВ написал:
При таких объёмах это не столь влияет сколько пересчет, который запускается при каждом присвоении значения
Я говорил про идентификацию строчек / блока кода, на котором происходят наибольшие временные потери. Это строчки кода, где происходит обращение к ячейке на листе и запись в нее. А уже почему и как исправить - это уже вопрос

Ок - возможно формулировка в моем посте была не совсем точная, поправлю
VBA: обработка 900 строк занимает более 1,5 минут
 
Добавлю также свои 5 копеек: в этом макросе скорее всего наибольшие потери времени происходят в момент записи значения в ячейку (а это, в свою очередь, скорее всего происходит из-за пересчета формул на листе), но в другом случае - можно не так быстро понять.

Поэтому, чтобы сузить проблемную область - можно померять время исполнения каждой из операций (например, выводя информацию в immediate window)

в блоке объявления переменных

Код
Dim TimeMacro: TimeMacro = Timer

После каждого блока кода, который хотите померять

Код
Debug.print Format(Timer-TimeMacro, "0.00")
TimeMacro = Timer

Тогда вы сможете конкретнее искать информацию/спрашивать - например, как ускорить выполнение этих строчек кода
Изменено: Yaroslav_T - 22.03.2018 10:41:54
Группировка большого кол-ва разных данных по столбцам.
 
Возможно поможет не тот конвертер, что используется, а другой - благо в интернете их много
без примеров тяжело понять

PS Также мб имеет смысл попробовать задачу конвертации решать при помощи python https://pdftables.com/blog/pdf-to-excel-with-python  
Рейтинг суммы баллов курсантов
 
Решение через доп. строку в шапке, чтобы вытянуть значение коэффициента.
Возможно найдется решение без использования доп. строки через ФМ, но это будет сложнее
Макрос переноса значения из одной ячейки в другую по сравнению
 
Цитата
vikttur написал:
Красить можно и без массивов.
Написал первым способом, который пришел на ум, согласен - на больших массивах может быть не оптимальным (хотя УФ + фильтр должны по идее шустро работать)
Суммирование значений заданного количества ячеек
 
Так ?
Код
=СУММ(СМЕЩ(E8;0;0;I8))
Копирование + переименование файлов.
 
Макрос нужно запускать при выделенном диапазоне с новыми названиями файлов
На всякий случай - очень хорошая справка по FSO

Код
Sub MultiCopy()

Dim path_from As String: path_from = "С:\Документы\Искомая папка\"
Dim path_to As String: path_to = "С:\Документы\Искомая папка\Карточки\"

Dim fn As String: fn = "Карточка.xlsx"

Dim cell As Range
Dim rng As Range: Set rng = Selection

Set FSO = CreateObject("Scripting.FileSystemObject")

For Each cell In rng
  FSO.CopyFile path_from & fn, path_to & cell.Value & ".xlsx", 0
Next cell

End Sub
Изменено: Yaroslav_T - 20.03.2018 23:00:54
SQL запрос: вывести те отделы, в которых работает более пяти сотрудников
 
Цитата
Logunas написал:
Через MS Query потребуется ведь использование внешних данных из MS Access Database, если я всё правильно понимаю?Дело ведь в том, что таблицы представлены в Excel файле...
Не обязательно - возможно подключение из Excel к обычному Excel файлу
С простыми примерами на VBA
Из массива посчитать формулой дни от максимума до минимума, сбор наподобие сводной таблицы
 
Цитата
Koordinator написал:
хочу избежать лишних обновлений файла, и нажатий на кнопки!

А обновление сводной при открытии файла не подойдет?
SQL запрос: вывести те отделы, в которых работает более пяти сотрудников
 
Такое возможно организовать, в частности, через MS Query
Выбор ТОП значений с повторами
 
[QUOTE]БМВ написал: Это вы к чему?х/QUOTE]
Я предложил решение, в котором каждое значение становится "уникальным".  На 3 пункт ответ - максимум на десятитысячную, что в рамках задачи с прайс-листами скорее всего ни на что не повлияет. Но можно для успокоения совести точно также вытягивать, как и наименование первоначальную стоимость из прайс-листа.

Также можно данную задачу решить и другими способами - пока нет доп. вводных любое из решений может подойти...
* Сводная таблица - перевести таблицу в плоский вид, отфильтровать топ какой нужен
* Скопировать массив, отсортировать его и удалить лишнее
* Если это для загрузки в другой файл, можно задействовать Power Query / MS Query

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

PS Тему предлагаю Выбор ТОП значений с повторами
Изменено: Yaroslav_T - 20.03.2018 23:23:35
добавление строки в листе порарельно с другим листом, макрос наверное
 
Перед вставкой выделите листы с зажатой кнопкой Ctrl (или Shift для некоторого количества подряд). После этого - будут выделены несколько листов и действия на одном листе будут автоматом производится и на других листах
Изменено: YTikhonov - 20.03.2018 20:42:39
Выбор ТОП значений с повторами
 
В соседнем со значениями столбце получить значения, увеличенные на малую величину и осуществлять "вытягивание" по этому значению.

Например, в ячейке d2 написать формулу =C2+СТРОКА(C2)*0,00000000001 и протянуть
Средневзвешенноге по выборке из номеров строк исходной таблицы?
 
Я бы попробовал формулу массива через ДВССЫЛ и СУММПРОИЗВ
Код
=СУММПРОИЗВ(ДВССЫЛ(АДРЕС($E$3:$I$12+1;СТОЛБЕЦ(F28);4;1;$C$1));$E$2:$I$2)/СУММ($E$2:$I$2)

Или СМЕЩ
Код
=СУММПРОИЗВ(СМЕЩ(Тбл!$A1;$E$3:$I$12+1;СТОЛБЕЦ(E28));$E$2:$I$2)/СУММ($E$2:$I$2)

(для ячейки E17)

К сожалению, они показывают ошибку - не могу сейчас вплотную заняться - может кто из коллег на форуме меня поправит...
На один код и один цвет установить такую же цену, как в позиции с характеристикой
 
Решение через формулы массивов. Скорее всего проблема в том, что не все ссылки на диапазоны скорректированы на одинаковое количество ячеек или при вводе нажимаете не Ctrl + Shift + Enter

Разбор формулы по частям
Код
=ИНДЕКС(C:C;
Возврат значения из диапазона C:C (цены) по указанному номеру строки

Код
СУММПРОИЗВ(
Производит суммирование помноженных друг на друга элементов из указанных внутри скобок диапазонов

Код
(ПРАВСИМВ($A$1:$A$29;5)="Karre")
Возвращает 0 для строки, которая не заканчивается на Karre и 1 для нужной строки

Код
*(ЕСЛИОШИБКА(
        ПОИСК(
              ЛЕВСИМВ(A1;НАЙТИ(",";A1)-1)
                      ;$A$1:$A$29);0)
                            =1)*

ЛЕВСИМВ(A1;НАЙТИ(",";A1)-1) определит артикул без цвета - текстовая строка до запятой
ПОИСК(ЛЕВСИМВ(...);$A$1:$A$29) - вернет 1, для строк с отличным от текущей строки артикулом, и цифру в другом случае
ЕСЛИОШИБКА(ПОИСК(...);0) - подменит ошибку на 0
ЕСЛИОШИБКА(...;0)=1 - вернет 1 для строк с совпадающим артикулом, 0 в ином случае

Код
($B$1:$B$29=B1)*
Сравнивает артикул с тем, что указан в текущей строке - по аналогии со частью ПРАВСИМВ вернет 0 для строк с другим артикулом

Код
СТРОКА($A$1:$B$29)))
Самая простая часть - возвращает номер строки
Изменено: YTikhonov - 20.03.2018 17:48:57
Макрос переноса значения из одной ячейки в другую по сравнению
 
Вот макрос на условном форматировании. Можно на массивах, но писать дольше ;-)

PS Но он все равно использует ВПР

Код
Sub Перенос()

Dim rng1 As Range, rng2 As Range

Set rng1 = Range("b1:b5") ' Диапазон, куда вставлять значения
Set rng2 = Range("d1:e5") ' Диапазон, откуда брать значения

'На всякий случай в первом диапазоне выделяем только пустые ячейки
Set rng1 = rng1.SpecialCells(xlCellTypeBlanks)

' Получение табельных номеров в первую таблицу
rng1.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1]," & rng2.Address(1, 1, xlR1C1) & ",2,FALSE),"""")"
rng1.Formula = rng1.Value

' Помечаем дубликаты
With Union(rng1, rng2).Offset(1, 0)
.FormatConditions.Delete
.FormatConditions.AddUniqueValues
.FormatConditions(1).DupeUnique = xlDuplicate
.FormatConditions(1).Font.Color = -16383844
End With

' Фильтруем таблицу по цвету
If ActiveSheet.AutoFilterMode = False Then rng2.AutoFilter
rng2.AutoFilter Field:=2, Criteria1:=RGB(156, 0, 6), Operator:=xlFilterFontColor

' удаляем отфильтрованные значения
rng2.Resize(rng2.Rows.Count, 1).Offset(1, 1).SpecialCells(xlCellTypeVisible).Clear

' убираем автофильтр и условное форматирование
Union(rng1, rng2).Offset(1, 0).FormatConditions.Delete
rng2.AutoFilter

End Sub
Изменено: yaroslav.tikhonov - 20.03.2018 17:25:47
Страницы: 1
Наверх