Создание справочной системы

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Уважаемые коллеги, добрый день!
Предлагаю обсудить такую интетесную тему, как создание собственной справочной системы для своих проектов. Очень подробно это написано у Уокенбаха, но перепробовав разные варианты, пришёл к мнению, что удобнее всего создать скомпилированный файл справки .chm и открывать его кодом:

Код: Выделить всё

Sub ShowHelp()
    Application.Help ThisWorkbook.Path & "\Help.chm", 0
End Sub
Одна проблема: файл может у пользователя и потеряться.

Вопрос №1: Как можно в VBA просто проверить файл на наличие.

Вопрос №2: Можно ли сделать корректную справку путём внедрения в лист OLE-объекта ( chm - файла) и открывать её по запросу макросом?
Попробовал так сделать, путём записи макроса, записалось следующее:

Код: Выделить всё

Sub Макрос1()
    ActiveSheet.Shapes("Object 1").Select
    Selection.Verb Verb:=xlPrimary
End Sub
Но во-первых, открытая справка отображается некорректно (листы пустые);
во вторых, система безопасности Excel ругается на возможные вирусы в файле и метод "Application.DisplayAlerts = False" не работает (выдаёт ошибку 1004: "Метод Verb из класса OLEObject завершён неверно").
Можно ли решить эти проблемы?
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Вопрос №1:

Код: Выделить всё

 
if Len(Dir(ThisWorkbook.Path & "\Help.chm")) > 0 then 
'файл присутствует           
end if
Вопрос №2:
IMHO не нужно этого делать.
Если xls файл не модифицируется или код отделён от данных - самое простое сделать isо, cодержащий все не изменяемые файлы проекта и монтировать его чем нибудь типа Daemon Tools :)
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

2)
Поддерживаю. Не надо так делать.
Но можно еще проще. При установке CHM класть в "%SystemRoot%\Help". И нукуда уже файл оттуда не потеряется. Кроме того путь к файлу в этом случае указывать не надо. Windows всегда найдет правильно расположенный chm просто по имени.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Но можно еще проще. При установке CHM класть в "%SystemRoot%\Help"
Cогласен. Просто меня клиенты уже затерроризировали требованием мобильности и портативности до уровня рефлекса ;)
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Спасибо Вам большое за помощь! Просто и изящно.
Жаль, конечно, что вариант с OLE не проходит. Такая казалось бы потенциально полезная функция и такая практически бесполезная. Вот уж действительно - работа с Excel - поиск оптимальных компромиссов.
А как проверить наличие файла "Help.chm" в "%SystemRoot%\Help" ?
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Hint:

Код: Выделить всё

'на уровне модуля
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
  "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
'.........................................
Public Function GetHelpDir() As String
    
    Dim sBuf As String * 256
    Dim l As Long
    
    l = GetSystemDirectory(sBuf, Len(sBuf))
    GetHelpDir = Replace(Trim$(Left$(sBuf, l)), "\system32", "\Help", , vbTextCompare)
    
End Function
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Aent, спасибо ещё раз, всё работает.
Может, посоветуете, где можно почитать (на русском языке) по программированию Win API из VBA, а то для меня это тёмный лес.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Начните с лекции Биллига:
http://citforum.univ.kiev.ua/programming/vb/vba_winapi/
За маааленькую денюжку
https://www.softkey.ru/catalog/program. ... gdesc=long
можно приобрести русский хелп
(демка http://megalib.com/books/922/index.html)
А вообще есть фундаментальная книга Дэна Эпплмана "Win32 API и Visual Basic для профессионалов"
(качать например отсюда http://www.brain2life.com/book/628.html)
Разница в применении API в VB6 и в VBA минимальна. Главыпро использование API есть практически во всех продвинутых руководствах по VBA .Например, посмотрите
ИзображениеПрограммирование на Visual Basic 6 и VBA. Руководство разработчика [LEFT]Кен Гетц, Майк Гилберт[/LEFT]
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Спасибо, думаю это будет полезно не только мне. К описанному выше могу добавить также найденное мною: http://www.microsoft.com/Rus/Msdn/Activ ... fault.mspx (не ругайте за источник, на первый взгляд, довольно содержательно).
Ответить