Дневник VBAшника
Готовлю интересный материал (по крайней мере мне кажется, это будет интересно) Как думаете, что это и что скрыто за черными полосками?🙃
Сушайте, ну можем похоливарить на тему, если интересно
Дано
Книга на 4 столбца и на 25000 строк
Задача
Максимально быстро извлечь все данные и вывести в вбансоль количество строк
На скрине результаты решений, на момент подготовки
Regular - обычное открытие книги, без "ускорителей" в трех вариантах: просто открытие, с флагом ReadOnly и с флагами ReadONly и NoUpdateLinks.
Screen updating off - выключенный Application.ScreenUpdating
Events off - выключен ScreenUpdating и EnableEvents
Calculation Manually - ко всему выше установлено Calculation Manual
Status bar off - ко всему выше отключен статус бар
Display Alerts off - ко всему выше отключены DisplayAlerts
ADO - чтение через ADO
Спустя некоторое время, ВНЕЗАПНО, вариант с ADO начал выдавать результаты в 2 раза хуже чем обычное открытие.
Причины? Вообще без понятия.
Просто открытие с ScreenUpdating = False выдает ~ 240ms, ADO ~430ms, при этом изначальные результаты были на скрине.
Что повлияло? Вообще без понятия.
У меня все. Спасибо за внимание🥴
Дано
Книга на 4 столбца и на 25000 строк
Задача
Максимально быстро извлечь все данные и вывести в вбансоль количество строк
На скрине результаты решений, на момент подготовки
Regular - обычное открытие книги, без "ускорителей" в трех вариантах: просто открытие, с флагом ReadOnly и с флагами ReadONly и NoUpdateLinks.
Screen updating off - выключенный Application.ScreenUpdating
Events off - выключен ScreenUpdating и EnableEvents
Calculation Manually - ко всему выше установлено Calculation Manual
Status bar off - ко всему выше отключен статус бар
Display Alerts off - ко всему выше отключены DisplayAlerts
ADO - чтение через ADO
Спустя некоторое время, ВНЕЗАПНО, вариант с ADO начал выдавать результаты в 2 раза хуже чем обычное открытие.
Причины? Вообще без понятия.
Просто открытие с ScreenUpdating = False выдает ~ 240ms, ADO ~430ms, при этом изначальные результаты были на скрине.
Что повлияло? Вообще без понятия.
У меня все. Спасибо за внимание🥴
Я думал, что VBA меня уже ничем не удивит😂
Итак, есть модуль TestModule, который выглядит как-то так:
И есть модуль Example:
Если с помощью F5 начать вызывать процедуру Test, то вывод в Immediate будет как на скрине 🥴
То есть, словарь
Внимание вопрос:
WTF???
Если что, я реально не понимаю в чем прикол.
Итак, есть модуль TestModule, который выглядит как-то так:
Option Explicit
Private Type TType
Objects As Object ' Dictionary
End Type
Private this As TType
Public Sub Run()
CreateNewCollection
End Sub
Public Function Count() As Long
If this.Objects Is Nothing Then Exit Function
Count = this.Objects.Count
End Function
Private Sub CreateNewCollection()
If this.Objects Is Nothing Then
Set this.Objects = CreateObject("Scripting.Dictionary")
End If
Set this.Objects(Rnd) = New Collection
End Sub
И есть модуль Example:
Public Sub Test()
Debug.Print TestModule.Count
TestModule.Run
End Sub
Если с помощью F5 начать вызывать процедуру Test, то вывод в Immediate будет как на скрине 🥴
То есть, словарь
this.Objects
в модуле TestModule живет вечно (пока явно его не удалить или не нажать кнопку "Стоп" на панели управления).Внимание вопрос:
WTF???
Если что, я реально не понимаю в чем прикол.
Относительный путь
Узнал в только что лет.
Попадались на таком?
Когда пытаешься сохранить книгу, используя только ее название, файл улетает, обычно, в папку Documents:
Все дело в том, что при открытии Excel, директория «Документы» выбирается как рабочая (если я правильно понимаю).
В итоге приходится прописывать полный путь, чтобы сохранить файл в нужное место.
И я так делал, а потом вспомнил о таком модуле как FileSystem.
Все, что требуется сделать, это воспользоваться старым советским… функцией ChDir:
Что особенно круто, если вы укажете какую-то корневую директорию, а вам нужно сохранить в папку из этой директории, то можно прописать и путь к ней:
Причем писать можно как нравится:
-
-
и даже
-
VBA слэши сам исправит ☺️
Если нужно, все таки, сохранить (зачем-то) путь к текущей рабочей директории, то можно воспользоваться функцией CurDir:
Ставь😱, если было полезно
Узнал в только что лет.
Попадались на таком?
Когда пытаешься сохранить книгу, используя только ее название, файл улетает, обычно, в папку Documents:
Dim Book As Workbook
Set Book = Workbooks.Add()
Book.SaveAs "Temp.xlsx"
Debug.Print Book.FullName ' C:\Users\Username\Documents\Temp.xlsx
Все дело в том, что при открытии Excel, директория «Документы» выбирается как рабочая (если я правильно понимаю).
В итоге приходится прописывать полный путь, чтобы сохранить файл в нужное место.
И я так делал, а потом вспомнил о таком модуле как FileSystem.
Все, что требуется сделать, это воспользоваться старым советским… функцией ChDir:
FileSystem.ChDir ThisWorkbook.Path ' Или другой полный путь, на свое усмотрение
Dim Book As Workbook
Set Book = Workbooks.Add()
Book.SaveAs "Temp.xlsx"
Debug.Print Book.FullName ' C:\путь\до\текущей\книги\Temp.xlsx
Что особенно круто, если вы укажете какую-то корневую директорию, а вам нужно сохранить в папку из этой директории, то можно прописать и путь к ней:
FileSystem.ChDir ThisWorkbook.Path ' Или другой полный путь, на свое усмотрение
Dim Book As Workbook
Set Book = Workbooks.Add()
Book.SaveAs "MY_FOLDER\Temp.xlsx"
Debug.Print Book.FullName ' C:\путь\до\текущей\книги\MY_FOLDER\Temp.xlsx
Причем писать можно как нравится:
-
MY_FOLDER\
-
./MY_FOLDER/
и даже
-
./MY_FOLDER\
VBA слэши сам исправит ☺️
Если нужно, все таки, сохранить (зачем-то) путь к текущей рабочей директории, то можно воспользоваться функцией CurDir:
Dim WorkingDir As String
WorkingDir = FileSystem.CurDir()
Ставь😱, если было полезно
PCollections
Выложил модуль с функциями для работы с коллекциями, вдруг кому надо:
https://github.com/artemdorozhkin/PCollections
Вроде неплохая дока получилась + тесты и модуль с примерами.
Если звезду ткнете, вообще буду благодарен⭐️
Stay tuned❤️
Выложил модуль с функциями для работы с коллекциями, вдруг кому надо:
https://github.com/artemdorozhkin/PCollections
Вроде неплохая дока получилась + тесты и модуль с примерами.
Если звезду ткнете, вообще буду благодарен⭐️
Stay tuned
Please open Telegram to view this post
VIEW IN TELEGRAM
Дневник VBAшника
PCollections Выложил модуль с функциями для работы с коллекциями, вдруг кому надо: https://github.com/artemdorozhkin/PCollections Вроде неплохая дока получилась + тесты и модуль с примерами. Если звезду ткнете, вообще буду благодарен⭐️ Stay tuned❤️
Та я ж не про эту звезду, вы чего 😳
Благодарю ❤️
Благодарю ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы себе даже не представляете, с каким трепетом я сейчас смотрел на это сообщение об авторизации на собственном публичном сервере для реестра ppm.🥲
Ну то есть любой желающий сможет выложить свой код для переиспользования участниками сообщества.
Все как во взрослом мире npm, pip и прочих пакетных менеджеров🥲
Оно работает.
Теперь буду тестить и, надеюсь, в ближайшее время будет релиз
Stay tuned❤️
Что за ppm?
Ну то есть любой желающий сможет выложить свой код для переиспользования участниками сообщества.
Все как во взрослом мире npm, pip и прочих пакетных менеджеров🥲
Оно работает.
Теперь буду тестить и, надеюсь, в ближайшее время будет релиз
Stay tuned
Что за ppm?
Please open Telegram to view this post
VIEW IN TELEGRAM
Токен
Прикрутил возможность восстановить токен прямо из
Вот такое вот письмецо будет прилетать, сразу с командой, которую нужно выполнить для перезаписи токена.
За токен на скрине, кстати, можете не переживать, я его уже перевыпустил🕺
Ах да, я же не делился еще.
Добавил команду
Токен и email хранятся в конфиге на уровне user (путь:
Как раз на случай утери/удаления токена из конфигурации, решил добавить возможность восстановления. Вернее это будет создание нового.
З.ы. Самые внимательные могли заменить доменное имя для удаленного реестра🤫
Stay tuned❤️
Что за ppm?
Прикрутил возможность восстановить токен прямо из
ppm
.Вот такое вот письмецо будет прилетать, сразу с командой, которую нужно выполнить для перезаписи токена.
За токен на скрине, кстати, можете не переживать, я его уже перевыпустил
Ах да, я же не делился еще.
Добавил команду
auth
, с помощью которой можно получить токен на публикацию пакетов. Устанавливать пакеты можно без регистрации и смс, а вот публикация ограничена теми, у кого есть токен. Впрочем, получить его можно тоже совершенно бесплатно.Токен и email хранятся в конфиге на уровне user (путь:
%APPDATA%/ppm/.ppmrc
).Как раз на случай утери/удаления токена из конфигурации, решил добавить возможность восстановления. Вернее это будет создание нового.
З.ы. Самые внимательные могли заменить доменное имя для удаленного реестра
Stay tuned
Что за ppm?
Please open Telegram to view this post
VIEW IN TELEGRAM
PyPath
Выложил модуль с функциями для работы с путями, вдруг кому надо:
https://github.com/artemdorozhkin/PyPath
Этот модуль – практически полный перевод на VBA модуля🖼️ .
Соответственно, python-документация актуальна и для моего модуля🗒
Если звезду ткнете, вообще буду благодарен⭐️
Stay tuned❤️
Выложил модуль с функциями для работы с путями, вдруг кому надо:
https://github.com/artemdorozhkin/PyPath
Этот модуль – практически полный перевод на VBA модуля
os.path
из pythonСоответственно, python-документация актуальна и для моего модуля
Если звезду ткнете, вообще буду благодарен⭐️
Stay tuned
Please open Telegram to view this post
VIEW IN TELEGRAM
Большое обновление ppm
Вчера загрузил большое обновление. По сути – это релиз кандидат🥳
Функционал протестил на нескольких своих проектах, вроде работает как надо.
Присоединяйтесь к тестированию😉 Единственный момент, не рекомендовал бы пока сразу тестировать на боевых проектах.
А, ну и точно должно работать в Excel, за другие платформы, увы, не ручаюсь.
Если есть желание добавить поддержку другой платформы, welcome to contributors🍷
✒️ Итак, что же изменилось:
✅ команды 😎
✅ конфигурация собирается по восходящей:
➡️ сначала читаем минус-аргументы, переданные вместе с командой (
➡️ затем читаем конфиг из папки проекта -
➡️ далее конфиг в
➡️ потом конфиг в
➡️ оставшиеся значения берем из установленных по умолчанию в ppm
✅ исправлены баги
🔊 А еще, много нового функционала
📌 dev-зависимости
Добавил работу с dev-зависимостями. Теперь при выполнении команды
Таким образом можно разделять обязательные зависимости и те, которые нужны только для разработки.
📌 Новая команда
и все, вы великолепны😌
-
-
-
-
- флаг
📌 Новая команда
Помните dev-зависимости/референсы? Так вот, при выполнении:
из проекта автоматически будут удалены все зависимости/референсы добавленные в dev блоки. Все остальные останутся.
Вот с референсами – это то, чего мне дико не хватало в работе. Было удобно юзать scripting при разработке, но в клиентской версии его нужно было обязательно отключать. Как и ppm, собственно. У вас такой проблемы не будет :))
Поддерживает флаги:
-
-
Поддерживаются форматы
📌 Новая команда
Для публикации пакетов (
Чтобы его получить, необходимо выполнить команду:
Где
На самом деле, на данный момент, это может быть любая строка без пробелов, но лучше всего указать, все-таки, действительный email, т.к. в случае утери токена, восстановить его не удастся.
После выполнения команды будет выведено сообщение с токеном для указанного email-адреса.
Токен и email автоматически записываются в
В случае утери токена, можно выполнить команду:
после чего, на указанный email будет выслано письмо с новым токеном и инструкцией по его установке.
Уф... вроде все на сегодня :)
Код уже на GitHub🖥
Stay tuned❤️
Что за ppm?
Вчера загрузил большое обновление. По сути – это релиз кандидат
Функционал протестил на нескольких своих проектах, вроде работает как надо.
Присоединяйтесь к тестированию
А, ну и точно должно работать в Excel, за другие платформы, увы, не ручаюсь.
Если есть желание добавить поддержку другой платформы, welcome to contributors
install
и publish
теперь по умолчанию обращаются к публичному репозиторию: https://registry.ppmvba.com
ppm "export --save-struct"
)project
конфиг%APPDATA%/ppm
- user
конфиг%PROGRAMDATA%/ppm
- global
конфигДобавил работу с dev-зависимостями. Теперь при выполнении команды
ppm "install"
можно добавить флаг --save-dev
и пакет установится в dev часть:' "devDependencies": {
' "PCollections": "1.0.0"
' }
Таким образом можно разделять обязательные зависимости и те, которые нужны только для разработки.
ref
ref
(от references) управляет референсами проекта. То есть, теперь не нужно обращаться к Tools > References...
и искать в списке Scripting
, а достаточно в Immediate window выполнить команду:ppm "ref add scripting"
и все, вы великолепны
ref
поддерживает подкоманды/флаги:-
add
– добавление-
delete
– удаление-
update
– обновление списков в модуле package
-
list
– вывод в Immediate списка подключенных референсов- флаг
--save-dev
, то есть можно добавить dev-references:' "devReferences": {
' "Rubberduck": "2.5",
' "ppm": "1.0.0"
' }
ppm
автоматически добавляется в devReferences
. При удалении (ppm "ref delete ppm"
), отключается от проекта.build
ppm
теперь не просто пакетный менеджер, а еще и простенькая билд-система. Помните dev-зависимости/референсы? Так вот, при выполнении:
ppm "build"
из проекта автоматически будут удалены все зависимости/референсы добавленные в dev блоки. Все остальные останутся.
Поддерживает флаги:
-
-o|--output
имя файла для билда. По умолчанию берется name@version
из модуля package
.-
--file-format
формат/расширение файла билда. По умолчанию xlsb
. Если в output
передано имя файла с расширением, в конце будет добавлено расширение переданное с флагом --file-format
:ppm "build -o main.xlsb --file-format xlsm" ' сохранит билд в файл main.xslb.xslm
Поддерживаются форматы
xlsb
, xlsm
, xls
, xla
, xlam
.auth
Для публикации пакетов (
ppm "publish"
) в публичный репозиторий, потребуется api-token.Чтобы его получить, необходимо выполнить команду:
ppm "auth <email>
Где
email
– ваш email-адрес.После выполнения команды будет выведено сообщение с токеном для указанного email-адреса.
Токен и email автоматически записываются в
user
конфиг и при публикации пакетов считываются оттуда.В случае утери токена, можно выполнить команду:
ppm "auth --recreate-token"
после чего, на указанный email будет выслано письмо с новым токеном и инструкцией по его установке.
Уф... вроде все на сегодня :)
Код уже на GitHub
Stay tuned
Что за ppm?
Please open Telegram to view this post
VIEW IN TELEGRAM
Я тут подумал, и решил в несколько постов сделать туториал по ppm: как им пользоваться, как его установить и тд
Типа документации в постах.
Что думаете, нужно?👇
Типа документации в постах.
Что думаете, нужно?👇
PPrint
Наконец-то дошли руки до проекта, о котором я мечтал уже давно.
Представляю простой, но мощный модуль, состоящий из одной функции —
Теперь всё стало проще:
➡️ Вывод словарей:
➡️ Красивый вывод коллекций:
➡️ Удобный вывод массивов:
А еще:
✅ Поддержка вывода объектов
✅ Любой другой объект выводится как
✅ Хотите более информативный вывод ваших пользовательских объектов? Просто добавьте метод
Подробности и примеры на GitHub.📖
В
Stay tuned❤️
Дневник VBAшника
Наконец-то дошли руки до проекта, о котором я мечтал уже давно.
Представляю простой, но мощный модуль, состоящий из одной функции —
pprint
. Можно забыть о надоедливых джойнах массивов перед выводом в окно Immediate и нудном просмотре словарей через Watch window.Теперь всё стало проще:
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
d("Hello") = "World"
pprint d
' Результат: {"Hello": "World"}
Dim c As Collection
Set c = New Collection
c.Add "Hello"
c.Add "World"
pprint c
' Результат: ("Hello", "World")
Dim a As Variant
a = Array(1, "Hello, World!", CreateObject("Scripting.Dictionary"))
pprint a
' Результат: [1, "Hello, World!", {}]
А еще:
Range
.<object 'ObjectName'>
, включая пользовательские классы.Repr__
в свой класс, и pprint
отобразит его так, как вам нужно.Подробности и примеры на GitHub.
В
ppm
уже добавил. Установить очень легко:ppm "install pprint"
Stay tuned
Дневник VBAшника
Please open Telegram to view this post
VIEW IN TELEGRAM
Дневник VBAшника
PPrint Наконец-то дошли руки до проекта, о котором я мечтал уже давно. Представляю простой, но мощный модуль, состоящий из одной функции — pprint. Можно забыть о надоедливых джойнах массивов перед выводом в окно Immediate и нудном просмотре словарей через…
Продолжаю клянчить звезды, кстати😅
На гитхабе, не к посту!!😀😀
http://github.com/artemdorozhkin/pprint.git
На гитхабе, не к посту!!😀😀
http://github.com/artemdorozhkin/pprint.git
xlcat
Решил тут параллельно с другими проектами немного поэкспериментировать с Go, и вместе с GPT родили идею написать небольшую удобную утилиту: xlcat.
Это что-то вроде привычного cat, но только для Excel-файлов — теперь можно быстро просматривать их содержимое прямо в терминале, без лишних движений и интерфейсов.
Максимально простая и легкая утилита, без перегруженного функционала и лишних деталей.
Делюсь своим маленьким творением — возможно, кто-то давно искал именно такую штуку 🙂
В релизах есть exe под win x64. Не забудьте добавить в переменную❤️
Дневник VBAшника
Решил тут параллельно с другими проектами немного поэкспериментировать с Go, и вместе с GPT родили идею написать небольшую удобную утилиту: xlcat.
Это что-то вроде привычного cat, но только для Excel-файлов — теперь можно быстро просматривать их содержимое прямо в терминале, без лишних движений и интерфейсов.
Максимально простая и легкая утилита, без перегруженного функционала и лишних деталей.
Делюсь своим маленьким творением — возможно, кто-то давно искал именно такую штуку 🙂
В релизах есть exe под win x64. Не забудьте добавить в переменную
PATH.
Это первый мой проект на go, поэтому гоферов прошу тапками не кидаться)
Stay tunedДневник VBAшника
Please open Telegram to view this post
VIEW IN TELEGRAM