Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 65 След.
GUI в XLL, Рассмотрим возможные варианты
 
СОМ-модель Excel позволяет программно добавить 5 элементов управления:
1.msoControlButton
2.msoControlEdit
3.msoControlDropdown (выбор только из списка)
4.msoControlComboBox (список и возможность вписать свои данные)
5.msoControlPopup

В реализации выглядит так.

Матчасть:
MsoControlType enumeration (Office) (типы элементов управления )
CommandBarButton members (Office)(методы и свойства элементов управления )
Изменено: bedvit - 30 ноя 2020 18:46:39
«Бритва Оккама» или «Принцип Калашникова»?
GUI в XLL, Рассмотрим возможные варианты
 
Итак продолжу по теме.
Глава: ФОРМЫ в XLL(Excel)
Скрытый текст

Немного обобщая пройденное:
Итак в первом топике я указал 3 варианта взаимодействия xll  с пользователем.
Excel C++ API - отлично работает для UDF/самописных функций, работающих со скоростью родных функций Excel (см. пример: функции в категорий XLL)
С++ +  использование СОМ-модели Excel подходит для создание меню (со значками), работы с с книгой/листом/ячейками/форматированием/данными (см. пример: команды на вкладку "ADD-IN", транспонирования массива-команда "XLL Transpose")
С++ + управляемый код +  использование СОМ-модели Excel. Вот здесь и подходим к теме текущей главы. Формы, прекрасно создаются вторым способом. НО что бы ими пользоваться, нужен управляемый код - VBA.
Вчера этот способ реализовал. И уже хотел поделится.
Было сделано красиво: создал формы, код на VBA в нужных модулях (все кодом С++), с запуском нужных команд из XLL.
НО, было обнаружено, что если отключена галка "Доверять доступ к объектной модели проектов VBA" - код не работает.
По первой, хотел с этой проблемой справится через реестр или другими методами, потом понял, что некрасиво это как-то выходит.
А хочется красиво сделать.
В итоге был реализован 4й способ, самый трудоемкий и самый эффективный - С++  + использование СОМ-модели Excel + WIN API
В итоге я не завишу от настроек безопасности (кроме первоначального запуска) и могу сделать любую форму (с анимацией и блекджеком), ограничиваясь лишь моим временем на реализацию свистелок и пер нужных элементов. Можно даже мою игруху LIFE туда поместить :)
Сейчас набросал самую простую.
(см. пример: команды на вкладку "ADD-IN", команда "XLL Form")
Изменено: bedvit - 27 ноя 2020 13:42:40
«Бритва Оккама» или «Принцип Калашникова»?
GUI в XLL, Рассмотрим возможные варианты
 
buchlotnik, спасибо за тест, Jack Famous, Алексей, четко разложил :)
Добавил транспонирование, по второму способу взаимодействия пользователя/dll/Excel, т.е. через СОМ-интерфейс Excel (есть вариант через Excel C API, но пока или не оптимизирован или я не пойму почему он даже медленнее второго варианта.)
Что могу сказать по второму варианту, штатную не обгоняю, т.е. СОМ - медленный, и сама операция транспонирования миллисекунды, а вывод через СОМ на порядки больше.
Зато могу транспонировать на месте, штатная так не позволяет (если стороны диапазона разного размера).
Залил туда же.
«Бритва Оккама» или «Принцип Калашникова»?
GUI в XLL, Рассмотрим возможные варианты
 
Много "bedvit-ов", привел в соответствие с общей стратегией (с названиями категорий для функций XLL). Поменьше саморекламы :)
Мне кажется, так лучше
«Бритва Оккама» или «Принцип Калашникова»?
GUI в XLL, Рассмотрим возможные варианты
 
Добавил значки в меню
У всех работает меню (начиная с версии Excel 2010)?
У меня работает справка, транспонирование пока просто вставка данных на лист, форма создается, но пока не выводится (можно посмотреть в VBA-проекте активной книги)
Надстройка по той же ссылке.
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Сергей Жуков, если почитаете внимательно, то увидите моё решение, где ничего не надо делать вручную. Решение под вашу задачу, если у вас и ваших коллег Excel 2010 или современнее (или смотрите в сторону решения Дмитрия)
Изменено: bedvit - 23 ноя 2020 09:27:25
«Бритва Оккама» или «Принцип Калашникова»?
GUI в XLL, Рассмотрим возможные варианты
 
buchlotnik, стандартными Excel C API - нет (я не нашел), если не говорить о "InputBox"
Используя 2й вариант (через СОМ-интерфейс) можно попробовать сделать, у меня получается создать форму, далее не могу достучатся до тех свойств, которые в VBA нормально отрабатывают.
Нужна полная объектная модель Excel. В обозревателе объектов не все уровни отражаются. Кто-то может поделится инфой?
Уже скачал OLE/COM Object Viewer, но толку пока мало.
Дмитрий(The_Prist) Щербаков, похоже оба, т.к. в win api, для MessageBox я в дескрипторе окна владельца создаваемого окна указываю дескриптор главного окна Excel. Сейчас протестировал, поменял оформление в WIN7 на aero-интерфейс, окошко тоже в этом стиле. Если протестируете на win10 буду благодарен.
Оставил win-версию. Больше возможностей в настройках.
Изменено: bedvit - 20 ноя 2020 17:28:56
«Бритва Оккама» или «Принцип Калашникова»?
GUI в XLL, Рассмотрим возможные варианты
 
Наконец добрался до возможности взаимодействия xll с пользователем посредством графического интерфейса.
И здесь, к сожалению вариантов мало и все они мало где освещены.
Информацию по биту доставал.
C VBA все отлично, там элементарно делается Ribbon на XML и вперед.
в xll на С++ так не сделать.
Рассматривал такие варианты:
1. Программное создание меню через Excel C++ API (добавляются команды на вкладку "ADD-IN")
2. Создание на чистом С++ COМ-интерфейса и использование СОМ-модели Excel для создания панели (программно). Похож на первый вариант, но можно добавлять иконки.
3. Создание Ribbon XML через управляемый код и интегрировать это все в xll (собственно это и есть Ribbon как в VBA, но прослойка из управляемого кода еще тот торт)

Начал с первого варианта.
Версия v1.0.3.3beta
Какое окошко вам больше нравится?
WIN API, с диалогом перехода на сайт
Или Excel API, со справкой (перехода на сайт)
Также будет транспонирование массива на месте, пока только вывод тестовых данных сделал.

Если есть инфо по теме, буду рад изучить.

Что использовал:
Раз
Два
Три
Изменено: bedvit - 19 ноя 2020 19:14:54
«Бритва Оккама» или «Принцип Калашникова»?
Пересохранение файла Excel без формул, Как сохранить целый файл без формул если внутри много вложений.
 
У нас вообще бекап рабочих файлов/папок хранится на серваке, в довольно широких временных рамках. Такой трюк не сработает, только ТС попотеет и свое время потратит. Зачем это все. Обычно поддержка проекта важнее содержания. Возможно вас пригласят обратно или попросят что-то пояснить или доработать в моделях за бонус какой либо, а вы все в значениях сохранили.
Изменено: bedvit - 19 ноя 2020 09:35:41
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Ради объективности все же отмечу, что данная задача не связана напрямую с профильными расчетами ТС. Возможно свой функционал специалист ведет со знанием, а на всякие свистелки и пер.. удобства не связанные со специализацией забивает сильно не вникает по причини не критичности (самолет не упадет, и дом стоять будет). Хотя нам, как помогающим, всегда желателен ТС-профи и в Excel, VBA
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
.Без него Ваш код просто изменит масштаб и не вернет прежний. Об этом речь. Или я чего-то не увидел, что это опровергает?
Все верно, но я не работал в версии Excel, где нет AfterSave. Такой возможности не исключаю, но как по мне это редкость.
Цитата
Дмитрий(The_Prist) Щербаков написал:
так задумано, ибо после последнего сохранения были внесены еще изменения, а файл не был сохранен. А в этом случае у меня ЗАВЕДОМО не меняется масштаб.
Ясно, всегда сохраняем масштаб 150% а далее, в одном случае меняем на 100%, а в другом под шкаф кладем (оставляем 150%)? Ну если так задумано, то ОК. :) Может ТС так и нужно. Я подумал, что нужно всегда 100%, так и сделал.
Разобрались и предложили ТС два варианта, пусть выбирает. Ну и научится немного разбиратся в своих макросах ему пожелаю, потому как _Igor_61, правильно отметил, что не зная, можно много чего нагородить.
Изменено: bedvit - 13 ноя 2020 16:27:12
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Дмитрий, я когда пишу обычно тестирую код.
Ваш тестировал тоже, а вы мой?
Цитата
Дмитрий(The_Prist) Щербаков написал:
И что получим? Сохранили файл - изменился масштаб на 100%. Надо опять выставлять на 150%, чтобы удобно продолжать работать.
посмотрите мой код внимательнее, там ничего не надо делать вручную. Перед сохранение выставляется 100%, после сохранения, тот который был раньше (150%)
Цитата
Дмитрий(The_Prist) Щербаков написал:
Я написал, почему у меня не сохраняется. Потому что я считаю неправильным сохранять книгу, если нажато было не сохранять.
Дмитрий, ну почитайте внимательнее, я об этом же тоже пишу.
Цитата
Дмитрий(The_Prist) Щербаков написал:
Если сначала сохранить книгу, а потом без изменений закрыть - то мой код выставит 100%
пробовал - выставляет 150%, поэтому и написал. Протестируйте сами.
Цитата
Дмитрий(The_Prist) Щербаков написал:
За это отвечает блок:
этот блок запускается только при ЗАКРЫТИИ книга, а не при СОХРАНЕНИИ, поэтому IsClose = False и сохраняется книга со 150%, а потом закрывается без сохранения и остается 150%

Что делаю по шагам:
1. Открываю файл
2. Вставляю ваш код
Скрытый текст

3. Выставляю масштаб 150%
4. Сохраняю файл
5. Печатаю текст в любой ячейке
6. Закрываю файл без сохранения
7. Открываю файл - масштаб 150% а должно быть 100%

Что делаю не так?
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
А как должно-то быть?  
должно быть при сохранении, при закрытии книги масштаб не меняется.
Цитата
Дмитрий(The_Prist) Щербаков написал:
надо только перед закрытием.
перед закрытием может книга не сохранятся.
Цитата
Дмитрий(The_Prist) Щербаков написал:
Если нажали "Не сохранять" - то зачем менять масштаб?
он УЖЕ сохранился, при первом сохранении.
Цитата
Дмитрий(The_Prist) Щербаков написал:
сохраняя все равно все изменения, но зато и масштаб выставляя. Молодцы какие  Что по мне - это не правильно.
здесь не понял вашу мысль. Я как раз и говорю, при закрытии книги он не захочет сохранять данные, и останется масштаб от первого сохранения, когда он нажал просто сохранить, а не закрыть книгу.

Цитата
Дмитрий(The_Prist) Щербаков написал:
у Вас своя позиция, у меня своя.
позиция здесь не причем, я говорю что при вашем коде, пользователь откроет книгу с масштабом 150%
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
например, в Excel 2010...Если мне не изменяет память, то событие Workbook_AfterSave появилось начиная с 2016, но не раньше.
есть и в 2010
Цитата
Дмитрий(The_Prist) Щербаков написал:
почему?
потому, что IsClose = True только при закрытии книги. Я сохраняю книгу IsClose не срабатываеш, масштаб не равен 100%, далее закрываю книгу и на вопрос сохранить ли, говорю нет. И книга остается с предыдущем сохранением и с масштабом не равным 100%. Выходит условия задачи не выполняются.
Цитата
Дмитрий(The_Prist) Щербаков написал:
надо не копировать строку Option Explicit.
Это верно. Она нужна в одном экземпляре.
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Дмитрий, если используя ваш код, сохранить файл, а потом выйти без сохранения, сохранится ли 100% масштаба? По-моему IsClose не даст сохранить.
Цитата
Дмитрий(The_Prist) Щербаков написал:
AfterSave есть далеко не у всех
а где его нет?
Цитата
Дмитрий(The_Prist) Щербаков написал:
Мой код можете просто вставить после строки:
мой так же.
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
будет сохранено именно перед закрытием
Дмитрий, похоже, что так не сработает. У вас не сохраняется 100% формат, а сохранять надо.
А вот так точно работает
Код
Option Explicit
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Dim meProp As CustomProperty
    For Each meProp In ThisWorkbook.Worksheets(1).CustomProperties
        If meProp.Name = "Zoom_Save" Then ThisWorkbook.Windows(1).Zoom = meProp: meProp.Delete
    Next
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ThisWorkbook.Worksheets(1).CustomProperties.Add "Zoom_Save", ThisWorkbook.Windows(1).Zoom
    ThisWorkbook.Windows(1).Zoom = 100
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
Можно еще и так, 100% масштаба для активного окна (листа) в документе.
В документе может быть несколько листов. Если нужно все листы по 100% масштаба, нужно пройтись по ним циклом.
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ThisWorkbook.Windows(1).Zoom = 100
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
В модуль книги ("ЭтаКнига")
Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ThisWorkbook.Activate
ActiveWindow.Zoom = 100
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
Как вернуть при сохранении к 100% масштаб отображения?
 
ActiveWindow.Zoom = 100
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Или более универсально, получаем масштаб и далее используем по своему усмотрению.
К примеру, если хотим задать, а не получить ширину столбца в пикселях Excel.

Код
Sub ActiveCellColumnWidthPixelExcel()
Dim scale_
   scale_ = GetScaleColumnWidth(ActiveCell)
   Debug.Print ActiveCell.ColumnWidth * scale_(1) + scale_(2)
   '(ширина столбца в пикселях Excel) =  (ширина в символах) * (пикселей на символ) + (поле ячейки в пикселях). 
End Sub

Function GetScaleColumnWidth(r As Range) As Double()
    Dim Result(1 To 2) As Double
    Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
    Dim ws As Worksheet
    
    Set ws = r.Parent.Parent.Worksheets.Add
    x1 = CDbl(1) 'characters
    x2 = CDbl(255) 'characters
    ws.Columns(1).ColumnWidth = x1
    y1 = ws.Columns(1).Width 'points
    ws.Columns(1).ColumnWidth = x2
    y2 = ws.Columns(1).Width 'points
    ws.Delete
    Result(1) = (y2 - y1) / (x2 - x1) 'points per character
    Result(2) = y1 - x1 * Result(1) 'points
    GetScaleColumnWidth = Result

End Function
Изменено: bedvit - 11 ноя 2020 18:01:01
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Владимир, спасибо, вспомнил былое :)
Вот накидал функцию (на основании данных по ссылке), для нужной ячейки определяет ширину столбца в пикселях Excel (помним про обычный пиксель и 0.75!)
Можно и сразу было перевести в обычные пиксели, но так удобнее, т.к. высота строки тоже в пикселях Excel, т.е. сопоставимые показатели.

Тестируйте...
Код
Sub ActiveCellColumnWidthPixelExcel()
    Debug.Print ColumnWidthPixelExcel(ActiveCell)
End Sub

Function ColumnWidthPixelExcel(r As Range) As Double
    Dim Result(1 To 2) As Double
    Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
    Dim ws As Worksheet
    
    Set ws = r.Parent.Parent.Worksheets.Add
    x1 = CDbl(1) 'characters
    x2 = CDbl(255) 'characters
    ws.Columns(1).ColumnWidth = x1
    y1 = ws.Columns(1).Width 'points
    ws.Columns(1).ColumnWidth = x2
    y2 = ws.Columns(1).Width 'points
    ws.Delete
    Result(1) = (y2 - y1) / (x2 - x1) 'points per character
    Result(2) = y1 - x1 * Result(1) 'points
    ColumnWidthPixelExcel = (r(1).ColumnWidth * Result(1) + Result(2))

End Function
Изменено: bedvit - 11 ноя 2020 17:34:09
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Владимир, каким образом? для каждого шрифта и размера не вариант прописывать. Нужно что-то другое.
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
sokol92, Владимир, спасибо, помогло.
Т.е. стиль "обычный" прописан в заголовках табличной части? (добавлю инфу в вывод)
Т.е. по теме ответ найден. Коллеги, благодарю.
По своей задаче, не правильным будет подход - менять стили в пользовательских файлах, видимо буду какие то костыли городить через переменную ActiveWorkbook.Styles("Normal").Font.Size, и масштабировать в зависимости от нее ширину столбца.
Не нравится мне все это...
...Как и подозревал, кроме размера шрифта влияет и сам шрифт на пункты ширины столбца, костыль не выдержит таких мучений.
Изменено: bedvit - 11 ноя 2020 15:27:06
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
и кто их создает
я и сам не знаю. В компании сотрудники ваяют. Мой древний макрос по загрузке фото прислали (пришлось переделать некоторые моменты под win10, пошел по вашему пути)
Цитата
Дмитрий(The_Prist) Щербаков написал:
и при желании исправить
исправить, как я понял, как раз и не получится.

Итак обобщая:
Ширина ячеек (столбцов) измеряется в количестве символов стандартного размера, причем этот "стандарнтный размер" зависит от размера шрифта установленного в разделе при создании новых книг. Другими словами для разных книг этот размер будет разный визуально и в количестве пикселей, хоть и написано и там и там = 8,43 (ширина столбца по умолчанию в новой книге). т.е. показатель "ширина столбца" не валидный в случаях обработки разных файлов для определения размера в пикселях, так местечковая (локальная) переменная. Здесь нужно обыграть как-то этот момент для своей задачи.

Высота ячеек (строк) измеряется в пунктах. Они всегда одинаковы для разных файлов, т.е высота строки = 15 пунктов будет во всех файлах - одинаковой. На практике по замерам 1п высоты = 1 пиксель * 0,75, т.е. 10 пикселей = 7,5 пунктов высоты

Вывод 2: задать ширину столбца в пикселях, т.е. одинаковую для любого файла Excel через ширину столбца - нельзя (танцы с бубнами и с реестром не рассматриваю)
Изменено: bedvit - 11 ноя 2020 15:03:37
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Зайдём с другой стороны:) (про размер шрифта в заголовках я видел и вас понял, но это следствие?!). Мне нужна причина, что бы поправить. Моя задача сделать столбцы одинаковой ширины и визуально и по задаваемому размеру. Это можно сделать?
Скрытый текст
Изменено: bedvit - 11 ноя 2020 13:44:56
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Дмитрий, я говорю про причину, а вы пишите про следствие.
Как исправить причину этих расхождений?
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Шрифт не везде одинаковый.
Дмитрий, а где разный, в какой ячейке?
Цитата
Дмитрий(The_Prist) Щербаков написал:
Размер заголовков строк и столбцов во 2-м файле явно больше.
это куда посмотреть нужно?
Цитата
Дмитрий(The_Prist) Щербаков написал:
Плюс в файле 2 куча разных скрытых имен.
Удалил, но это никак не повлияло на ширину столбцов.

Что нужно сделать, что бы ширина столбцов стала одинаковая?
Изменено: bedvit - 11 ноя 2020 11:54:56
«Бритва Оккама» или «Принцип Калашникова»?
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Мое почтение, джентльмены.
Визуально разные по ширине столбцы, при одинаковой указанной ширине (14 пунктов) в прилагаемых 2х файлах.
Ширина столбца (14 пунктов), шрифт, масштаб одинаковые.
Что упустил?
«Бритва Оккама» или «Принцип Калашникова»?
Python как замена VBA, Microsoft рассматривает возможность задейсвовать Python в качестве своего скриптового языка
 
Но имейте ввиду
Цитата
"В отличие от разработки макросов на базовом языке в LibreOffice, разработка сценариев Python для LibreOffice требует настройки внешней интегрированной среды разработки (IDE)."
«Бритва Оккама» или «Принцип Калашникова»?
Потеря точности некоторых чисел
 
Вариант с округлением звучит логично, в моей библе так и реализовано, считаю на один знак больше и округляю под заданную точность (вернее так считает MPIR/GMP). Почему Excel не округляет на 15м знаке, не осведомлен, возможно дело в производительности, наличия для этого функций или формата ячеек.
Цитата
Jack Famous написал:
IEEE754 Microsoft сможет победить
для меня не ясен этот момент, стандарт международный, реализован и на аппаратном уровне (в т.ч. в вашем ЦП). Мягкотелые на него не влияют. Возможно вопрос в округлении в ячейках Excel, тогда да, согласен, это было бы логично.
Изменено: bedvit - 5 ноя 2020 22:56:50
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 65 След.
Наверх