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
Но есть один нюанс, чтобы атрибут начал рабоать, после его прописывания нужно класс экспортировать, и вновь импортировать. Есть и более быстрый способ - скопировать класс перетаскиванием в другую открытую книгу, удалить в текущей, и вновь скопировать его из другой книги в текущую с уже "включенными" атрибутами.
AlexGor, поищите в нете, есть еще функция на основе htmldoc-а или как там, в общем еще вариант для работы с буфером обмена, довольно простой синтаксически.
Принцип такой, что коллекцияя CommandBars является объектом (com-классом), транслирующим (елси я правильно выразился) события. Чтобы подклюиться к событиям объекта нужно объявить его WithEvents. Кога мы инициализируем объект "cb" то автоматически подключаемся к его событиям. События там генерятся, очевидно, при любом (почти) действии прямо или косвенно связаном с панелями, менюшками, кнопками. При выборе пункта в контекстном меню, также генерится это событие и таким образом можно отловить момент скрытия строки, поскольку перед этим делается клик по пункту "Скрть" в контекстном меню.
Private WithEvents cb As CommandBars, cbOn As Boolean
Private hiddens As Object 'As Dictionary
Private Sub Hiding_Event(Target As Range)
MsgBox "Скрытие диапазона " & Target.Address
End Sub
Private Sub cb_OnUpdate()
Dim sel As Range, addr$
Set sel = Selection
With sel
addr = .Address
If .EntireRow.Hidden Then
1 If Not hiddens.Exists(addr) Then
hiddens.Add addr, Empty
Hiding_Event sel
End If
ElseIf .EntireColumn.Hidden Then GoTo 1
Else
If hiddens.Exists(addr) Then
hiddens.Remove addr
End If
End If
End With
End Sub
Private Sub Workbook_Open()
cbInit
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Not cbOn Then cbInit
End Sub
Sub cbInit()
Set cb = Application.CommandBars
Set hiddens = CreateObject("Scripting.Dictionary")
cbOn = True
End Sub