Тема: Как работать с электронной таблицей Excel?

Здравствуйте, уважаемые участники форума!
У меня возникла такая проблема: я пишу программу на VBA в среде AutoCAD, одной из функций которой хотелось бы сделать возможность работы с электронной таблицей формата Microsoft Excel. Формально такая возможность в языке VBA имеется и вызывается командами GetObject и CreateObject. Во всех авторитетных изданиях, Internet публикациях и даже Help'е описан прием использования данных команд. Однако в реальности происходит следующее: процедура обращения начинает запускаться, присходит инициализация переменных, и при переходе к выполнению вышеуказанных команд вызова приложения происходит остановка выполнения макроса. Никакой ошибки при этом система не выдает, просто остановливается и все, без всяких каких-либо признаков неполадок или сбоев. Синтаксис написания процедуры писал символ в символ с примеров, причем из разных источников, как из Help'а так и из сети. Удалось даже найти специально посвященный описанию связывания в среде VBA AutoCAD и MS Excel на официальном сайте Autodesk, но к сожалению не помогло. Даже пробовал на разных компьютерах. Однако при написании той же процедуры (символ с символ), но в среде VB6.0 все работало, а в VBA нет, даже к офисным программам.
Может быть кто-нибудь знает в чем здесь может быть дело, и как выйти из данной ситуации.
Заранее благодарю за ответ.

Re: Как работать с электронной таблицей Excel?

Так трудно ответить, хотелось бы видеть код программы.

Re: Как работать с электронной таблицей Excel?

По моему тебе просто надо проверять наличие ссылки на библиотеку Excel (причём нужной версии, той которая является активной на данном компьютере) с помощью команды Tools->Reference. Если ссылки на библиотеку Excel нет то макрос использующий объекты Excel работать не будет. Во всяком случае у меня при переходе с AutoCAD2002 на AutoCAD2004 и c Excel2002 на ExcelXP были проблемы имено с этими ссылками. Приходится настраивать их вручную, а вот спомощью VBA научиться это делать было бы просто замечательно.
Ещё ты умеешь пользоваться командой Tools->Options->(вкладка General)->(область Error Trapping)? Там можно установить разные режимы вывода сообщений о найденых ошибках в программе:
- можно сделать так чтобы выводились сообщения о всех ошибках;
- об ошибках в модулях классов;
- чтобы выводились сообщения только необрабатываемых ошибок.
Попробуй этим воспользоваться.

Re: Как работать с электронной таблицей Excel?

По моему тебе просто надо проверять наличие ссылки на библиотеку Excel (причём нужной версии, той которая является активной на данном компьютере) с помощью команды Tools->Reference

Во избежание описанного геморроя, в проекте НЕ НАДО устанавливать ссылки на библиотеки, наличие которых на компьютере пользователя вызывает сомнения (относится не только к Excel). Доступ к методам и свойствам конкретного приложения: GetObject и/или CreateObject. Конечно при условии, что приложение вообще есть на компьютере.
Что касается ответа на первоначальный вопрос повторюсь, если не знать, что конкретно делается в АвтоКАДе, а что в Excel, запускаются ли какие-нибудь Excel-макросы из АвтоКАДа и т. п., т. е. если не знать логику Вашей программы, то ответить на него трудно.

Re: Как работать с электронной таблицей Excel?

Бывают случаи когда макрос написан для Excel 10.0 Librery (т.е. для Office XP) а на компьютере стоит Office 2002, который использует Excel 9.0 Librery, в этом случае макрос работать не будет пока пользователь вручную не отключит MISSING ссылку на Excel 10.0 Librery и установит ссылку на Excel 9.0 Librery.
Мне приходится всегда это делать вручную.
Может это можно сделать програмным способом? Буду очень рад познакомиться с этим методом.

Re: Как работать с электронной таблицей Excel?

Я повторюсь - если нет самой острой необходимости в
получении доступа ко всем методам и свойствам приложения
из сервера автоматизации (в данном случае из АвтоКАДа к
Excel), не надо устанавливать ссылку на объектную библиотеку.
Руками прописывать оно конечно хорошо, ну а если Вы, допустим, в Питере, а пользователь во Владивостоке, что
летать будете или по телефону объяснять?
Ниже привожу программку которая записывает на лист Excel
имена всех блоков и внешних ссылок ("первого" уровня
вложенности), имеющихся в чертеже. Все остальные
действия делаются непосредственно в Excel. Нечто подобное работает под Excel 97, Excel 2000, Excel XP.

Option Explicit
Option Base 0
Option Compare Text
Sub nameBlock()
Dim Excel, curSheet, curBook As Object
Dim objSelSet As AcadSelectionSet
Dim objBlock As AcadBlock
Dim intType(0) As Integer
Dim varData(0) As Variant
Dim nameObjSelSet, progBook As String
Dim i As Long
nameObjSelSet = "temp"
'Это имя Excel-евского файла, в котором находятся
'необходимые процедуры для дальнейшей обработки
progBook = "C:\Макросы\Мои_Программы.xls"
For Each objSelSet In ThisDrawing.SelectionSets
    If objSelSet.name = nameObjSelSet Then
        ThisDrawing.SelectionSets.Item(nameObjSelSet).Delete
        Exit For
    End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add(nameObjSelSet)
intType(0) = 0
varData(0) = "INSERT"
objSelSet.Select acSelectionSetAll, filtertype:=intType, filterdata:=varData
If objSelSet.Count = 0 Then
    GoTo Exit_Here
End If
On Error Resume Next
Err.Clear
Set Excel = GetObject(, "Excel.Application")
If Err.Number > 0 Then
    Set Excel = CreateObject("Excel.Application")
End If
On Error GoTo Exit_Here
With Excel
    .SheetsInNewWorkbook = 1
    .DisplayAlerts = False
    .Visible = False
    .WindowState = acMin
End With
'Открываем "программный" файл, дабы все было
'в боевой готовности
Excel.Workbooks.Open fileName:=progBook
'Добавляем книгу, в которой, собственно, и будем работать.
Set curBook = Excel.Workbooks.Add
Set curSheet = curBook.Sheets(1)
curSheet.name = "Количество блоков"
For i = 0 To objSelSet.Count - 1
    curSheet.Cells(i + 1, 1).Value = objSelSet.Item(i).name
Next
AutoCAD.WindowState = acMin
With Excel
    .Visible = True
    .WindowState = acMax
    .DisplayAlerts = True
'А теперь запускается родной Excel-евский макрос, который и
'делает все, что положено:
'подсчитывает записи, вводит формулы, форматирует ячейки и
'т. п. Cамо собою в книге
'[i]Мои_Программы.xls[/i] должна быть процедура
'[i]Форматирование[/i].
    .Run "Мои_Программы.xls!Форматирование"
End With
Exit_Here:
Set Excel = Nothing
Set curSheet = Nothing
Set curBook = Nothing
Set objSelSet = Nothing
Set objBlock = Nothing
End Sub