Jack Famous, привет. Я проверял на случайных данных, и там Коллекция оказывалась значительно быстрее на объемах 500 + тыс. Что впрочем объяснимо таким моментом, что у хеш таблицы (по сути это массив) dictionary четко фиксированый размер (~1000 элементов). Но если была бы возможность регулировать размер этой таблицы, то можно было бы получить бОльшую скорость dictionary на больших объемах. Скажу даже, я проверял сие, брал реализацию словаря The trick-а, делал в ней настраиваемый размер хеш-таблицы, и моя реализация в виде класса vba оказывалась быстрее Dictionary на объемах 500 т.+, что впроче все еще было медленей коллекции. В общем интересные моменты есть, хотя в сравнении, с UnorderedMap это все это конечно выглядит игрушками.. Если говорить о сортировке, то в коллекции, по логике она должна делать только хуже. Ведь коллекция использует логическое дерево, и при добавлении сортированых данных, постоянно будет расти только одна ветвь и получится так, то к самым первым элементам будет самый быстрый доступ, к последним - самый медленный..
mitya528 написал: действительно, в модуле книги был макрос, который запрещает удалять строки, ради теста удалил его и 120 тысяч строк почистились за за 1 минуту.
МатросНаЗебре написал: есть подозрение, что это пришло из других языков, где просто нельзя написать по-другому.
Да там похоже пытаются притянуть специфику разработки в какой-нибудь джаве, на vba. Объявление переменныв внутри цикла на vba не имеет смысла, поскольку не отражает реальный принцип работы и может только запутывать.
Zozel написал: проблема в том, что они отсканированы и могут иметь наклон
Это наверное ключевое. Думаю, единственное что тут можно посоветовать, распечатть PDF в растр, откорректировать наклон в растре в каком-нибудь профессиональном редакторе (в Кореле допустим) максимально точно. И по новой распознать. Но не будучи специалистом в таких дела, подозреваю, распознавание таблиц это чистейшее дерьмо в любом случае..
Там может все не так уж плохо, по крайне мере выглядит перспективно, то что JS, то что возможна какая-то тесная интеграция приложения с браузероми с их современными, продвинутыми отладчиками, это все интересно. Но в то же время отсутствие простого вывода аля MsgBox/print этопрям как явный звоночек, мессдаж прям, мол - да мы не такие как все, мы с причудами.. Там кстати где пример с дебаггером приводится, "Hello World" выводится на лист текстового редактора.. Странно все это..
Отвлеченно глядя на обшую картину, видно, что серьезный подход такой. Там у них и то и это и третье, десятое. С другой стороны а нафиг офису все эти pdf-просмотрщики, видеоплееры. Этого добра и так хватает, не лучше ли было бы сосредоточиться на самом офисе.. Такие мюсли короче..
Кстати забавная вещь, там команда print вызывает окно выбора пинтера. Да с msgboxom засада. Alert по идее должен быть доступен в режиме отладки. Там отладка с помощью браузера, но я например не смог её включить "с полпинка", и вообще
evgeniygeo написал: в первых трех темах помочь новому участнику научиться соблюдать правила форума
С другой стороны, повторюсь что лично мне это не особо-то и важно, но если бы я рассуждал так как буд-то мне это было бы важно, то я рассуждал бы.. в общем как-то так или не так, в общем все это не очень важно.. ))
bedvit, можно сделать просто в vba получить указатель разименовать, поработать с данными, и отпустить указатель, как буд-то ни чего не был, а менеджер памти Excel пусть делает что хочет. В общем на VBa все это не проблемма, главное знать структуру данных. Структура конечно не очен понятна, со всеми этими юнитами, нельзя ли ее привести к какому-то такому виду?
Код
Private Type tpVariant
vt As Integer
r1 As Integer
r2 As Integer
r3 As Integer
pt As LongPtr
r4 As LongPtr
End Type
bedvit написал: кто будет управлять памятью, когда я вам передам указатель на массив?
Вы передадите указатель мне и отпустите у себя указатель, а я разименую его на safearray-массив структуры типа XLOPER12. Попутно конечно хотелось бы знать эту структуру, на MS почему-то нет по ней информации. Да скорее всего придется в VBA коде сделать освобождение указателя на массив, но это не проблема.
По общей сложности меня мало волнуют все эти вопросы, но все же скажу, на мой взгляд те две блокировки с утра действитльно выглядели не очень уместными. Там вроде человек составил какой-то развернутый вопрос (я не читал).. Я понимаю бывают такие, которые ни бе ни ме, два слова связать не могут.. Получается как бы тупая уровниловка, тех кто вообще не хочет шевелить мозгами со всеми остальными..
bedvit, а вы не могли бы добавить опцию, чтобы передавать/получать данные непосредственно по указателю массива типа XLOPER12?? (речь о передаваче указателя как целочисленного знчения)
bedvit написал: Собственно это основной тип (структура) данных. Для VBA, Excel трансформирует XLOPER12 в Variant и наоборот
Ну тут понятно, там где какое-нибуь трансформирование, наверняка тупое копирование, а в вашем классе это наверное релизовано как-то поумней. Такой вопрос, а нельзя ли передать в vba указатель непосредственно на массивы данных в ячеек, чтоб непосредстенно из vba можно было работать с этими данными?
Виталий, добрый день! По моему что-то интересное и своевременное. В то время как в соседней теме постановили, что "Эксель себя исчерпал". Это конечно все шутки. Вы как я понимаю сделали быструю выгрузку налист, как раз то чего не хватает. Не моглибы просветить темный народ, что значит тип LPXLOPER12. LP вроде понятно - указатель, а XLOPER12 это что-то вроде бейсикового Variant?
Касаемо затронутой темы, можно еще привести пример (без примера, на словах )). Допустим константы, по логике программы лучше их использовть там где они уместны. Но в VB есть небольшой нюанс.. Когда константа передается в другую процедуру, она перестает быть константой. Если быть точнее она копируется в другую переменную, которая уже может быть изменена внутри вызываемой процедуры. Если сравнить, передачу обычной переменной по ссылке с передачей константы, то во втором случае добавляются дополнительные издержки на копирование. В случае со длинными строками это должно быть особенно заметно..
Так если подумать, возможных сокращений не так и много, кроме упоянутых If, For.. Но если взглянуть на вопрос немного иначе, точнее это будет уже другой вопрос, например - как работает невидимая автоматика языка - то таком ракурсе можно было бы выделить не мало нюансов. Вот, допустим, такая конструкция в vb* работает не очень правильно
Код
If условие1 OR условие2 Then
При выполении данной строчки кода будет проверено услвие1 и условие2 даже если условие1 верное, хотя фактически было бы достаточно выполнения условия1 чтобы войти в блок. И в таком случае технически более правильно будет работать Select Case, хотя это будет длинее и менее читаемо..
Код
Select Case True
Case условие1, условие2
***
End Select
Выскажусь в пользу сокращений. Имхо, сама концепция-то сокращений правильная, как способ освобождения кода от всяческой избыточности и улучшения читабельности и т.д. Однако в объектной модели или может быть даже в автоматике самого языка не все так гладко устроено, в рез. чего приходится отказываться от некоторых приемов. В добавок если еще добавить случаи мертвых библиотечных ссылок в референсах, там вообще всякая чихорда начинает твориться, но, полагаю, их веротность нельзя принимать за норму. И вот, допустим, если представить код с обильным использованием коллекций или словарей и указанием в каждом случае метода item, наверное это будет грязно. Вот я, в частности, когда только осваивал словари, когда узнал о кратком обращение (без .item) прям удивился, насколько код станоится приятней и читабельней. В этом наверное и есть одна из лучших частей ООП.
написал: Вопрос: какие свойства , методы, конструкции операторов приняты в VBA по умолчанию?
На VBA можно добавить в метод(property или функцию) класса специальный атрибут, который делает его умолчательным. Причем атрибут можно добавить в парное свойство (Property Get/Let) и это будет работать практичеки как "Cell.Value" в обе стороны.
Код
Option Explicit
Private Prop1
Public Property Let Metod1(InValue)
Attribute Item.VB_UserMemId = 0
Prop1 = InValue
End Property
Public Property Get Metod1()
Attribute Item.VB_UserMemId = 0
Metod1 = Prop1
End Property
Но есть один нюанс, чтобы атрибут начал рабоать, после его прописывания нужно класс экспортировать, и вновь импортировать. Есть и более быстрый способ - скопировать класс перетаскиванием в другую открытую книгу, удалить в текущей, и вновь скопировать его из другой книги в текущую с уже "включенными" атрибутами.