Оптимизация кода VBS - цикл While

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
darksun
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.06.2005 (Вс) 17:49

Оптимизация кода VBS - цикл While

Сообщение darksun » 26.06.2005 (Вс) 17:57

Написал макрос на VBA, который мне переделывает исходный лист Excel на требуемый мне. В основном внешний вид, т.е. убираются колонки лишние, что-то свое в поля некоторые вписываются.. Но есть 2 куска кода, которые пересчитывают данные. При выполнении из-под Excel в виде макроса на VBA всё дело выполняется 1 минуту. (пересчитывается около 10 000 цифр)
Но мне требуется всё это дело выделить в отдельный скрипт, внешний. Т.е. суть в том, что конечный мой скрипт должен файло скачивать, а потом уж переделывать. Т.е. макрос пришлось переделать в VBScript в отдельном файле, который скачивает, пересчитывает и выкладывает куда следует. Но тут же появилась проблема - всё это дело при написании на VBS работает около 25 минут, что невыносимо долго. Проблема в подобном коде:

Код: Выделить всё
Dim i
i = 16

While i <= 10000
If (objXL.WorkSheets(1).Cells(i, 6) <> "B") And (objXL.WorkSheets(1).Cells(i, 6) <> "") Then
objXL.WorkSheets(1).Cells(i, 6) = Round((objXL.WorkSheets(1).Cells(i, 8) + (objXL.WorkSheets(1).Cells(i, 8) / 100 * 5)) + 0.5, 0)
Else
    If objXL.WorkSheets(1).Cells(i, 6) = "B" Then objXL.WorkSheets(1).Cells(i, 6) = "A"
End If
i = i + 1
Wend


Нашел информацию о том, что ужасно тормозят циклы наподобие for с неописанными переменными. Неужели мне никак не решить проблему в VBS? Там ведь, насколько я понимаю, все переменные неописанные, т.е. хранят и данные и описание в себе. И как быть?

P.S> Может проще встроить макрос в какие-нить глобальные шаблоны, или еще каким-нибудь красивым методом решить мою задачу?

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 26.06.2005 (Вс) 18:00

Кхм VBA несколько ниже между прочим :!: :twisted:
Если всё делать своими ручками, они скоро отвалятся !

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 26.06.2005 (Вс) 19:23

P.S> Может проще встроить макрос в какие-нить глобальные шаблоны, или еще каким-нибудь красивым методом решить мою задачу?

Не могу понять, зачем именно VBS?
Я так понимаю, что тебя не устраивает то, что сам макрос находится в том же файле, что и данные.. но можно ведь хранить макрос в "личной книге макросов" Создать на него кнопочку в тулбаре и юзать макрос для любого файла.
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

darksun
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.06.2005 (Вс) 17:49

Сообщение darksun » 27.06.2005 (Пн) 12:01

Спасибо, разобрался, просто сначала не понял, как эти глобальные макросы сделать. Теперь всё работает идеально :)

Осталось теперь понять, как мне из под VBS вызвать эксель, чтоб он открыл этот файл и исполнил макрос. Тоесть файл-то открывается, всё отлично, а вот как макрос вызвать программно не разобрался.

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 27.06.2005 (Пн) 12:14

darksun писал(а):Спасибо, разобрался, просто сначала не понял, как эти глобальные макросы сделать. Теперь всё работает идеально :)

Осталось теперь понять, как мне из под VBS вызвать эксель, чтоб он открыл этот файл и исполнил макрос. Тоесть файл-то открывается, всё отлично, а вот как макрос вызвать программно не разобрался.

Код: Выделить всё
Set xl = CreateObject("excel.application")
Set wb = xl.Workbooks.Open("...")
xl.Run "MyMacro"
'Если есть параметры, то через запятую:
'xl.Run "MyMacro", "param1", "param2"

darksun
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.06.2005 (Вс) 17:49

Сообщение darksun » 27.06.2005 (Пн) 13:25

Спасибо!!

Странно. Как-то хитро в итоге запускается Excel, что не видит глобальных макросов, которые в PERSONAL.XLS хранятся. Тоесть когда просто руками файл открываю - всё есть, когда просто эксель запускаю всё есть, а когда из-под VBS - нету. А когда из под VBS запускаю и на кнопку с макросом нажимаю, говорит что PERSONAL.XLS содержит макросы и предлагает либо отключить, либо не отключать и т.п.

Самое главное, что когда из под VBS запускаю, ругается на отсутствие макроса такого. А он есть. В PERSONAL.XLS

Как бы теперь всё это дело обойти? :)

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 27.06.2005 (Пн) 13:56

darksun писал(а):Спасибо!!

Странно. Как-то хитро в итоге запускается Excel, что не видит глобальных макросов, которые в PERSONAL.XLS хранятся. Тоесть когда просто руками файл открываю - всё есть, когда просто эксель запускаю всё есть, а когда из-под VBS - нету. А когда из под VBS запускаю и на кнопку с макросом нажимаю, говорит что PERSONAL.XLS содержит макросы и предлагает либо отключить, либо не отключать и т.п.

Самое главное, что когда из под VBS запускаю, ругается на отсутствие макроса такого. А он есть. В PERSONAL.XLS

Как бы теперь всё это дело обойти? :)


Код: Выделить всё
Set wbmacro = xl.Workbooks.Open(xl.StartupPath & "\PERSONAL.XLS")
Set wb = xl.Workbooks.Open("...")
xl.Run "PERSONAL.XLS!MyMacro"
wbmacro.Close

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 27.06.2005 (Пн) 14:55

Только, друг мой...

Если ты пишешь строчку Dim i, знаешь, какой тип у тебя получит эта переменная? Не поверишь, но Variant! И циклы у тебя будут работать как раз с максимальным торможением.

А чтобы объявить именно численную переменную, нужно писать:

Dim i As ...

Вместо ... - Byte, Integer, Long и т. д. в зависимости от необходимости.

darksun
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.06.2005 (Вс) 17:49

Сообщение darksun » 27.06.2005 (Пн) 16:10

Спасибо, теперь всё работает!!

darksun
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.06.2005 (Вс) 17:49

Сообщение darksun » 27.06.2005 (Пн) 16:12

uhm писал(а):Только, друг мой...

Если ты пишешь строчку Dim i, знаешь, какой тип у тебя получит эта переменная? Не поверишь, но Variant! И циклы у тебя будут работать как раз с максимальным торможением.

А чтобы объявить именно численную переменную, нужно писать:

Dim i As ...

Вместо ... - Byte, Integer, Long и т. д. в зависимости от необходимости.


В том-то и дело, что в экселе когда я скрипт пишу, то всё нормально работает, т.к. нормально переменные описаны, но в VBS-скрипте, который я отдельно писал, нельзя объявлять типы переменных, они там только Variant и есть, вот и решил проблему другим образом, пришлось встреивать макрос в PERSONAL.XLS

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 27.06.2005 (Пн) 18:28

Если у тебя сейчас все работает "нормально", то, когда ты заменишь строчку

Dim i

на строчку

Dim i As Integer

у тебя все будет работать "быстро".

darksun
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.06.2005 (Вс) 17:49

Сообщение darksun » 27.06.2005 (Пн) 19:11

uhm писал(а):Если у тебя сейчас все работает "нормально", то, когда ты заменишь строчку

Dim i

на строчку

Dim i As Integer

у тебя все будет работать "быстро".


Господа, ну ё-моё, вы чего?? Листинг, который был приведен в начале - VBScript!! Неужели логически не ясно?? В VBScript описать переменные нельзя!! Только так, как приведено у меня.

А в макросе у меня изначально стоит As Integer, так что всё нормально работает!! Вы хоть читали мой последний пост?? Там же ясно написано, что в макросе у меня переменные описаны!!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 28.06.2005 (Вт) 9:18

Не-е, не ясно. Там код ничем от VB не отличается :)
Ладно, сорри, не разобрался. Тогда у тебя все ОК.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.06.2005 (Вт) 13:06

uhm, в VBS нет типов переменных, кроме Variant. А похож VBS на VB потому, что это практически и есть VB, только урезанный до нельзя. Можно работать с COM-объектами, создавать COM-объекты, работать с ActiveX-объектами. Вот вроде бы и всё. Остальное - удел "старшего брата" VB. :wink:
Все основные операторы и ключевые слова в VBS - есть. Но не все.
Ах да, забыл. Можно ещё из VBS работать с WMI. Рульная штучка я скажу. Вот буквально вчера сделал (сегодня доработал) скрипт, который через WMI вытаскивает IP-адрес локальной машинки.
Можно точно так же вытащить и адрес полученный системой при подключении по DialUp. :) В общем WMI - рулёз полный. Можно делать с системой что хочешь: хоть всю информацию о системе смотри (устройства, параметры, настройки), хоть управляй (запуск, останов служб, получение инфы о драйверах, настройки сетевого окружения - вплоть до указания параметров домена и тому подобное...). Информация о процессах и т.д. В общем там много чего. Я ещё только пока с сетевушками занимаюсь. Сейчас пытаюсь состряпать скрипт, который будет отключать нужное мне соединение (локалка или инет, или др.).
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 28.06.2005 (Вт) 13:10

Знаю. Поэтому и говорю, что по коду невозможно было определить, VB это или VBS.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.06.2005 (Вт) 18:35

Ruslan Demidow писал(а):Можно работать с COM-объектами, создавать COM-объекты, работать с ActiveX-объектами.

А разве есть разница между COM-объектами и ActiveX-объектами? Имхо это два названия одного и того же.

Ruslan Demidow писал(а):Ах да, забыл. Можно ещё из VBS работать с WMI.

Это не "ещё", WMI - это COM-объект ;-)
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.06.2005 (Вт) 23:22

tyomitch , :oops: :oops: , хотелось более развёрнуто, тем более печатал на автомате. Получилась такая петрушка. :oops: :)
Ты хочешь сказать, что WMI - это один большой гигантский COM-объект? А как с ним вяжется SQL технология запросов?
Так.... Сейчас........ Ага. Вот, нашёл:
Можно перечислить следующие срдства, входящие в WMI (отметим только представляющие интерес для Windows 2000):
1. Функционально полная модель для конфигурирования операционной системы и отображения её состояния.
2. Интерфейс программирования COM API, обеспечивающий единый доступ ко всей информации, касающейся администрирования.
3. Возможность взаимодействия с административными службами Windows 2000, что позволяет разработчикам создавать интегрированные приложения для управления системами.
4. Гибкая информационная модель, которую можно расширять для поддержки новых устройств и приложений, создавать соответствующие программные модули (WMI-провайдеры).
5. Развитая событийная архитектура, обеспечивающая распознавание и обработку изменений в состоянии объектов управления и передачу этой информации локальным или удалённым административным программам.
6. Сложный язык запросов для получения данных из информационной модели.
7. API сценариев, позволяющий разработчикам управляющих приложений исползовать Visual Basic или Windows Scripting Host (WSH).

Это из "Наиболее полное руководство к Windows 2000 Server" издательства BHV (СПБ).
Так что я бы не сказал, что WMI - это просто COM-объект. :)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

darksun
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 26.06.2005 (Вс) 17:49

Сообщение darksun » 29.06.2005 (Ср) 13:05

uhm, я же в посте написал, что сначала на VBA сделал, но по таким-то причинам пришлось переделать на VBS, получились тормоза в таком-то месте. И привел листинг этого места :)

А WMI рулит, спору нет :)

Я вообще первый раз от VBS прозрел, когда директор на старой работе захотел, чтоб при подключении к домену у каждого пользователя образовывались свои сетевые диски, причем у каждого свой собственный набор и свой личный сетевой диск. А при выходе из домена всё это дело отключалось и исчезало :) Вот тогда я и узнал, что такое VBS, доволен был поуши :)


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

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

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

    TopList  
cron