Проблема при работе с VBA

Программирование на Visual Basic for Applications
Lace
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 06.11.2003 (Чт) 12:13

Проблема при работе с VBA

Сообщение Lace » 06.11.2003 (Чт) 12:18

Здравствуйте, уважаемые участники форума!

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

Может быть кто-нибудь знает в чем здесь может быть дело, и как выйти из данной ситуации.
Заранее благодарю за ответ.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.11.2003 (Чт) 12:38

Код в студию.

В смысле что либо сюда либо мне в Личные пошли код, который не работает. Посмотрим что и как.

Lace
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 06.11.2003 (Чт) 12:13

Сообщение Lace » 06.11.2003 (Чт) 12:43

Приведу несколько вариантов, которые были испробованы:

Вариант 1

Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application"):'Останавливается здесь
xlApp.Visible = True
xlApp.Quit
Set xlApp = Nothing

Вариант 2

Dim ExcelSheet As Object
Set ExcelSheet = CreateObject("Excel.Sheet"):'Останавливается здесь
ExcelSheet.Application.Visible = True
ExcelSheet.Application.Cells(1, 1).Value = "This is column A, row 1"
ExcelSheet.SaveAs "C:\TEST.XLS"
ExcelSheet.Application.Quit
Set ExcelSheet = Nothing

Вариант 3

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.WorkSheet
Set xlApp = CreateObject("Excel.Application"):'Останавливается здесь
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

Вариант 4

Dim excelApp As Excel.Applicftion
Dim wrkObj As Workbook
Dim shtObj As Worksheet
On Error Resume Next
Err.Clear
Set excelApp=GetObject(, "Excel.Application"):'Останавливается здесь
if Err<>0 then
Err.Clear
Set excelApp=CreateObject("Excel.Application")
if Err<>0 Then
MsgBox "Could not start Excel", vbExclamation
End
End if
End If
excelApp.Visible=True
Set wrkObj=excelApp.Workboors.Add
Set shtObj=excelApp.Worksheets(1)

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.11.2003 (Чт) 12:46

А просто вариант:

Код: Выделить всё
dim xlApp as New Excel.Application


(естественно, в проекте д.б. ссылка на Microsoft Excel Object Libaray, как, по видимому сделано в примере 3).

Lace
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 06.11.2003 (Чт) 12:13

Сообщение Lace » 06.11.2003 (Чт) 13:29

Если я Вас правильно понял, то решение проблемы заключается в добавлении команды New в строку определния переменной приложения. Если это так, то не помогает. Может, я что-то не так понимаю?

Lace
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 06.11.2003 (Чт) 12:13

Сообщение Lace » 06.11.2003 (Чт) 15:52

Попытавшись во второй раз воспользоваться Вашим советом, но удалив из программы строку с обращением к команде CreateObject, чего не сделал в первый раз, и запустив, к своему удивдению обнаружил, что все действительно работает, и программа не только подгружает Excel, но и выполняет все команды среды Excel. Это именно то, что и было нужно.

Большое спасибо за совет, и за то, что уделили мне столько времени, и прошу прощения за поспешность тех выводов, которые отразились в первом отзыве.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.11.2003 (Чт) 15:56

Рад, что предложенный вариант помог :)

А поспешные выводы это не страшно :)

Lace
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 06.11.2003 (Чт) 12:13

Сообщение Lace » 11.11.2003 (Вт) 9:59

Уважаемые специалисты!

Ответьте пожалуйста на такой вопрос: существует ли возможность в среде VBA проверить наличие того или иного файла на диске без использования системы перехвата ошибок On Error ... Resume

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.11.2003 (Вт) 10:31

Самый простой способ: If Len(Dir$(FileName)) = 0 Then MsgBox FileName & " not exist!"
Но если в FileName содержаться недопустимые символы, выскочит ошибка.
Можно использовать API PathFileExists, это более универсально.
Код: Выделить всё
Declare Function PathFileExists Lib "shlwapi" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Lasciate ogni speranza, voi ch'entrate.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 11.11.2003 (Вт) 18:23

Самый простой способ: If Len(Dir$(FileName)) = 0


так, вроде проще

Код: Выделить всё
If Dir("Полное имя файла") = "" then
'Не Существует

else
'Существует

end if

' так директорию
If Dir("Полное имя файла",vbDirectory) =""

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.11.2003 (Ср) 11:41

Len(Dir$())=0 гораздо быстрее, чем Dir$()=""
Lasciate ogni speranza, voi ch'entrate.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList