VBA for Office

User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

VBA for Office

Post by perasperaadastra »

Почему VBA для офиса — такой... гммм... ну такой какой есть? Ну вот, например, ради того, чтобы поменять цвет линии на графике, нужно сделать вот так:
Series.Format.Line.Visible = msoFalse
Series.Format.Line.Visible = msoTrue
Series.Format.Line.ForeColor.RGB = RGB(0, 255 , 0)
А сама по себе третья строка работать не будет.

Image

Еще очень радуют сообщения об ошибке. "Type mismatch" — ГДЕ ИМЕННО??? :facepalm:
А еще есть "Application-defined or object-defined error". Напоминает установку В10 с сообщением об ошибке "Something happened/ Something happened" Информативно! :)
User avatar
thinker
Уже с Приветом
Posts: 26871
Joined: 29 Aug 2000 09:01

Re: VBA for Office

Post by thinker »

perasperaadastra wrote:Почему VBA для офиса — такой... гммм... ну такой какой есть? Ну вот, например, ради того, чтобы поменять цвет линии на графике, нужно сделать вот так:
Series.Format.Line.Visible = msoFalse
Series.Format.Line.Visible = msoTrue
Series.Format.Line.ForeColor.RGB = RGB(0, 255 , 0)
А сама по себе третья строка работать не будет.
В MS VBA много таких закидонов. Просто нужно их обходить. А чтобы не писать много кода можно сократить до:

Code: Select all

with Series.Format.Line
   .Visible = msoFalse
   .Visible = msoTrue
   .ForeColor.RGB = RGB(0, 255 , 0)
end with
perasperaadastra wrote:Еще очень радуют сообщения об ошибке. "Type mismatch" — ГДЕ ИМЕННО???
поставьте breakpoints, где вы предпологаете ошибку, например в начало каждой процедуры и так можно найти то место где Type mismatch.
All rights reserved, all wrongs revenged.
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: VBA for Office

Post by helg »

Чем глубже погружение в MS-продукты, тем сильнее запах.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: VBA for Office

Post by perasperaadastra »

Я не знаю, почему МС не отказались от VBA в офисе... Оставили бы legacy поддержку, и перешли бы на что-нибудь более лучшее. Я лет 10 не трогал VBA, и теперь, когда, пришлось, я уже отвык :(
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: VBA for Office

Post by helg »

perasperaadastra wrote:Я не знаю, почему МС не отказались от VBA в офисе... Оставили бы legacy поддержку, и перешли бы на что-нибудь более лучшее. Я лет 10 не трогал VBA, и теперь, когда, пришлось, я уже отвык :(
Вы будете удивлены, но в LibreOffice именно так и сделали. Оставили VBA, чтобы работало с файлами от MS, и перешли на Python.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: VBA for Office

Post by perasperaadastra »

О! Не знал. Надо попробовать Либру. Кстати, в МС офисе удивило, что для сохранения кода нужно сохранять в xls, а не в xlsx. Они, кстати, попытались убить VBA в новом офисе для мака, но потом под давлением пользователей все таки вернули с сильно урезанным IDE.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: VBA for Office

Post by perasperaadastra »

Убейте меня! Написал скриптик для одной таблицы — он сработал. Сделал новую таблицу с полностью аналогичным раскладом — на работает! Ошибка 400. Читаю про ошибку 400 в интернетах: "400 errors are, by definition, unspecified and (for all intents and purposes) mysterious." 8O

UPDATE: Ааааа! Нашел, наконец ошибку. Год забыл поменять в одной строке... Вроде бы скрипт теперь работает, но зато повесил ексел...
UPDATE: Убрал Debug.Print и скрипт заработал быстро
User avatar
thinker
Уже с Приветом
Posts: 26871
Joined: 29 Aug 2000 09:01

Re: VBA for Office

Post by thinker »

perasperaadastra wrote:О! Не знал. Надо попробовать Либру.
Я как-то попробовал запустить MS VBA код на Либре и он не пошел. Выдал кучу ошибок. Разбираться с ними у меня небыло желания. Но однозначной совместимости я не увидел.
perasperaadastra wrote:Кстати, в МС офисе удивило, что для сохранения кода нужно сохранять в xls, а не в xlsx.
В xlsm (новый формат под Windows since 2007)
All rights reserved, all wrongs revenged.
User avatar
thinker
Уже с Приветом
Posts: 26871
Joined: 29 Aug 2000 09:01

Re: VBA for Office

Post by thinker »

perasperaadastra wrote:Почему VBA для офиса — такой... гммм... ну такой какой есть? Ну вот, например, ради того, чтобы поменять цвет линии на графике, нужно сделать вот так:
Series.Format.Line.Visible = msoFalse
Series.Format.Line.Visible = msoTrue
Series.Format.Line.ForeColor.RGB = RGB(0, 255 , 0)
А сама по себе третья строка работать не будет.

Image
Кстати я тут недавно вычитал, что для того, чтобы форсировать пересчет всех формул на всех Worksheets испoльзуют вот такой код:

Code: Select all

Dim oSht as worksheet
Application.Calculation=xlCalculationManual

for each oSht in Worksheets
   oSht.enablecalculation=false
   osht.enablecalculation=true
next osht

Application.calculate
где enablecalculation пропердь выключается, а потом включается. Как видим, это стандартный прием в VBA. После этого ваш случай не покажется таким уж странным и нелепым. :-)
All rights reserved, all wrongs revenged.
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: VBA for Office

Post by helg »

thinker wrote: Кстати я тут недавно вычитал, что для того, чтобы форсировать пересчет всех формул на всех Worksheets испoльзуют вот такой код:

Code: Select all

Dim oSht as worksheet
Application.Calculation=xlCalculationManual

for each oSht in Worksheets
   oSht.enablecalculation=false
   osht.enablecalculation=true
next osht

Application.calculate
где enablecalculation пропердь выключается, а потом включается. Как видим, это стандартный прием в VBA. После этого ваш случай не покажется таким уж странным и нелепым. :-)
В нашей машине педали тормоза нет, а тормозить надо резким включением/выключением обдува. Ничего, все привыкли. Зачем лишняя педаль?
User avatar
thinker
Уже с Приветом
Posts: 26871
Joined: 29 Aug 2000 09:01

Re: VBA for Office

Post by thinker »

helg wrote:В нашей машине педали тормоза нет, а тормозить надо резким включением/выключением обдува. Ничего, все привыкли. Зачем лишняя педаль?
Нет, скорее особенность языка. Переводя на тему автомобилей, у одних дверца бензобака со стороны водителя, у других со стороны пассажирa. Вряд-ли кто-то из водителей замарачивается с этим, просто привыкли и используют. Ну и тут так же. :wink: Нужно привыкнуть, понять зачем это надо и потом использовать не задавая [глупых] вопросов типа, "а почему оно не так, как я привык в XYZ языке?" или "мне кажется не логично". Хотя, я уверен, если спросить у профессионала по VBA, ну или у его разработчика, он бы объяснил, почему конкретно это так работает, а не иначе.
All rights reserved, all wrongs revenged.
Andriy777
Уже с Приветом
Posts: 1486
Joined: 28 Jan 2002 10:01

Re: VBA for Office

Post by Andriy777 »

Это не особенность языка VBA, а конкретной объектной модели. Вообще непонятно, почему надо было все пересчитывать. Ведь, при включенном авто-пересчете вы просто меняете какую-нибудь ячейку. Все должно считаться автоматически. Если же скрипт меняет много ячеек, то он должен быть умным, чтобы было быстро и не пересчитывать и учесть текущее состояние..

1. Узнать включен ли авто-пересчет. Запомнить. Выключить.
2. Поменять ячейки.
3. Если пересчет был включен в 1, то включить, чтобы пересчитало. Иначе, пользователь уже сам его отключил когда вводил цифры руками, чтобы было быстро и включит, когда ему надо.

Не так?
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: VBA for Office

Post by helg »

thinker wrote:
helg wrote:В нашей машине педали тормоза нет, а тормозить надо резким включением/выключением обдува. Ничего, все привыкли. Зачем лишняя педаль?
Нет, скорее особенность языка. Переводя на тему автомобилей, у одних дверца бензобака со стороны водителя, у других со стороны пассажирa. Вряд-ли кто-то из водителей замарачивается с этим, просто привыкли и используют. Ну и тут так же. :wink: Нужно привыкнуть, понять зачем это надо и потом использовать не задавая [глупых] вопросов типа, "а почему оно не так, как я привык в XYZ языке?" или "мне кажется не логично". Хотя, я уверен, если спросить у профессионала по VBA, ну или у его разработчика, он бы объяснил, почему конкретно это так работает, а не иначе.
Использование функций для производства действий, а переменных - для храниения состояния, - это не особенность какого-то языка, а фундаментальная концепция программирования.
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: VBA for Office

Post by perasperaadastra »

Мне понравилось название oSht.
"for each oSht in Worksheets"
:)
User avatar
thinker
Уже с Приветом
Posts: 26871
Joined: 29 Aug 2000 09:01

Re: VBA for Office

Post by thinker »

Andriy777 wrote:Это не особенность языка VBA, а конкретной объектной модели. Вообще непонятно, почему надо было все пересчитывать. Ведь, при включенном авто-пересчете вы просто меняете какую-нибудь ячейку. Все должно считаться автоматически.
Да, но иногда требуется отключить автоматический пересчет, чтобы увеличить скорость какой-нибудь macro. И по её завершении пересчитать все формулы on all worksheets.
All rights reserved, all wrongs revenged.

Return to “Вопросы и новости IT”