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

Страницы: 1 2 3 4 След.
Поделитесь, у кого есть, кодом Fn VBA, которая принимает коллекцию как аргумент и возвращает все ее ключи, (именно ключи, не значения)
 
БМВ,
Цитата
написал:
Сергей Юрьевич , нет. Я имею в виду что можно провести сортировку в коллекции. Изменив порядок. Как и в массиве.
Как же вы измените порядок?  Если вы попытаетесь перезаписать значение, то получите ошибку.
Код
Dim MyCol As New Collection  
MyCol.Add "Апельсины", "ключ1"
MyCol.Item("ключ1") = "Бананы" ' Ошибка

А если вы будете удалять и добавлять элемент заново и таким образом добиваться сортировки (типо сортировки пузырьком, но снизу), то тоже самое можно делать и в Dictionary.

Изменено: Сергей Юрьевич - 14.01.2025 15:13:40
Поделитесь, у кого есть, кодом Fn VBA, которая принимает коллекцию как аргумент и возвращает все ее ключи, (именно ключи, не значения)
 
Цитата
написал:
Коллекция более универсальна при использовании на pc и MacПозволяет сортировать
В смысле коллекция позволяет сортировать? Вы имеете в виду хранит порядок в котором элементы были добавлены? Dictionary тоже порядок внесения запоминает.
Изменено: Сергей Юрьевич - 13.01.2025 15:18:31
Поделитесь, у кого есть, кодом Fn VBA, которая принимает коллекцию как аргумент и возвращает все ее ключи, (именно ключи, не значения)
 
Цитата
написал:
И у меня почему-то коллекции оказывалась сильно быстрей даже на куда меньшем количестве, т.е. 10к очень было заметно
Если вы создали словарь так:
Код
Dim Dict As Object
Set Dict = CreateObject("Scripting.Dictionary")

То это долгий старт для Dictionary и тогда понятно почему вам приходится говорить о разительной разнице.
Для себя решил отказаться от такого способа создания словарей.
Изменено: Сергей Юрьевич - 13.01.2025 12:55:07
Поделитесь, у кого есть, кодом Fn VBA, которая принимает коллекцию как аргумент и возвращает все ее ключи, (именно ключи, не значения)
 
testuser, это понятно, что выгрузку ключей лучше переиспользовать. Вопрос был другой - эффективность ColKeys, пример которой вы привели, в плане производительности. Сильно уступает методу keys(), который у Dictionary (при равном наборе ключей и значений)? Или призводительность сопоставима и переписав проект, избавив его от Dictionary, я не получу жесткой просадки производительности в части .keys() функционала? Вы не тестировали ее в плане перформанса?
Изменено: Сергей Юрьевич - 13.01.2025 07:51:27
Поделитесь, у кого есть, кодом Fn VBA, которая принимает коллекцию как аргумент и возвращает все ее ключи, (именно ключи, не значения)
 
Цитата
написал:
Разве что тс не указал, что в итоге он хочет видеть, коллекцию ключей или массив ключей или массив ключ,значение...
Да это не имеет принципиального значения) Я нуждался в низкоуровневом образце кода с трюком, проверенным практикой, а потому устойчивый к ошибкам, чтобы утащить к себе в проект и видоизменить. Теперь, когда я получил такие образцы благодаря вам, мои мысли оставили это и меня интересует вопрос цены в плане производительности в сравнении с тем же Dictionary.
Изменено: Сергей Юрьевич - 13.01.2025 02:34:55
Поделитесь, у кого есть, кодом Fn VBA, которая принимает коллекцию как аргумент и возвращает все ее ключи, (именно ключи, не значения)
 
testuser, БМВ, спасибо огромное! То, что нужно!
Скажите, а в плане производительности это сопоставимо с Dictiory.keys()?
Без учета накладных на первоначальное создание самого объетка Dictiory или коллекции, ключи которого получаем.

Что скажете, подходит ли этот функционал для широкого использования, аналогично Dictiory.keys()?
Например. Задумал заменить в своем проекте все Dictionary на Коллекции. Мотивация - опасное поведение Dictionary при обращении к значению, он добавляет ключ, если его не было, даже тогда, когда я предпочел бы ошибку. Проект покрыт проверками Dictionary.Exists с функционалом выброса ошибки, если ключа нет, коллекция делала бы выброс ошибки по-умолчанию, что избавляет меня от нудных танцев с Dictionary и неочевидного Debugа.

Аналог .keys() для коллекций потребовался чтобы не городить дополнительный уровень вложености коллекции, хранящей Row таблицы (в отличии от Dictionary, Row в виде коллекции не может сообщить к каким столбцам она хранит значения из-за чего где-то в верхнеуровневом коде нужно выписывались названия столбцов или же хранить их в общей структуре DSetWithMeta с полями "rows", "columnNames". Т.е. образовался дополнительный уровень вложенности в сравнении с Dictionary).

Пример с Row не единственный, а лишь один частный случай, но очень часто Dictionary подкупает именно тем, что имеет метод .keys(), который в отличии от метода exists() сложно реализовать для коллекции (но благодаря вам, кажется, это теперь стало возможным).
Изменено: Сергей Юрьевич - 13.01.2025 02:19:55
Поделитесь, у кого есть, кодом Fn VBA, которая принимает коллекцию как аргумент и возвращает все ее ключи, (именно ключи, не значения)
 
Привет! Поделитесь, у кого есть, кодом Fn VBA для 64 битного MS Excel, которая принимает коллекцию как аргумент и возвращает все ее ключи (именно ключи, не значения).
Изменено: Сергей Юрьевич - 12.01.2025 05:53:54
У двух умных таблиц разное поведение при удалении DataBodyRange в части форматирования итогов. Файл-пример., Одна из таблиц не сбрасывает формат итогов, другая сбрасывает. Внешне таблицы одинаковы
 
New, спасибо! Я в итоге к тому же пришел, только кода в реальный проект чуток более пришлось написать - приходится обрабатывать возможную ошибку и возвращать итоги на место даже если .ListRows.Add провалился. А что там на уровне проблемной таблицы сломано так и не понял, вероятно, таблице переписали стиль, это можно сделать, например, если задать формат на уровне столбца, а затем попытаться вернуть формат таблицы обратно простым форматированием ячеек (это не удастся без таких вот последствий).
Изменено: Сергей Юрьевич - 15.12.2024 22:47:48
У двух умных таблиц разное поведение при удалении DataBodyRange в части форматирования итогов. Файл-пример., Одна из таблиц не сбрасывает формат итогов, другая сбрасывает. Внешне таблицы одинаковы
 
Привет! У двух умных таблиц разное поведение в части форматирования итогов при удалении макросом DataBodyRange.
Одна не сбрасывает формат итогов, другая сбрасывает. Внешне таблицы выглядят абсолютно одинаково и я хотел бы понять в чем дело и как сделать чтобы вторая таблица прекратила переустанавливать формат итогов.
При ручном удалении разницы между таблицами не возникает, не ясно почему разница возникает только при удалении макросом.

Смотрите Лист1 и Лист2 в файле-примере.
Изменено: Сергей Юрьевич - 14.12.2024 01:59:55
формула "СУММПРОИЗВ": не считает если в диапазоне суммирования попался текст, Посмотрите мой пример. Я ввожу условия, которые должны были отсеять текст, но все равно не работает.
 
memo, магия! Спасибо!
формула "СУММПРОИЗВ": не считает если в диапазоне суммирования попался текст, Посмотрите мой пример. Я ввожу условия, которые должны были отсеять текст, но все равно не работает.
 
memo, да, хотел это, спасибо большое!
Скорее ради удовлетворения любопытства спрошу, а через доработку моей "СУММПРОИЗВ" и не формулу массива эта проблема имеет не громоздкое решение?
Изменено: Сергей Юрьевич - 09.06.2023 15:39:22
формула "СУММПРОИЗВ": не считает если в диапазоне суммирования попался текст, Посмотрите мой пример. Я ввожу условия, которые должны были отсеять текст, но все равно не работает.
 
memo, а как сделать чтобы числа введенные как текст не исчезали? Я так понял, "Ч" их обнуляет, что для меня опасно
формула "СУММПРОИЗВ": не считает если в диапазоне суммирования попался текст, Посмотрите мой пример. Я ввожу условия, которые должны были отсеять текст, но все равно не работает.
 
Здравствуйте! Формула "СУММПРОИЗВ" не будет работать в принципе если в диапазоне суммирования есть текст? Я ввожу условия, которые должны были отсеять текст, но все равно не работает. И второй вопрос в рамках отправленного примера: как сделать чтобы умная таблица не переводила даты в заголовках таблицы в строки (хочу избавиться в моей формуле от ДАТАЗНАЧ, но хочу оставить умную таблицу)

Дополнено спустя время: желательно чтобы числа введеные как текст подсчитывались
Изменено: Сергей Юрьевич - 09.06.2023 04:13:12
Увеличится ли скорость кода VBA, если он сначала опросит все ячейки одного листа и только потом перейдет на второй лист., Задача: считать value 10000 ячеек в массив, ячейки хаотично разбросаны в пределах одной книг
 
RAN, собирается value ячеек в какую-то структуру данных, скажем, массив с листами и адресами ячеек, вот этот массив и нужно дополнить значениями по адресу ячеек. По этой причине двухмерный массив сразу имеет три столбца, заполнить нужно третий столбец - это value, в первых двух столбцах задан лист и ячейка. Порядок листов хаотичен и заранее не известен. Использовать собранные value никак не собираемся, просто кладем их в массив и довольно потираем руки.
Все, теперь есть полное описание задачи. Я расширил описание для вас, надеюсь теперь все понятно по исходным данным.
Я искренне не понимаю, правда, что дали эти дополнительные описания, что с их вводом появилось принципиально меняющее ход мыслей и как вам это поможет ответить на мои вопросы.

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

Цикл можно составить по варианту 3 и лист поменяется 499 раза (так как у нас 10000 ячеек по 20 штук на листе, всего 500 листов), а можно не придавать этому значение и лист будет с отличием до 9999 раз в худшем сценарии варианта 1.
Изменено: Сергей Юрьевич - 29.10.2022 12:23:03
Увеличится ли скорость кода VBA, если он сначала опросит все ячейки одного листа и только потом перейдет на второй лист., Задача: считать value 10000 ячеек в массив, ячейки хаотично разбросаны в пределах одной книг
 
БМВ, большое спасибо! На всякий случай уточнюсь, меня смутила ваша настороженность по поводу читабельности кода. С краткостью решения, как мне кажется, полный порядок - не противоречит условию задачи адресам ячеек изначально находиться в двумерном массиве (лист, адрес). Простите меня за то, что я не упомянул об этом сразу. Вопросы выше можно свести и к таким:
1. Нужно ли разбивать данные в массиве по листам и последовательно запрашивать ячейки в пределах листа, или можно "не заморачиваться" и писать цикл полной адресации к случайному листу из массива.
2. Какой самый удачный синтаксис в пределах цикла в плане скорости. Есть ли разница между приведенными мной вариантами?
Если я правильно понял ваш ответ, то первое - да, желательно разбить. Второе - предпочтительный синтаксис на который нужно держать ориентир с "with", а не "Select" как было у меня в варианте 3. Могли бы вы пояснить в чем тонкость? Равнозначны ли вариант 1 и вариант 2? Спасибо!
Изменено: Сергей Юрьевич - 29.10.2022 09:18:06
Увеличится ли скорость кода VBA, если он сначала опросит все ячейки одного листа и только потом перейдет на второй лист., Задача: считать value 10000 ячеек в массив, ячейки хаотично разбросаны в пределах одной книг
 
New, не понял, а если данные листов не выстраиваются в линии чтобы их как в вашем примере макросом забирать целыми столбцами\строками?
Я именно такую ситуацию и обрисовывал в своем первом сообщении. Но, видимо, сделал это непрозрачно. Исправлюсь:
Есть 10000 адресов ячеек в несистемном виде. Скажем:
- по 20 ячеек на лист, таких листов 500. Итого 20яч. * на 500 листов = 10000 ячеек; Я не знаю может ли быть в одной книге столько листов. Для простоты предположим что все листы в одной книге.
- у ячеек нет общего столбца и строки в пределах одного листа, нужные данных по единственном экземпляре на строку и на столбец среди других ненужных значений.
- положение ячеек на одном листе ничего не говорит о их расположении на другом листе.

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

Цитата
[USER=8380]Ігор Гончаренко[/USER], написал:
вы бы описали задачу
выложили исходные данные
Описание задачи приходится придумывать так как передо мной в чистом виде такой задачи не стоит. На абстрактом, избыточно усложненном примере хочу понять ответы на свои вопросы про скорость. Написать макрос под эту цель не смогу (я их так быстро как вы не пишу). Посмотрите, пожалуйста, я дал описание в этом сообщении выше.  
Изменено: Сергей Юрьевич - 29.10.2022 08:35:21
Увеличится ли скорость кода VBA, если он сначала опросит все ячейки одного листа и только потом перейдет на второй лист., Задача: считать value 10000 ячеек в массив, ячейки хаотично разбросаны в пределах одной книг
 
Привет!
Меня интересует, увеличится ли скорость работы кода VBA, если он сначала опросит все ячейки одного листа и только потом перейдет на второй лист.
Допустим, нам нужно считать значение 10000 ячеек в массив, сами ячейки разбросаны в пределах одной книги (каждое значение нужно читать по индивидуально назначенному адресу ячейки, оптимизация по общему диапазону невозможна).

Будет ли зависимость скорости от последовательности адресации листов?
Будет ли зависимость скорости от синтаксиса адресации листов?

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


Вариант 1
итерация 1
ThisWorkbook.Sheets("Лист1").Range("A3")
итерация 2
ThisWorkbook.Sheets("Лист2").Range("A2")
итерация 3
ThisWorkbook.Sheets("Лист1").Range("A4")

Вариант 2
итерация 1
ThisWorkbook.Sheets("Лист1").Range("A3")
итерация 2
ThisWorkbook.Sheets("Лист1").Range("A4")
итерация 3
ThisWorkbook.Sheets("Лист2").Range("A2")

Вариант 3
несколько циклов (один в другом)
ThisWorkbook.Sheets("Лист1").Select
'код обращения к адресам нужных ячеек без указания листа
ThisWorkbook.Sheets("Лист2").Select
'код обращения к адресам нужных ячеек без указания листа


P.s. Еще вопрос про скорость который меня волнует, если можно)
Это нормальная практика объединять с разделителем несколько значений в String разной длины и засовывать в массив, делая String последним уровнем вложения в структуре данных? Извлекается от от туда только один раз, поиск мне не нужен. Переживаю за скорость. Или лучше заменить на коллекцию?)
Изменено: Сергей Юрьевич - 29.10.2022 01:18:36
Удобное внедрение языка программирования "Python" в файл Excel на основе портативной сборки Python, Настроенный файл Excel для удобного вызова скриптов Python из Excel
 
Цитата
Игорь Федорович написал:
1. а в этой портативной сборке UDF функции организовать возможно?
Можно
на сайте достаточно хороший раздел дружественной к новичкам документации, попробуйте читать ее разделы в той последовательности как они идут, браузером можно сделать перевод на приемлемый русский.

Цитата
Игорь Федорович написал:
2. и запустить сервер что бы быстрее отрабатывался их вызов?
Видел возможность сделать удаленный интерпретатор Python, но сам не делал. Я хочу чтобы вы знали, когда на сайте столкнетесь что это опция для PRO: такая возможность доступна и для обычной версии библиотеки, она не афишируется, возможно из коммерческих соображений, но в одном из видео демонстрации новых возможностей xlwings я видел как автор сайта объяснял что делать пользователям обычной библиотеки. Какое конкретно это было видео я уже не вспомню, вы сможете его найти на канале автора сайта в ютубе. На этом канале не так много видео длиной около одного часа которые посвящены демонстрации возможностей, демонстрация проходила в формате Live (через яндекс браузер сможете посмотреть на русском).

Оставлю тут перевод части текста по ссылке выше о возможностях:

"Веб-сервер xlwings может быть построен с использованием любой веб-инфраструктуры и, следовательно, может быть развернут с использованием любого решения, способного запускать серверную часть или функцию Python. Вот список для вдохновения (не исчерпывающий):

Полностью управляемые сервисы : Heroku , render , Fly.io и др.

Интерактивные среды : PythonAnywhere , Anvil и др.

Бессерверные функции : AWS Lambda , Azure Functions , Google Cloud Functions , Vercel и т. д.

Виртуальные машины : DigitalOcean (реферальная ссылка), vultr (реферальная ссылка), Linode , AWS EC2 , Microsoft Azure VM , Google Cloud Compute Engine и т. д.

Корпоративные серверы : все будет работать (включая Kubernetes), если к соответствующим конечным точкам можно получить доступ из вашего приложения для работы с электронными таблицами."
[
Изменено: Сергей Юрьевич - 06.09.2022 22:01:53
Нужна формула для вывода в одной ячейке номеров всех участков для заданного периода., Формула вроде ВПР, перечисляющая все значения, удовлетворяющие запрос, через разделитель.
 

Приветствую!

Нужна формула вроде ВПР, перечисляющая все уникальные значения, удовлетворяющие запрос через какой-то разделитель, скажем пробел либо запятую!

В прилагаемом примере даны идентификаторы работ, даты, номера участков (могут дублироваться в периоде). Нужен вывод всех уникальных участков для идентификатора внутри заданного периода (в примере предлагается выводить уникальные значения отдельно за 2018, 2019, 2020 и вместе за 2018-2020).

Вывод в одной ячейке! Формат не важен, можно как в примере через запятую или даже так: {1} или {1, 2, 3}, если это сделает работу формулы быстрее.

Задача стоящая передо мной: понятно для глаз вывести в одной ячейке все участки в периоде!

Спасибо!

Изменено: Сергей Юрьевич - 12.03.2022 11:13:14
Удобное внедрение языка программирования "Python" в файл Excel на основе портативной сборки Python, Настроенный файл Excel для удобного вызова скриптов Python из Excel
 
Цитата
Лина Сафиуллина написал:
Что я не так сделала? Буду благодарна за помощь!
Лина, можете попробовать снова, я изменил на первой странице источник портативной сборки. Думаю, теперь у вас все получится!
Изменено: Сергей Юрьевич - 25.12.2021 20:22:13
При цитировании пропадает ссылка на цитируемого
 
Цитата
vikttur написал:
Это так

:D  ;)  8)
При цитировании пропадает ссылка на цитируемого
 
Так как цитировать то теперь? Как мне ответить человеку на его вопрос чтобы он понял что я ответил на его вопрос (получил уведомление об этом)?
Сайт чтоли заброслили? Элементарного комфорта нет.

"а пока включаем режим BB code" - это как?
Изменено: Сергей Юрьевич - 25.12.2021 17:44:08
Как заставить макрос дождаться завершения работы других макросов., запросы PQ
 
,спасибо!
Office 2021 и новый Excel - у кого уже есть, какие мнения?, Обсуждение новой версии
 
Можно сюда задам вопрос. А как в новом Excel с редактором кода vba? Все по прежнему? Тот же интерфейс визуально все тоже самое?
Как заставить макрос дождаться завершения работы других макросов., запросы PQ
 
,хорошая идея! Ну если ничего более придумать нельзя, воспользуюсь! Спасибо!
Как заставить макрос дождаться завершения работы других макросов., запросы PQ
 
,нет, не совсем мой случай. У меня много запросов, если переписывать таким образом, то запросы НЕ будут стартовать один за другим что увеличит время исполнения кода (макрос не будет запускать следующий PQ-запроса пока не отработал прошлый PQ-запрос)
Как заставить макрос дождаться завершения работы других макросов., запросы PQ
 
Цитата
написал:
вы реализовали многопоточность в VBA ?
Нет, конечно. У меня запросы PQ продолжают работать от предшествующего макроса. Как узнать завершены ли все до единого PQ-запросы из других макросов той же книги?
Изменено: Сергей Юрьевич - 25.11.2021 08:32:36
Как заставить макрос дождаться завершения работы других макросов., запросы PQ
 
Добрый день!
Как заставить макрос дождаться завершения работы других макросов? Нужен код.
Изменено: vikttur - 25.11.2021 11:16:53
Удобное внедрение языка программирования "Python" в файл Excel на основе портативной сборки Python, Настроенный файл Excel для удобного вызова скриптов Python из Excel
 
egonomist, благодарю за роскошные подробности! Я так понял (из видео) вы два раза в месяц мониторите новые библиотеки Python. Из этого я заключил, что если вдруг появится что-то бесплатное, что способно выполнить код, который хранится в ячейках листа Excel, то вы об этом узнаете намного быстрее чем я. Буду благодарен если отпишите сюда! Я думаю где-то на этом сайте должна быть тема, которая несет информационно-позновательное о новинках в мире для связки Python + Excel. А может у вас есть такой блог?
Изменено: Сергей Юрьевич - 17.11.2021 13:18:24
Удобное внедрение языка программирования "Python" в файл Excel на основе портативной сборки Python, Настроенный файл Excel для удобного вызова скриптов Python из Excel
 
egonomist,  спасибо, за ваши 5 копеек! Не знал про библиотеку "mito", думал что кроме платной "bamboolib" GUI-альтернатив просто нет, так как мне не удалось ничего нагуглить другого полгода назад на эту тему.

Цитата
egonomist написал:
В такой связке VBA вообще не нужен. (Я раньше очень много писал на VBA но теперь им совсем не пользуюсь - переделываю чужие макросы на нормальные etl)
Какими инструментами решаете задачи сейчас, позвольте поинтересоваться? Я так понял у вас устоялась некая связка из редактора кода, ETL и БД, мне было бы интересно узнать несколько подробнее.
Изменено: Сергей Юрьевич - 14.11.2021 09:10:33
Страницы: 1 2 3 4 След.
Наверх