Помогите разобраться

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Помогите разобраться

Сообщение Алексей К. » 21.07.2004 (Ср) 10:12

Прога формирует отчет в виде книги эксель по нажатию кнопки. (используется MS excel 10.0 Object library).
Вот часть кода:
Код: Выделить всё
Sub aaa()
Dim excell As Object
Dim отчет As Object
Set excell = CreateObject("Excel.Application")
Set отчет = excell.Workbooks.Add
....
'пункт1
Worksheets(1).Cells(1, 1) = "00-00"
....
'пункт2
отчет.ActiveChart.SeriesCollection(1).DataLabels.Select
Selection.AutoScaleFont = True
....

отчет.SaveAs ("C:\Мои документы\" + имяотчета + ".xls")
excell.Quit
Set excell = Nothing
Set отчет = Nothing
End sub


Была проблема: если нажимаешь один раз то отчет формируется и записывается нормально, а если второй раз (не закрывая программу) то выдавало ошибку на пункте1 "Metod 'Worksheets' of object '_Global' failed", а инструкцию Select пункта2 вообще не понимал (игнорировал). Пришлось изменить:
в пункте1:
отчет.Worksheets(1).Cells(1, 1) = "00-00"
в пункте2:
отчет.ActiveChart.SeriesCollection(1).DataLabels.AutoScaleFont = True
Вопрос: Почему (при первом варианте кода) при одном обращении (нажатии кнопки) все формируется нормально, а при повторных не хочет? Т.е. первый раз все понимает, а второй не хочет. Обьекты все вроде обнуляются.

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

Сообщение RayShade » 21.07.2004 (Ср) 10:52

Потому что всегда надо указывать полный контекст объекта, вот почему.
I don't understand. Sorry.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 21.07.2004 (Ср) 12:58

Так ведь при первом обращении (первый вариант кода) все проходит нормально - без полного контекста, а при втором нехочет. Получается - что не всегда. Интересно....

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

Сообщение RayShade » 21.07.2004 (Ср) 13:28

Причина того, что он первый раз отрабатывает... Хм.. Неизвестна :) Главное то, что второй вариант работает более 1 раза и, соответственно, более применим.
I don't understand. Sorry.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Помогите разобраться

Сообщение Vi » 21.07.2004 (Ср) 17:57

Алексей К. писал(а):Вопрос: Почему (при первом варианте кода) при одном обращении (нажатии кнопки) все формируется нормально, а при повторных не хочет? Т.е. первый раз все понимает, а второй не хочет. Обьекты все вроде обнуляются.


Это издержки применения автоматических объектов, имеющих атрибут appobject.

Зайди в Object Browser (F2), набери в строке поиска "Worksheets" и увидишь объекты, у которых есть это свйоство. Это будут Application, Workbook и т.п. НО если теперь в контексном меню (по правой клавише) сделать "Показать скрытые компоненты", то появится вожделенный Global объект. Вот он и вызывается, когда нет объекта перед свойством. То же справедливо и для "Selection".

Т.е. фактически происходит следующее

'пункт1
Global . Worksheets(1).Cells(1, 1) = "00-00"
....
'пункт2
отчет.ActiveChart.SeriesCollection(1).DataLabels.Select
Global . Selection.AutoScaleFont = True

Время жизни таких объектов связано с временем жизни библиотеки типов. К тому же используется CreateObject с созданием новой копии Excel-я, а Global относится все еще к старой копии. Стоит посмотреть на Диспетчер Задач - там должно болтаться 2 Excel-я.

Вот что говорит MSDN

appobject

Description - Identifies the Application object.
Allowed on - Coclass.
Comments - Indicates that the members of the class can be accessed without qualification when accessing this type library.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот, PetalBot, Yandex-бот и гости: 15

    TopList