Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как преодолеть зависимость проги от версии MS Office?

478
10 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Написал "клиентскую" прогу, кот. берет необх. данные из БД, формирует отчет и выкидывает его в Excel...
...все, что она делает в Ёкселе - это формирует сводную таблицу и сводную диаграмму...
...как сделать чтобы эта прога не зависела от версии Офиса???
...я её делал на машине с Office XP в VB6.

Заранее спасибо.
266
10 декабря 2003 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll
Написал "клиентскую" прогу, кот. берет необх. данные из БД, формирует отчет и выкидывает его в Excel...
...все, что она делает в Ёкселе - это формирует сводную таблицу и сводную диаграмму...
...как сделать чтобы эта прога не зависела от версии Офиса???
...я её делал на машине с Office XP в VB6.

Заранее спасибо.


А в чём, конкретно, проявляется зависимость?
С XP я не работал ещё. По поводу отличий 97 от 2000 могу сказать, что единственное серьёзное отличие, которое знаю (уверен, их больше, но я знаю только это), заключается в невозможности создания массивов контролов на пользовательской форме в 2000. а так, если используешь те же процедуры, свойства и методы, которые описаны в 2000 и в 97 офисах, думаю. проблем не будет.

258
10 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
Написал "клиентскую" прогу, кот. берет необх. данные из БД, формирует отчет и выкидывает его в Excel...
...все, что она делает в Ёкселе - это формирует сводную таблицу и сводную диаграмму...
...как сделать чтобы эта прога не зависела от версии Офиса???
...я её делал на машине с Office XP в VB6.

Заранее спасибо.



Нууу, это слишком расплывчато...

В какой именно части не зависела, из-за чего у твоего клиента проблемы?

Если ты спрашиваешь чисто гипотетически, какие возможно траблы, то мне видятся следующие аспекты:
1. Неиспользовать методы и свойства объектов, которы[ в предыдущих версиях Office не было.
2. Ссылки на библиотеки - версия меняется и при переносе проекта он начинает ругаться, что не так таких библиотек, их конечно же нет, но есть другие, всего лишь номером по ниже.
В Access есть возможность получения доступ к коллекции ссылок на библиотеки и проверить их (не смотрел их в Excel и Word). Правда если нехватает одной из основных библилотек, то все равно будет ругаться...

478
10 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Дело, я так думаю, именно в подключенных библиотеках...
...у библиотек, кот. юзает моя прога, индекс - 10.0, ну т.е. XP значит...
...у 2000-го офиса - 9.0...
на машинах с XP прога работает нормально, а если 2000-й (других на фирме Офисов слава Богу нету!) - вылетает как раз при открытии Excel-я...
478
10 декабря 2003 года
XtreamAll
279 / / 01.10.2003
вот кусок кода, при выполнении которого все рушится (на машинах с MS Office 2000):

If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")
Else
Set runXL = CreateObject("Excel.Application")
End If
478
10 декабря 2003 года
XtreamAll
279 / / 01.10.2003
...ну в крайнем случае здесь:

If Not wb Is Nothing Then
Set GetWorkBook = wb
Else
Set wb = XL.Workbooks.Add
Set GetWorkBook = wb
End If

...дальше точно не идет!
266
10 декабря 2003 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll
вот кусок кода, при выполнении которого все рушится (на машинах с MS Office 2000):

If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")
Else
Set runXL = CreateObject("Excel.Application")
End If


Насколько я знаю, в 2000 у объекта Application нет свойства Ready:( Попробуй без него. Кроме того, вызывает вопрос запись: GetObject(, "Excel.Application")

478
10 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Public Function runXL() As Object

If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")
ElseIf Not Application.Ready Then
Set runXL = CreateObject("Excel.Application")
End If

End Function

Эта фишка проверяет, запущен ли Ёксель...
...если запущен, то берёт его, если же нет, то запускает...

Может коряво, но работает...
...кстати, если есть лучшие варианты - буду благодарен...
за Ready - пасибо! Учту...
258
10 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
Public Function runXL() As Object

If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")
ElseIf Not Application.Ready Then
Set runXL = CreateObject("Excel.Application")
End If

End Function

Эта фишка проверяет, запущен ли Ёксель...
...если запущен, то берёт его, если же нет, то запускает...

Может коряво, но работает...
...кстати, если есть лучшие варианты - буду благодарен...
за Ready - пасибо! Учту...



Слушай, а как он у тебя работает, если Excel не загружен, то GetObject должен вернуть ошибку времени выполнения?

Я бы написал так:

 
Код:
On Error resume next
  Err.clear
  Set runXL = GetObject(, "Excel.Application")
  If Err.Number<>0 Then
     Set runXL = GetObject("", "Excel.Application") ' тоже самое что и CreateObject в таком случае
  End If
  On Error GoTo 0
478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")

Я проверяю запущен Excel или нет...
...и если запущен, то:
Set runXL = GetObject(, "Excel.Application")
...а если нет, то:
Set runXL = CreateObject("Excel.Application")

...но, как заметил г-н mhaturov, в Excel 2000 у Application нет свойства Ready...
...поэтому если кто то знает как еще можно проверить запущен Excel или нет - подскажите плз.!!!
266
11 декабря 2003 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll
If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")

Я проверяю запущен Excel или нет...
...и если запущен, то:
Set runXL = GetObject(, "Excel.Application")
...а если нет, то:
Set runXL = CreateObject("Excel.Application")

...но, как заметил г-н mhaturov, в Excel 2000 у Application нет свойства Ready...
...поэтому если кто то знает как еще можно проверить запущен Excel или нет - подскажите плз.!!!


Ну, во-первых, никакой я не господин, а просто Макс:) , ну а во-вторых, можно уточнить, откуда запускается код модуля, из Excell или Acess? В принципе можно, теоретически, проверять так:
Dim Exl as New Excell.что-то там такое
...Определние Exl
If Not (Exl Is Nothing) Then
тыры-пыры
ELSE
другие тыры-пыры
END IF

258
11 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Не мучайся, все обычно проверяют загружен или нет через метод GetObject - если возвращает ошибку, значит не загружен, во всех примерах microsoft'a они также делают

Вот на счет ссылок, тут вопрос конечно интересный. Я тут вытащил из MSDN для примера несколько удобных функций по программному добавлению, удалению, проверки ссылок проекта. Идеалогия такая, ты должен после запуска твоего главного макроса из проекта (можно и на загрузку проекта поставить) проверить какие из ссылок проекта не битые. Потом ищем доступные на компе файлы библиотек и найдя их программно добавляем в проект ссылку на эту библиотеку.

Чтобы рулить ссылками проекта (и все остальной программной ботвой проекта) необходимо установить в своем проекте ссылку на библиотеку - Microsoft Visual Basic for Application Extensibility 5.3
Это самый тонкий момент во всем этом деле. Библиотека эта в последних версиях не меняла своего названия, и есть у меня смутное подозрение, что microsoft оставит ее даже в новом офисе для совместимости ничего не меняя в ней, иначе получается жопа: есть методы по проверки подключенных библиотек, но дли них тоже нужна своя библиотека, наличие которой тоже нужно проверить установить - полный бред вообщем...

Код:
Adding and Deleting References Programmatically

The Visual Basic Editor References collection contains one Reference object per selected reference (Tools menu, References command) in a given project. You access the References collection by using the VBProject object's References property. I've created a reusable function that adds a reference to a project. The calling function need only provide the project name along with the full path to the reference, as follows:

Public Function AddReference(ByVal ProjectName As String, _
        ByVal ReferencePath As String) As Boolean

    ' Purpose: Adds a reference to the target project in the VBE.
    ' Accepts:
    '   ProjectName: Target project name.
    '   ReferencePath: Full path to the target reference.
    ' Returns:
    '   True if the reference was successfully added.
   
    Dim oVBE As VBIDE.VBE
    Dim oVP As VBIDE.VBProject
    Dim oRefs As VBIDE.References
    Dim oRef As VBIDE.Reference
    Dim bRefSet As Boolean
   
    On Error GoTo AddReference_Err
   
    Set oVBE = Application.VBE
    Set oRefs = oVBE.VBProjects(ProjectName).References
   
    bRefSet = False
   
    For Each oRef In oRefs
        ' Can't add reference more than once.
        If oRef.FullPath = ReferencePath Then
            bRefSet = True
        End If
    Next oRef
   
    If bRefSet = False Then
        oRefs.AddFromFile ReferencePath
    End If
   
AddReference_End:
    AddReference = True
    Exit Function
   
AddReference_Err:
    MsgBox "Error " & Err.Number & " in AddReference: " & Err.Description
    AddReference = False
       
End Function

Because you can't add a particular reference more than once, I needed to set and check a Boolean value in the preceding code that adds the reference only if it hasn't already been added.

You can call the AddReference function with code similar to the following:

Public Sub TestAddReference()

    ' Purpose: Tests the AddReference function.
   
    Const REF_PATH As String = "C:\WINDOWS\System32\scrrun.dll"
   
    ' Add a reference to the Microsoft Scripting Runtime.
    If AddReference("Normal", REF_PATH) = True Then
        MsgBox "Reference to '" & REF_PATH & "' has been added!"
    Else
        MsgBox "Reference to '" & REF_PATH & "' could not be added!"
    End If
   
End Sub

The preceding code added a reference to the Microsoft Scripting Runtime located at C:\WINDOWS\System32\scrrun.dll. The reference was added to the Normal project.
Note   In the preceding sample code and the TestDeleteReference procedure later in this article, the path to scrrun.dll may be different on your computer. Also, the first argument to the AddReference and DeleteReference procedure call may need to be changed to something other than Normal (for example, Microsoft Access doesn't include a default Normal project).

Similarly, I've created a reusable function that deletes a reference, which looks almost identical to the AddReference function, as follows:

Public Function DeleteReference(ByVal ProjectName As String, _
        ByVal ReferencePath As String) As Boolean

    ' Purpose: Deletes a reference from the target project in the VBE.
    ' Accepts:
    '   ProjectName: Target project name.
    '   ReferencePath: Full path to the target reference.
    ' Returns:
    '   True if the reference was successfully deleted.
   
    Dim oVBE As VBIDE.VBE
    Dim oVP As VBIDE.VBProject
    Dim oRefs As VBIDE.References
    Dim oRef As VBIDE.Reference
   
    On Error GoTo DeleteReference_Err
       
    Set oVBE = Application.VBE
    Set oRefs = oVBE.VBProjects(ProjectName).References
   
    For Each oRef In oRefs
        If oRef.FullPath = ReferencePath Then
            oRefs.Remove oRef
        End If
    Next oRef
   
DeleteReference_End:
    DeleteReference = True
    Exit Function
   
DeleteReference_Err:
    MsgBox "Error " & Err.Number & " in DeleteReference: " & Err.Description
    DeleteReference = False
   
End Function

You can call the DeleteReference function with code similar to the following:

Public Sub TestDeleteReference()

    ' Purpose: Tests the DeleteReference function.
   
    Const REF_PATH As String = "C:\WINDOWS\System32\scrrun.dll"
   
    ' Deletes the reference to the Microsoft Scripting Runtime.
    If AddReference("Normal", REF_PATH) = True Then
        MsgBox "Reference to '" & REF_PATH & "' has been deleted!"
    Else
        MsgBox "Reference to '" & REF_PATH & "' could not be deleted!"
    End If
   
End Sub

The preceding code deleted the reference to the Microsoft Scripting Runtime located at C:\WINDOWS\System32\scrrun.dll. The reference was deleted from the Normal project.
258
11 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Да, если напишешь хороший модуль с функциями по автоматической проверки и подключения нужных библиотек, выложишь потом ?!?

такие функции не помешают никому :P
478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Не вопрос, выложу...
...только оттуда ничего скачать невозможно...:{
478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
а сейчас я на пару дней ухожу из этого мира...:D
267
11 декабря 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by XtreamAll
а сейчас я на пару дней ухожу из этого мира...:D



У Экселя, например, есть хитроумный метод
Application.ActivateMicrosoftApp xlMicrosoftWord

Вот, что про него пишут:
Activates a Microsoft application. If the application is already running, this method activates the running application. If the application isn't running, this method starts a new instance of the application.

Может, подобное есть в ВБ?

478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by Cutty Sark


У Экселя, например, есть хитроумный метод
Application.ActivateMicrosoftApp xlMicrosoftWord

Вот, что про него пишут:
Activates a Microsoft application. If the application is already running, this method activates the running application. If the application isn't running, this method starts a new instance of the application.

Может, подобное есть в ВБ?



:D Три головы хорошо, а четыре - лучше...:D

...я думаю сработает...
...если работает в ВБА будет работать в ВБ...

258
11 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll


:D Три головы хорошо, а четыре - лучше...:D

...я думаю сработает...
...если работает в ВБА будет работать в ВБ...



Нет, ну лучше всего конечно же пять зведочек

267
11 декабря 2003 года
Cutty Sark
1.2K / / 17.10.2002
Ну, автоматом не обязательно перенесется. Ты проверь. В Ворде, например, такого метода нет.
478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Нее...
так нельзя...
...эта фишка служит для выбора др. Майкрософтовсих программ из Ёкселя...
...естественно Ёксель сам себя активизировать не хочет...:{
478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
:} А ларчик просто открывался...

If Not Application Is Nothing Then
Set runXL = GetObject(, "Excel.Application")
ElseIf Not Application.Ready Then
Set runXL = CreateObject("Excel.Application")
End If

...Ваше мнение???
...Может опять какой-нибудь БАГ выскочит???
478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
If Not Application Is Nothing Then
Set runXL = GetObject(, "Excel.Application")
Else
Set runXL = CreateObject("Excel.Application")
End If

Elseif Not Application.Ready Then
Эта фишка влезла случайно...:)
258
11 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
If Not Application Is Nothing Then
Set runXL = GetObject(, "Excel.Application")
Else
Set runXL = CreateObject("Excel.Application")
End If

Elseif Not Application.Ready Then
Эта фишка влезла случайно...:)



Я не понимаю, откуда у тебя Application берется? Это хто?

478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
он же VBA.Applicaton...
258
11 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
он же VBA.Applicaton...



А зачем проверять VBA.Applicaton?

Я конечно уже вторую неделю недосыпаю, и может чего-то не улавлию, но я никак не могу понять чего проверят этот If Not Application Is Nothing Then...

478
11 декабря 2003 года
XtreamAll
279 / / 01.10.2003
Надо брать отпуск...
...уже совсем плохой стал:{
258
11 декабря 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll
Надо брать отпуск...
...уже совсем плохой стал:{



И не говори, родственники в гости приехали, нигде мне нет покоя... :(

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог