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

Страницы: 1 2 След.
Пользовательская функция сортировки значений диапазона и вывод массивом
 
Дмитрий(The_Prist) Щербаков, это оно! Спасибо большое!
Sanja, попробую разобраться сам, спасибо!
Пользовательская функция сортировки значений диапазона и вывод массивом
 
Снова доброго всем дня
Благодаря Вашей помощи, функция написал
Вот, что получилось:

Но остался маленький нюанс. Использовать функцию собираюсь как формулу массива. Диапазон с результатом работы функции заведомо больше, чем количество ответов, которые даёт функция. Можно ли как-то сделать так, что бы в тех ячейкам массива ответа, где у функции уже нет результата работы, не выводилось "Н/Д", а выводился заранее заданный в самой функции фиксированный текст? Надеюсь, понятно объяснил )
У меня есть решение, но оно мне не нравится: вместо формулы массива на диапазон, в каждой конкретной ячейке использовать функцию ЕСНД() с вложеной ИНДЕКС() и перебирать по индексам.
Если вложить мою функцию в ЕСНД() и сделать формулой массива, то ожидаемого результата нет
Пользовательская функция сортировки значений диапазона и вывод массивом
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
как заставить UDF функцию листа выполняться для входа в режим отладки
Всё верно! С этим разобрался, спасибо!
Пользовательская функция сортировки значений диапазона и вывод массивом
 
Дмитрий(The_Prist) Щербаков, размышлял так, что i, j и x ни при каких условиях не могут быть больше 25, то мне хватит и byte )
Sanja, всё заработало, но причину я так и не понял
Спасибо всем! Копаю дальше )
Изменено: kenigfinn - 17.10.2025 10:35:32
Пользовательская функция сортировки значений диапазона и вывод массивом
 
Всем спасибо, помогаете продвигаться дальше )

Крайний вариант функции

Изменил тип входных данных на Range и потом передал Range.Value в массив.
Пока что затык на последнем цикле, строка 25. Он почему-то просто не работает. Есть идеи, что не так?
Изменено: kenigfinn - 16.10.2025 18:50:00
Пользовательская функция сортировки значений диапазона и вывод массивом
 
Punkt5, я уже обрадовался, что - "Вот оно, решение!", но, почему-то не помогло...

А может кто-нибудь подсказать, как пошагово выполнить код функции или как попросить функцию остановиться в точке останова? Как вообще проводить отладку Функции, аналогично с Макросом? Может так будет проще разобраться в коде, где косяк...
Пользовательская функция сортировки значений диапазона и вывод массивом
 
testuser, именно это и делает та часть, с которой я "справился" )) Но только в виде макроса. Когда превращаю её в функцию, функция даёт ошибку.
Пользовательская функция сортировки значений диапазона и вывод массивом
 
Доброго дня уважаемые форумчане.
В в программировании вообще и в vba в частности - самоучка, поэтому код, скорее всего, не самый эффективный, сильно не ругайте )
Некоторое время пытаюсь решить описанную задачу, но, видимо, без вашей помощи мне не справиться.

Задача. Имеем диапазон входных чисел A2:A21 (назовём его ЧИСЛА), всегда около 20 ячеек, заполнено обычно около половины, значения в диапазоне 2,0-9,5 с округлением до 0,1, ячейки всегда заполняются вручную. К этому диапазону есть дополнительный диапазон B2:K21 (назовём его БУКВЫ), столбцов диапазона всегда 10, значения заполняются формулой на листе, значения всегда целые числа от 0 до 15. Пользовательская функция должна взять значения из ЧИСЕЛ, отбросить пустые или нулевые, оставшиеся отсортировать по возрастанию, и если в БУКВАХ значение не нулевое к конкретному значению ЧИСЕЛ записать результат с присоединением это буквы. Например, для ЧИСЛА 7,8 БУКВА a имеет значение 0, а буква b значение 4, в результирующем столбце должно совсем не быть "7,8-a", т.к. значение для a = 0, а "7,8-b" быть должно, т.к. для b значение = 4. Результирующий диапазон около 30 ячеек, значения должны быть текстом, пустых ячеек в конце остаться не должно, все пустые, не заполненные функцией, можно заполнить любым символом или текстом.

Мои попытки что-то написать пока остановились на таком результате:

В виде простого макроса код выводит массив отсортированных по возрастанию данных из диапазона ЧИСЛА, но в виде функции почему-то работать отказывается.
Буду благодарен, если поможете решить задачу до конца
Изменено: kenigfinn - 16.10.2025 14:53:36
Зависает окно userform, но макрос продолжает выполняться
 
Jack Famous и New, Вы оба правы! DoEvents решает мои проблемы  :)
Спасибо Вам огромное!  :D
Зависает окно userform, но макрос продолжает выполняться
 
Jack Famous, спасибо за ответ!
Видится мне, что с самим макросом у меня всё ок. Об этом говорит то, что вначале всё отображается корректно, а в коде макроса после 16 итерации следует точно такая же 17-ая (обычный цикл For...Next), и ничего в тексте макроса не меняется, что могло бы как-то объяснить подвисание. При этом виснет не всегда после 16, это зависит от того, по каким книгам сейчас работает макрос. В процессе выполнения книги, опять же, не меняются.

Цитата
потом сделать DoEvents
Обновляю userform  с помощью UserForm.Repaint

Цитата
Читайте статью  ОТОБРАЗИТЬ ПРОЦЕСС ВЫПОЛНЕНИЯ
Эту статью читал и выводить прогресс в statusbar пробовал, результат тот же, через некоторое время после начала работы макроса значения прогресса перестают обновляться.
Изменено: kenigfinn - 12.05.2022 13:04:55
Зависает окно userform, но макрос продолжает выполняться
 
Доброго дня всем
Есть некоторый макрос, который сравнивает 3 различных диапазона в двух книгах и если значения совпадают выполняет перенос значений ячеек из одной книги в другую. Но суть не в этом. Прикрутил я к макросу userform для удобства отображения хода выполнения задачи. Целый progressbar мне не нужен, поэтому процесс выполнения отображается по типу "выполнено Х/из всего У". Перед началом работы макрос отключает обновление экрана и авторасчёт формул. Но почему-то окошко userform и всё окно excel виснет через некоторое время после начала работы макроса и вся красота с отображением процесса работы не работает :cry: При этом макрос продолжает выполняться и через некоторое время корректно выполняет задачу и завершается с отвисанием окон. Работает всё это на excel 2007.
Маленькая гифка с моей userform

Что можно сделать что бы окна userform и excel не зависали и процесс работы продолжал показываться до завершения макроса?
Самое очевидное, как я понимаю, либо как-то облегчить макрос, либо апгрейд железа? Но может есть другие варианты и можно как-то где-то поковыряться в настройках чего-то? :)
Изменено: kenigfinn - 12.05.2022 12:17:21
Массив vba со сбором данных с листов и возвратом обратно, Оптимизация существующего кода
 
Всем спасибо! Что-то очень даже компактное получилось )
Объединил два варианта от МатросНаЗебре и No Name:

Код
Dim x() As Variant
ReDim x(1 To 31)
a = Array("Az", "Bz", "Cz", ...) 'перечисляю диапазоны

For i = 1 To 31
    With Worksheets(i)
        x(i) = .Range(a(i - 1)).Columns(7).Formula 'сохраняю формулу
        .Range(a(i - 1)).Columns(7).Value = 1 'вставляю единицу
    End With
Next i

'какое-то другое действие

For i = 1 To 31
    Worksheets(i).Range(a(i - 1)).Columns(7).Formula = x(i) 'возвращаю формулу
Next i
Изменено: kenigfinn - 31.08.2021 16:18:05
Массив vba со сбором данных с листов и возвратом обратно, Оптимизация существующего кода
 
Цитата
Юрий М написал:
в чём великий смысл
Это довольно сложно объяснить ))
Массив vba со сбором данных с листов и возвратом обратно, Оптимизация существующего кода
 
No Name, Юрий М, я понял, недорассказал деталь. "Некоторое действие" должно остаться вне цикла, т.е. первый цикл берет формулы, ставит единицы и завершается. Далее действие. Второй цикл возвращает формулы.
Т.е. первым циклом нужно собрать сразу все формулы столцов со всех листов и поставить единицы. Вторым вернуть сразу все формулы столбцов на все листы.
Предложенный No Name вариант подходит, если бы не это "но".
Изменено: kenigfinn - 31.08.2021 13:35:05
Массив vba со сбором данных с листов и возвратом обратно, Оптимизация существующего кода
 
No Name, не будет этот цикл перезаписывать значения Ах на каждом витке?
Изменено: vikttur - 31.08.2021 12:39:53
Массив vba со сбором данных с листов и возвратом обратно, Оптимизация существующего кода
 
Ігор Гончаренко, не совсем понял, что мы выиграем этим циклом, ведь всё имена диапазонов и переменных всё равно остаются уникальными для каждого листа и нужно написать всё те же 31х3 строк
Изменено: kenigfinn - 31.08.2021 12:48:25
Массив vba со сбором данных с листов и возвратом обратно, Оптимизация существующего кода
 
Доброго дня всем )
Хочу попросить помощи в оптимизации кода vba. Так-то всё работает, но чувствую, что есть более изящное и менее громоздкое решение.
Есть книга с 31 листом. На каждом листе есть именованный диапазон. Размерность диапазонов на всех листах по столбцам - одинаковая, по строками - разная, заранее не известная. Нужно макросом собрать значение формул всех ячеек одного столбца каждого диапазона с 31 листа. Затем заполнить значения всех ячеек столбца каждого диапазона единицей. Далее производятся некоторые действия и в конце нужно вернуть значения записанные в переменную обратно в ячейки столбцов диапазонов на листы.

Сейчас работает так:
Код
Ax = Worksheets("Ay").Range("Az").Columns(7).Formula 'сохранил значения формул столбца в переменную
Worksheets("Ay").Range("Az").Columns(7).Value = 1 'заполнил ячейки столбца единицей
'ещё 60 строк с аналогичными действиями для других 30 листов
'...
'некоторое действие
'...
Worksheets("Ay").Range("Az").Columns(7).Formula = Ax 'вернул формулы из переменной в ячейки
'еще 30 строк для 30 листов

И так 31 раз для каждого листа, с другими именами соответственно, Bx, By, Bz для второго листа и т.д.... Постоянный только номер столбца - всегда 7.

Если бы листов было 1...5, всё просто, но листов 31 ))) и для каждого писать три строчки кода кажется неразумно. Чувствую, что логичнее было бы собирать всё циклом в один многомерный массив, но тут мои познания заканчиваются ) С многомерными массивами дела ещё не имел

С vba знаком на любительском уровне самоучки. Сильно не ругайтесь )
Изменено: kenigfinn - 31.08.2021 11:59:19
Программно посчитать количество всех страниц (на печать) в книге Excel - VBA
 
Цитата
bedvit написал:
Вот мое решение:
Доброго дня
Столкнулся с такой же задачей, до печати, программно получить количество страниц, но не во всей книге целиком, а на конкретном листе, коих в книге много. Как бы оптимизировать Ваше решение под конкретный лист в книге?
Запуск макроса в другой книге с неизвестным именем
 
Ігор Гончаренко, Михаил Лебедев, всем ещё раз спасибо!
Действительно, как сказал Ігор Гончаренко, самый простой способ оказался положить макрос в первую книгу.
Запуск макроса в другой книге с неизвестным именем
 
Ігор Гончаренко, Михаил Лебедев, большое спасибо за ответы! Почти получилось то, что нужно.
С Activate всё работает, но мне не очень хочется что бы вторая книга активировалась. Получится у меня обойтись с помощью Application.Run ("Книга!Модуль.Макрос")? Если да, то помогите, пожалуйста, склеить строку аргументов, что бы вместо "Книга" вставлялся результат Replace(ThisWorkbook.Name, "ПЕРВАЯ", "ВТОРАЯ")
Запуск макроса в другой книге с неизвестным именем
 
Всем доброго дня.
Помогите, пожалуйста, решить следующую задачу:
Условия: есть две книги с неизвестными но одинаковыми (за исключением последнего слова) именами и расширениями: "Книга пример ПЕРВАЯ.xlsm" и "Книга пример ВТОРАЯ.xlsm"; обе книги всегда лежат в одной папке; "Книга пример ВТОРАЯ.xlsm" не всегда открыта.
Задача:
  1. Макросом из первой получить её имя
  2. Подменить последнее слово полученного имени, что бы получить имя второй книги
  3. Проверить, открыта ли вторая книга, если нет - завершить, если да:
  4. Запустить макрос из второй книги в Modul1 (отработать должен на второй книге)
  5. Если вторая книга стала активной - вернуться в первую.
Суммирование произведений, удовлетворяющим нескольким условиям, Условно И() ИЛИ() внутри СУММПРОИЗВ()
 
Mershik, работает! Спасибо!
Суммирование произведений, удовлетворяющим нескольким условиям, Условно И() ИЛИ() внутри СУММПРОИЗВ()
 
IKor, нет, такой статьи не видел, но про БДСУММ() слышал. Единственный вопрос тогда встаёт о том, что эта функция берёт значения условий из ячеек, а мне нужно, что бы значения условий были записаны только внутри формулы, без дополнительных ячеек. Но спасибо за наводку, покопаю в сторону БДСУММ() поглубже.
Суммирование произведений, удовлетворяющим нескольким условиям, Условно И() ИЛИ() внутри СУММПРОИЗВ()
 
Mershik, это жестоко, но всё равно, спасибо за ответ. Ищу более универсальный способ..
Суммирование произведений, удовлетворяющим нескольким условиям, Условно И() ИЛИ() внутри СУММПРОИЗВ()
 
Всем доброго дня. Помогите пожалуйста написать формулу, которая суммировала бы произведения, удовлетворяющие нескольким критериям, объединяющимся не только по И но и по ИЛИ.
Конкретный пример к приложенному файлу. В ячейке D19 получить сумму произведений строк в столбцах А и В, одновременно удовлетворяющих условиям: Критерий 1 = или(Январь;Сентябрь), Критерий 2 = или(Красный;Зелёный), Критерий 3 = не(Дерево). С такими условиями должны просуммироваться произведения строк 2 и 10, и в результате должно получиться 222. В столбцах Число 1 и Число 2 - только числовые значения до 3 знаков после запятой, в столбцах критериев - только текстовые значения, могут и будут повторяться. Критерии задаются внутри формулы. Дополнительных ячеек и ячеек с промежуточным результатом быть не может. Не имею ничего против формул массива.
Изменено: kenigfinn - 23.10.2019 11:43:29
Перебор комбинаций с выбором одной наилучшей по условиям
 
MCH,Огромное Вам спасибо!
Перебор комбинаций с выбором одной наилучшей по условиям
 
MCH, а возможно это представить в виде UDF, как было первый раз?
Изменено: kenigfinn - 16.02.2018 15:09:36
Перебор комбинаций с выбором одной наилучшей по условиям
 
Всем спасибо большое!
Перебор комбинаций с выбором одной наилучшей по условиям
 
MCH, чувствую, что наглею, но не поможете с вариантом, если маленьких отрезков 4 варианта разной длины: 2,4; 1,2; 0,9; 0,6?
Пытался разобраться сам, но как я понимаю, в таком варианте уже появляются вложенные циклы, а с их пониманием всё плохо.
Перебор комбинаций с выбором одной наилучшей по условиям
 
Ігор Гончаренко и Вам спасибо большое!
Страницы: 1 2 След.
Наверх