Как преодолеть зависимость проги от версии MS Office?
...все, что она делает в Ёкселе - это формирует сводную таблицу и сводную диаграмму...
...как сделать чтобы эта прога не зависела от версии Офиса???
...я её делал на машине с Office XP в VB6.
Заранее спасибо.
Написал "клиентскую" прогу, кот. берет необх. данные из БД, формирует отчет и выкидывает его в Excel...
...все, что она делает в Ёкселе - это формирует сводную таблицу и сводную диаграмму...
...как сделать чтобы эта прога не зависела от версии Офиса???
...я её делал на машине с Office XP в VB6.
Заранее спасибо.
А в чём, конкретно, проявляется зависимость?
С XP я не работал ещё. По поводу отличий 97 от 2000 могу сказать, что единственное серьёзное отличие, которое знаю (уверен, их больше, но я знаю только это), заключается в невозможности создания массивов контролов на пользовательской форме в 2000. а так, если используешь те же процедуры, свойства и методы, которые описаны в 2000 и в 97 офисах, думаю. проблем не будет.
Написал "клиентскую" прогу, кот. берет необх. данные из БД, формирует отчет и выкидывает его в Excel...
...все, что она делает в Ёкселе - это формирует сводную таблицу и сводную диаграмму...
...как сделать чтобы эта прога не зависела от версии Офиса???
...я её делал на машине с Office XP в VB6.
Заранее спасибо.
Нууу, это слишком расплывчато...
В какой именно части не зависела, из-за чего у твоего клиента проблемы?
Если ты спрашиваешь чисто гипотетически, какие возможно траблы, то мне видятся следующие аспекты:
1. Неиспользовать методы и свойства объектов, которы[ в предыдущих версиях Office не было.
2. Ссылки на библиотеки - версия меняется и при переносе проекта он начинает ругаться, что не так таких библиотек, их конечно же нет, но есть другие, всего лишь номером по ниже.
В Access есть возможность получения доступ к коллекции ссылок на библиотеки и проверить их (не смотрел их в Excel и Word). Правда если нехватает одной из основных библилотек, то все равно будет ругаться...
...у библиотек, кот. юзает моя прога, индекс - 10.0, ну т.е. XP значит...
...у 2000-го офиса - 9.0...
на машинах с XP прога работает нормально, а если 2000-й (других на фирме Офисов слава Богу нету!) - вылетает как раз при открытии Excel-я...
If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")
Else
Set runXL = CreateObject("Excel.Application")
End If
If Not wb Is Nothing Then
Set GetWorkBook = wb
Else
Set wb = XL.Workbooks.Add
Set GetWorkBook = wb
End If
...дальше точно не идет!
вот кусок кода, при выполнении которого все рушится (на машинах с 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")
If Application.Ready Then
Set runXL = GetObject(, "Excel.Application")
ElseIf Not Application.Ready Then
Set runXL = CreateObject("Excel.Application")
End If
End Function
Эта фишка проверяет, запущен ли Ёксель...
...если запущен, то берёт его, если же нет, то запускает...
Может коряво, но работает...
...кстати, если есть лучшие варианты - буду благодарен...
за Ready - пасибо! Учту...
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 должен вернуть ошибку времени выполнения?
Я бы написал так:
Err.clear
Set runXL = GetObject(, "Excel.Application")
If Err.Number<>0 Then
Set runXL = GetObject("", "Excel.Application") ' тоже самое что и CreateObject в таком случае
End If
On Error GoTo 0
Set runXL = GetObject(, "Excel.Application")
Я проверяю запущен Excel или нет...
...и если запущен, то:
Set runXL = GetObject(, "Excel.Application")
...а если нет, то:
Set runXL = CreateObject("Excel.Application")
...но, как заметил г-н mhaturov, в Excel 2000 у Application нет свойства Ready...
...поэтому если кто то знает как еще можно проверить запущен Excel или нет - подскажите плз.!!!
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
Вот на счет ссылок, тут вопрос конечно интересный. Я тут вытащил из MSDN для примера несколько удобных функций по программному добавлению, удалению, проверки ссылок проекта. Идеалогия такая, ты должен после запуска твоего главного макроса из проекта (можно и на загрузку проекта поставить) проверить какие из ссылок проекта не битые. Потом ищем доступные на компе файлы библиотек и найдя их программно добавляем в проект ссылку на эту библиотеку.
Чтобы рулить ссылками проекта (и все остальной программной ботвой проекта) необходимо установить в своем проекте ссылку на библиотеку - Microsoft Visual Basic for Application Extensibility 5.3
Это самый тонкий момент во всем этом деле. Библиотека эта в последних версиях не меняла своего названия, и есть у меня смутное подозрение, что microsoft оставит ее даже в новом офисе для совместимости ничего не меняя в ней, иначе получается жопа: есть методы по проверки подключенных библиотек, но дли них тоже нужна своя библиотека, наличие которой тоже нужно проверить установить - полный бред вообщем...
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.
такие функции не помешают никому :P
...только оттуда ничего скачать невозможно...:{
а сейчас я на пару дней ухожу из этого мира...: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.
Может, подобное есть в ВБ?
У Экселя, например, есть хитроумный метод
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
...я думаю сработает...
...если работает в ВБА будет работать в ВБ...
:D Три головы хорошо, а четыре - лучше...:D
...я думаю сработает...
...если работает в ВБА будет работать в ВБ...
Нет, ну лучше всего конечно же пять зведочек
так нельзя...
...эта фишка служит для выбора др. Майкрософтовсих программ из Ёкселя...
...естественно Ёксель сам себя активизировать не хочет...:{
If Not Application Is Nothing Then
Set runXL = GetObject(, "Excel.Application")
ElseIf Not Application.Ready Then
Set runXL = CreateObject("Excel.Application")
End If
...Ваше мнение???
...Может опять какой-нибудь БАГ выскочит???
Set runXL = GetObject(, "Excel.Application")
Else
Set runXL = CreateObject("Excel.Application")
End If
Elseif Not Application.Ready Then
Эта фишка влезла случайно...:)
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 берется? Это хто?
он же VBA.Applicaton...
А зачем проверять VBA.Applicaton?
Я конечно уже вторую неделю недосыпаю, и может чего-то не улавлию, но я никак не могу понять чего проверят этот If Not Application Is Nothing Then...
...уже совсем плохой стал:{
Надо брать отпуск...
...уже совсем плохой стал:{
И не говори, родственники в гости приехали, нигде мне нет покоя... :(