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

Страницы: 1
Зависает excel при запуске макроса
 
Цитата
написал:
начинает крутиться синий кружок и excel зависает
Комп на работе? В макросе используется Copy/Paste через буфер обмена?Возможно системщики установили ПО для контроля данных, в том числе - передаваемых через буфер обмена. Отключить скорее всего не выйдет, поскольку это последнее требование законодательства. Так что поосто ждать (там обычно не больше пары минут), либо уходить от использования буфера обмена в макросе.
vba Как обратится к листу, чье имя - это значение ячейки?
 
Set wsh=ActiveWorkbook.sheets("4")
если эта 4 в ячейке B5, то
Set wsh=ActiveWorkbook.sheets(""&ActiveWorkbook.sheets(1).Range("B5").value & "")
Изменено: Punkt5 - 03.04.2025 12:38:28
VBA Exel Комбинации, Перебор возможных уникальных комбинаций.
 
Цитата
написал:
Проверка будет проводиться по мере заполнения строк и по ходу уже будет видно какое количество строк максимум смогу осилить таким способом,
Ну, можно оценить заранее. Выборка k строк из n даёт число сочетаний S(k)= n! / ((n-k)! * k! ).
Соответственно чтобы оценить выборку всех вариантов из N строк от 1 до N строк - надо просуммировать все S(k) для k=1...n
При n = 50 - S(50) = 10^15 сочетаний
S(100) ~ 10^30 сочетаний.
При скорости расчёта ~10^8 сочетаний в секунду (допустим) - за сутки посчитаются ~10^13 комбинаций. Значит для расчёта потребуется 10^17 суток. Сколько это тысячелетий оцените сами.
Как ускорить миллионы вычислений, ~20млн. ячеек с переменными сильно тормозят
 
Ну, смотрите: если вы один заполняете эту сотню исходных данных на одном листе, сохраняя предыдущее состояние в другом файле, сами перед собой отвечая за верность ввода и сами контролируете результат, без необходимости контроля на этапе ввода, то можно-таки использовать для ввода Excel, делать расчёт с помощью  макроса на VBA, встроенном в Excel и желательно результат расчета сохранять в другом файле (но можно и в данном, главное не попортить исходный чистый шаблон). При работе с макросом гланое учитывать, что Excel написан для работы с массивами, так что даже чтение из одной ячейки - это чтение массива размером 1×1. Поэтому время, которое занимает чтение данных из одной ячейки или из миллиона одним махом - мало отличаются. А вот если начать перебирать ячейки и пересчитывать значение в каждой модно успеть пообедать, а иногда и поужинать, пока результат отобразится на экране. То же верно и для записи: запись в одну ячейку и в прямоуголник млн.×тыс. занимает доли секунды. А если перебирать и записывать каждую ячейку из набора - время такого цикла существенно увеличивается.
теперь: любые математические действия с массивами в памяти делаются очень быстро, в отличие от пересчета формул, введенных в каждую из миллиона ячеек. Так что рекомендовал бы:
1.  Создать файл шаблон для заплонения исходных данных. Сохранить.
2. Заполнить начальным набором данных.
3. Начать писать макрос с чтения всего набора разом в массив.
4. В процессе обработки можно создавать другие массивы для последующего вывода на лист и заполнять их рассчитанными данными, не используя формулы из Application, а используя математику самого Visual Basic - это в разы быстрее.
затем вывести полученные массивы на лист/листы результата.
5. Может быть сразу в макросе и сохранять полученный файл под другими именами, чтобы не портить шаблон.
Но, если в заполнении исходных данных заняты несколько человек, то желательно в процессе ввода сохранять: кто какие данные в какой момент ввёл , чтобы в последующем можно было разгребать ответственность за ошибки. Если возможен одновременный ввод разными операционистами под разные модели - тут никуда не деться от ведения базы данных, с учетом и операциониста и модели и даты -времени ввода. Написать ещё подпрограммы контроля для каждого вида данных, чтоб уж явную ересь не вносили. И потом формировать отчеты хоть в тот же Excel-файл на основании введенных и проверенных данных.
Как ускорить миллионы вычислений, ~20млн. ячеек с переменными сильно тормозят
 
Цитата
написал:
Столько данных лучше выгружать в отдельный  файл и считывать их от туда когда требуется
Ну, если требуется практически при каждом открытии файла, то разницы между хранением ЗНАЧЕНИЙ в Excel-файле или во внешнем файле, каждый раз считывая их в открывшийся пустой Excel-файл я лично не вижу. Другое дело, что взваливать на Excel задачу ведения базы данных, вместо создания нормальной базы данных на движке, который уже предназначен для этого - то же самое, что увеличивать число лошадей, запряженных во все более тяжелеющую и не тянущую телегу, вместо использования грузовика.
Объяснить каждую строку кода макроса удаления пустых строк, Помогите разобраться в коде
 
Код
Sub adv_PEOPLE(opnSH) 'параметр opnSH = объект обрабатываемого листа книги Excel
        
   opnSH.Cells.ClearOutline 'на листе очищаются все видимые линии, обрамляющие все ячейки
   
   opnSH.Rows("1:6").Delete 'удаляются верхние 6 строк
   opnSH.Columns(1).Delete 'удаляется первая колонка
   
   ix = 1 ' счётчик текущих строк устанавливаем в 1
   NullRowCount = 0 ' счётчик пустых строк, идущих подряд устанавливаем в 0
   While NullRowCount < 7 'цикл до тех пор, пока счётчик пустых строк < 7
       nnlc = 0 ' счётчик НЕпустых ячеек в строке. Ставим пока в 0
       For iCol = 1 To 15 ' перебираем первые 15 ячеек в строке
           If opnSH.Cells(ix, iCol) <> "" Then nnlc = nnlc + 1 'если значение ячейки не пустая строка, то увеличиваем счётчик непустых ячеек
       Next
       If nnlc = 0 Then ' если в переборе 15-ти ячеек строки ix не нашлось ни одной заполненной
           opnSH.Rows(spltnRows(ix, ix)).Delete 'удаляем строку ix
           NullRowCount = NullRowCount + 1  ' и увеличиваем счётчик найденных нулевых строк
       Else                   ' если же хоть одна ячейка строки ix заполнена, то ..
           NullRowCount = 0    ' Обнуляем счётчик пустых строк, идущих подряд
           ix = ix + 1         ' переходим к следующей строке
       End If
   Wend ' заканчиваем цикл по строкам, если встретили подряд 7 пустых строк
   
   opnSH.Rows("1:1").Insert Shift:=xlDown 'добавляем строку перед первой
   rgvset opnSH, "A", 1, "ФИО"                        'записываем в неё заголовки столбцов
   rgvset opnSH, "B", 1, "Должность"
   rgvset opnSH, "C", 1, "Департамент / Дирекция"
   rgvset opnSH, "D", 1, "Подразделение"
   rgvset opnSH, "E", 1, "Струртурная единица"
   rgvset opnSH, "F", 1, "Вид трудоустройства"
   
   opnSH.Columns("F:F").Insert Shift:=xlToRight ' вставляем столбец перед "F"
   opnSH.Columns("F:F").Insert Shift:=xlToRight ' и ещё раз вставляем столбец перед "F"
   ixend = GetLastRow(opnSH) 'определяем номер последней строки на листе
   For ix = 1 To ixend 'перебираем все оставшиеся строки. Для каждой строки...
       rgvset opnSH, "F", ix, rgv(opnSH, "B", ix) '.. копируем значение из ячейки "B" в ячейку "F" на той же строке
       rgvset opnSH, "G", ix, rgv(opnSH, "A", ix) '.. копируем значение из ячейки "A" в ячейку "G" на той же строке
   Next
   opnSH.Columns("A:A").Delete 'Удаляем колонку A
   opnSH.Columns("A:A").Delete 'Снова удаляем колонку A (бывш "B")
        
End Sub

P.S. В коде используются сторонние функции:
GetLastRow() - получение номера последней заполненной строки листа
rgv() - получение значения ячейки на пересечении указанных строки и колонки листа
rgvset() - присвоение значения ячейки на пересечении указанных строки и колонки листа

Код реально бредовый и при большом объёме данных медленно работающий. Править его неохота: наверняка ваша задача слегка отличается от задачи под которую писался данный неоптимальный код, и проще написать новый, чем править этот.
Изменено: Punkt5 - 20.11.2024 13:54:02
Преобразовать некорректные даты с помощью макроса, Нужно преобразовать некорректные даты в виде 5-значных чисел в корректные даты
 
Цитата
Есть ли алгоритм, чтобы корректно преобразовать 5-ое число в дату
Есть. Просто выделить столбец и выбрать формат ячеек: дата.

Для понимания: дата в Excel  хранится в ячейке в виде 5-значного числа, равного числу дней, прошедших с 31.12.1899 по нужную дату. Если поменять формат ячеек у дат на числовой - получим 5-значные числа. И наоборот:  Если поменять формат ячейки, содержащей 5-значное число, получим дату.
Так что у вас просто формат потерялся при передаче данных.
Изменено: Punkt5 - 20.08.2024 14:07:18
Замена в макросе обычной формулы на формулу массива
 
Цитата
написал:
Подскажите, пожалуйста, как мне поправить макрос, чтоб сразу вставлял данную формулу как формулу массива?
Дело в том, что в Excel у Range есть только .FormulaLocal и FormulaR1C1Local, а FormulaArrayLocal отсутствует - есть только FormulaArray.
Можно попробовать схитрить: записать формулу с русскими именами функций в ОДНУ ячейку в свойство FormulaLocal. А затем записать в Range(..).FormulaArray свойство Formula из данной ячейки, доверив преобразование из Local в английские функции самому Excel.
Типа:
Код
Range("D5").FormulaLocal = "=ИНДЕКС(Ф4!$D$425:$AE$457; ПОИСКПОЗ($D11;Ф4!$A$425:$A$475;0);ПОИСКПОЗ('Справочник ГТП'!$F$7&H$9;Ф4!$D$422:$AE$422&Ф4!$D$423:$AE$423; 0))"
Range("D5:D255").FormulaArray = Range("D5").Formula
Изменено: Punkt5 - 29.07.2024 20:40:08
При перемещении/копировании строк через VBA меняются правила условного форматирования
 
Цитата
написал:
Никто не знает?
При удалении/вставке строк Excel автоматически меняет формулы с учётом изменений. Соответственно, если есть желание, чтобы формулы в УФ не менялись, надо бросить вставлять/удалять строки, и начать читать значения/формулы в массив, обрабатывать массив и потом сливать его на лист.
Защита файла от изменений и пересохранений, Защита файла от изменений и пересохранений
 
Навскидку, самое простое - сохранить в виде шаблона .xltx.
После открытия и внесения изменений он предлагает сохранять его как новый файл Excel, а даже если посредством манипуляций попытаться поменять на сохранение в тот же файл шаблона в формате шаблона - Excel не даст этого сделать.
Изменено: Punkt5 - 24.05.2024 15:49:35
Ломанная сортировка месяцев на графике, настройка Excel
 
Иван, наиболее вероятная причина такого поведения - при открытии файла, названия месяцев не распознаются, как месяцы и значит Excel автоматически преобразует их в текст - что и отражается в такой сортировке по алфавиту, вместо сортировки по датам.
Он очень много чего делает автоматически.
Возможные варианты - из-за чего это и где искать:

1. В настройке локали ОС по умолчанию. Если в параметрах винды стоит по умолчанию другая страна - понятно, что в этом случае название месяца по-русски = ПРОСТО СТРОКА.

Наиболее вероятен именно этот пункт. Но, если не поможет - можно поискать различия и


2. В параметрах Excel. - Язык Редатирования и Язык Интерфейса - какие стоят приоритетными по умолчанию? Сравните с вашими настройками.
3. В параметрах Excel. - Правила поиска ошибок. И тут придётся пройтись по каждому пункту с проверкой - поскольку именно они и преобразуют неверные по формату данные (по мнению Excel) в якобы "верные".
Страницы: 1
Наверх