Новости:

Прикрепить к сообщению можно только файлы xls, gif, jpg, rar, zip,7z, bas, frm, cls, doc размером до 150 Кб.

Главное меню

Из формы исчезает календарик

Автор Poltava, 12.12.2012, 14:48

« назад - далее »

Poltava

Сделал файл, в нем для выбора даты пользователем использую форму с календариком, календарик стандартный из MSCAL.OCX. Тут и появились проблемы при открытии на компьютере где этот компонент офиса не установлен вылетает сообщение "Could not load object because it is not available on this machine" после нажатия на ok файл открывается но календарик из формы исчезает! файл может открываться почти в любой версии офиса на нескольких сотнях компьютеров с различным виндовсом! Отсюдова вопрос как избежать исчезновения календарика!!! Может возможно программно отследить этот момент и избежать его. Может возможно как то проверить наличие этого компонента и если его нет скопировать соответствующий файл в нужную папку? Может есть способы внеднить этот календарик в сам файл экселя?
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Alex_ST

1. При создании кода для широкого распространения лучше использовать только элементы библиотек, входящих в Офис по умолчанию. Поэтому, хоть я сам, например, очень люблю календарь MonthView, но использую его только в кодах "для себя". А для отдачи на сторону приходится использовать любой из написанных народом календарей из стандартных элементов. Например, можно мой JP_Сalendar или Выпадающий календарь от Володи (VovaK) , но если поискать, то их множество самых разных.
2. Если всё-таки использовать календарь из разряда "есть, но не у всех", то надо при загрузке проекта проверять референсы на миссинг. Как это сделать могу посмотреть завтра (у меня основная "копилка" на компе на работе и там это в каком-то из примеров было)
3. Внедрить dll календаря в файл Excel'я вряд ли получится без больших затруднений.
С уважением, Алексей

Poltava

Спасибо за советы! Если вас не затруднит посмотрите в копилке пример пожалуйста
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

kuklp

#3
Внедрить dll календаря в файл Excel'я вряд ли получится Мало того, его недостаточно просто скопировать на комп, его надо еще зарегистрировать в системе.
Здесь обсуждалось:
http://www.planetaexcel.ru/forum.php?thread_id=21026
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Alex_ST

#4
Можно, например, на компе, где всё работает, создать список необходимых ссылок (в примере ещё и их пути выводятся, а из путей можно и имена файлов извлечь)Sub ListVBRefs()
   On Error Resume Next
   Dim oRef As Object '  или As VBIDE.Reference если заранее подключить библиотеку Microsoft Visual Basic for Applications Extensibility 5.3 (раннее связывание)
   For Each oRef In ThisWorkbook.VBProject.References
Debug.Print oRef.Name & Chr(10) & oRef.FullPath
   Next
End Sub

и сравнивать этот список при загрузке файла с тем, что есть на новом компе.

А вот так можно просто проверять ссылки на MISSING:
Sub ListVBRefs_IsBroken()
   On Error Resume Next
   Dim oRef As Object '  или As VBIDE.Reference если заранее подключить библиотеку Microsoft Visual Basic for Applications Extensibility 5.3 (раннее связывание)
   For Each oRef In ThisWorkbook.VBProject.References
Debug.Print oRef.Name & vbTab & IIf(oRef.IsBroken, "MISSING", "OK")
   Next
End Sub


На вскидку нашёл ещё и статейку Удаление битых ссылок на библиотеки методом References.Remove, но там про Access. Хотя, я думаю, в принципах работы со ссылками на библиотеки поковыряться можно и на том примере.
Ещё можно посмотреть статью Missing References In VBA. Там в разделе Resolving Missing References можно что-нибудь ценное выцепить.
С уважением, Алексей

Poltava

Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Alex_ST

К стати, могут быть ещё одни "вилы" - более старая версия .dll или .ocx у пользователя.
Я с этим столкнулся, когда у некоторых из пользователей не работал ListView из MSCOMCTL.OCX, который, хотя и, естественно, у пользователя на компе был, но версия его была старая.
Я тогда до версии файла добирался такой процедурой:
Sub FileVersion()
   Dim sPath$: sPath = "C:\Windows\System32\"
   Dim sFileName$: sFileName = "MSCOMCTL.OCX"
   Dim iNum%, oFolder As Object, oFile As Object
   'Set oFolder = CreateObject("Shell.Application").Namespace(CVar(sPath))
   Set oFolder = CreateObject("Shell.Application").Namespace((sPath))
   Set oFile = oFolder.ParseName(sFileName)
   iNum = 156
Debug.Print oFolder.GetDetailsOf(oFolder.Items, iNum) & " : " & oFolder.GetDetailsOf(oFile, iNum)
   iNum = 271
Debug.Print oFolder.GetDetailsOf(oFolder.Items, iNum) & " : " & oFolder.GetDetailsOf(oFile, iNum)
End Sub


Но по индексу считывать расширенные параметры, как выяснилось, не очень хорошо, т.к. в разных средах он может меняться.
Тогда пришлось слепить такую функцию:Sub testGetFileParam()
Debug.Print GetFileParam("C:\Windows\System32", "MSCOMCTL.OCX", "Версия файла")
Debug.Print GetFileParam("C:\Windows\System32", "MSCOMCTL.OCX", "Версия продукта")
End Sub

Function GetFileParam(sPath$, sFileName$, sParamName)
   Dim oFile, i%
   sPath = IIf(Right(sPath, 1) = "\", sPath, sPath & "\")
   GetFileParam = "Error!"
   With CreateObject("Shell.Application").Namespace(CVar(sPath))
      Set oFile = .ParseName(sFileName)
      For i = 0 To 299
         If .GetDetailsOf(.Items, i) = sParamName Then GetFileParam = .GetDetailsOf(oFile, i): Exit For
      Next i
   End With
End Function
С уважением, Алексей

Poltava

#7
Мда ковырял ковырял и наковырял очередные грабли в виде в виде "Доверять доступ к объектной модели проектов VBA" все что пока удалось найти по этому вопросу сводиться к Добавление элемента формы кодом с последующим сохранениемт может кто сталкивался с этой проблемой и может еще что то посоветовать
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Alex_ST

Poltava,
а может быть всё-таки попробовать версии файлов сравнить на Вашей машине и на той, где не работает?
Или на глючной машине его просто нет и ссылка на библиотеку битая?
С уважением, Алексей

Poltava

Дело в том что машин не менее 30 и у всех разные версии офиса и виндовса потому принял решение вообще избавиться от этого календарика и взять один из ваших! но понадобиться время на исправление кода вот и хотел по быстрому прикрутить ваш код чтоб при проблемах файл вообще не открывался во избежании порчи! Но по быстрому не получилось ): так как для работы вашего кода должна стоять галочка "Доверять доступ к объектной модели проектов VBA" а ее программная установка из статьи по ссылке в прошлом сообщении выглядит для меня пока весьма муторно :-\
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Alex_ST

Цитата: Poltava от 13.12.2012, 20:57... для работы вашего кода должна стоять галочка "Доверять доступ к объектной модели проектов VBA"
Да Вы что? Не должно такого быть. Там же стандартные элементы и никаких обращений с целью изменения к самому проекту VBA нет.
Проверьте у себя: попробуйте снимите "гульку", закройте Excel, а потом откройте его, удостоверьтесь в отсутствии "гульки" и откройте файл с календарём. Всё должно и так работать.
С уважением, Алексей

Poltava

ЦитироватьТам же стандартные элементы
Я имел в виду не календарь, а ваш код для проверки ссылок на MISSING:
Не пытайтесь спорить с дебилом. Иначе вы опуститесь до его уровня. Где он задавит вас своим опытом.

Alex_ST

Цитата: Poltava от 13.12.2012, 22:54
Я имел в виду ... код для проверки ссылок на MISSING
А... Ну, таки-да! Он без разрешений в ThisWorkbook.VBProject залезть не сможет.
С уважением, Алексей