Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нельзя писать большие проги на VBA под Excel?

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Привет! У меня проблема. Пишу программу на VBA под Excel. Она стала слишком большой по мнению MS Excel (хотя для меня такого размера кода мало) и перестала сохраняться. Сейчас сам текст кода на VBA (без учета таблицы) - примерно 83 килобайта размером, хотя я надеялся ее еще расширять. При сохранении таблицы Excel говорит что файл не удалось сохранить, но его остатки теперь находятся, к примеру, в файле 074F0000 без расширения, затем выдает "Файл не сохранен". Это под любой версией офиса 97-2000-XP с сервис-паками!
По-моему здесь однако критичен не размер кода программы, а количество функций (не хочется считать, но у меня их примерно 150).
Подскажите, как по вашему опыту, вообще возможно написать программу именно на VBA именно под Excel побольше того что получилось у меня? Также очень интересно, что для этого надо сделать или что у меня неправильно.
Заранее благодарен.
267
31 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by goodwill
Привет! У меня проблема. Пишу программу на VBA под Excel. Она стала слишком большой по мнению MS Excel (хотя для меня такого размера кода мало) и перестала сохраняться. Сейчас сам текст кода на VBA (без учета таблицы) - примерно 83 килобайта размером, хотя я надеялся ее еще расширять. При сохранении таблицы Excel говорит что файл не удалось сохранить, но его остатки теперь находятся, к примеру, в файле 074F0000 без расширения, затем выдает "Файл не сохранен". Это под любой версией офиса 97-2000-XP с сервис-паками!
По-моему здесь однако критичен не размер кода программы, а количество функций (не хочется считать, но у меня их примерно 150).
Подскажите, как по вашему опыту, вообще возможно написать программу именно на VBA именно под Excel побольше того что получилось у меня? Также очень интересно, что для этого надо сделать или что у меня неправильно.
Заранее благодарен.



Никогда не сталкивался с подобной проблемой (хотя я где-то краем уха слышал, что количество пользовательских функций ограничено числом 255, но не ручаюсь за точность этого). Может, проблема не в размере? Попробуй разбить твои коды на несколько модулей. И еще убедись в том, что и имена модулей, и внутренние имена листов в книге (которые в VB меняются) не содержат русских букв (я сталкивался с глюками из-за этого).

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


Никогда не сталкивался с подобной проблемой (хотя я где-то краем уха слышал, что количество пользовательских функций ограничено числом 255, но не ручаюсь за точность этого). Может, проблема не в размере? Попробуй разбить твои коды на несколько модулей. И еще убедись в том, что и имена модулей, и внутренние имена листов в книге (которые в VB меняются) не содержат русских букв (я сталкивался с глюками из-за этого).



Спасибо за ответ, однако я уже проверил - все эти ухищрения не помогают. И коды разбивал на несколько модулей и все называется по-английски.
Возможно, у меня действительно количество пользовательских функций стало больше 255 (а не 150) - надо проверить.

267
31 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by goodwill


Спасибо за ответ, однако я уже проверил - все эти ухищрения не помогают. И коды разбивал на несколько модулей и все называется по-английски.
Возможно, у меня действительно количество пользовательских функций стало больше 255 (а не 150) - надо проверить.



Возможно, это будет менее удобно, но постарайся объединять по несколько функций в одну.
Наверняка у тебя есть похожие по смыслу функции. Добавляешь аргумент Flag, а далее
Select Case Flag
Case 1
...function1
Case 2
...function2
....

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


Возможно, это будет менее удобно, но постарайся объединять по несколько функций в одну.
Наверняка у тебя есть похожие по смыслу функции. Добавляешь аргумент Flag, а далее
Select Case Flag
Case 1
...function1
Case 2
...function2
....



Спасибо за совет, буду пробовать, но это все не быстро... да и жаль, очень хотелось бы иметь все же много функций как есть - гораздо нагляднее. Кстати, количество функций и процедур, при котором валится эксель, у меня немного меньше чем даже 123 (а не 255). Так что дело также и не только в количестве функций - это согласно еще некоторым плохо формализуемым наблюдениям.

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


Возможно, это будет менее удобно, но постарайся объединять по несколько функций в одну.
Наверняка у тебя есть похожие по смыслу функции. Добавляешь аргумент Flag, а далее
Select Case Flag
Case 1
...function1
Case 2
...function2
....



Спасибо за совет, буду пробовать, но это все не быстро... да и жаль, очень хотелось бы иметь все же много функций как есть - гораздо нагляднее. Кстати, количество функций и процедур, при котором валится эксель, у меня немного меньше чем даже 123 (а не 255). Так что дело также и не только в количестве функций - это согласно еще некоторым плохо формализуемым наблюдениям. :sad:

267
31 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by goodwill


Спасибо за совет, буду пробовать, но это все не быстро... да и жаль, очень хотелось бы иметь все же много функций как есть - гораздо нагляднее. Кстати, количество функций и процедур, при котором валится эксель, у меня немного меньше чем даже 123 (а не 255). Так что дело также и не только в количестве функций - это согласно еще некоторым плохо формализуемым наблюдениям. :sad:



Надо ради интереса попробовать на своей машине. Говоришь, не удается сохранить?

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


Надо ради интереса попробовать на своей машине. Говоришь, не удается сохранить?



1) Я пробовал это на двух машинах (на работе и дома) на Win98 и WinXP(дома), под всеми офисами.
2) Я бы зипнул конечно файл, да все это служебное, нежелательно для постороннего просмотра.
Большое спасибо за внимание. Однако, буду очень рад если можно потестировать и без этого.

Структура моего проекта примерно следующая: много функций, обращающихся к поименованным ячейкам таблицы(что несущественно мне кажется), они еще раз вызываются каждая из соответствующей функции. Все это (то есть объединяющие функции) обрабатывает объединяющая процедура. Это на всякий случай.
Далее. Действительно, не сохраняется как и писал.
Проявления немного разные, эксель XP просто писшет что "Файл не сохранен", другие ексели
могут кроме этого сохраниться во что-то промежуточное.
Вроде, добавить больше нечего, но надо будет - еще добавлю. Спасибо.

267
31 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by goodwill


1) Я пробовал это на двух машинах (на работе и дома) на Win98 и WinXP(дома), под всеми офисами.
2) Я бы зипнул конечно файл, да все это служебное, нежелательно для постороннего просмотра.
Большое спасибо за внимание. Однако, буду очень рад если можно потестировать и без этого.

Структура моего проекта примерно следующая: много функций, обращающихся к поименованным ячейкам таблицы(что несущественно мне кажется), они еще раз вызываются каждая из соответствующей функции. Все это (то есть объединяющие функции) обрабатывает объединяющая процедура. Это на всякий случай.
Далее. Действительно, не сохраняется как и писал.
Проявления немного разные, эксель XP просто писшет что "Файл не сохранен", другие ексели
могут кроме этого сохраниться во что-то промежуточное.
Вроде, добавить больше нечего, но надо будет - еще добавлю. Спасибо.



Я создал файлик, забил туда 260 функций вида
Function Fun120()
Fun120 = Rnd
End Function

Он работает нормально и на 97-м русском Экселе, и на 2000-м английском. Увеличил количество функций до 1200 - все работает...

Значит, не все так просто...

В принципе, можешь прислать свой зип только мне. korzz собака pisem точка net. Хотя я не навязываюсь. :)

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


Я создал файлик, забил туда 260 функций вида
Function Fun120()
Fun120 = Rnd
End Function

Он работает нормально и на 97-м русском Экселе, и на 2000-м английском. Увеличил количество функций до 1200 - все работает...

Значит, не все так просто...

В принципе, можешь прислать свой зип только мне. korzz собака pisem точка net. Хотя я не навязываюсь. :)



Я попробовал то же что и ты - работает, однако функции у тебя (и меня при этом очень маленькие).
Я вот заметил что добавлением таких маленьких функций к "пред-валящемуся" проекту хуже не сделаешь - не свалится, однако если добавить функцию с большим количеством строк, в том числе или даже достаточно только комментариев, например строк 40, то перестанет сохраняться (свалится).

Может пошлю файлик, если начальник позволит, но это позже. Спасибо за участие.

267
31 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by goodwill


Я попробовал то же что и ты - работает, однако функции у тебя (и меня при этом очень маленькие).
Я вот заметил что добавлением таких маленьких функций к "пред-валящемуся" проекту хуже не сделаешь - не свалится, однако если добавить функцию с большим количеством строк, в том числе или даже достаточно только комментариев, например строк 40, то перестанет сохраняться (свалится).

Может пошлю файлик, если начальник позволит, но это позже. Спасибо за участие.



Добавил в каждую из 1200 функций по 40 строчек
'wow

Работает, собака...

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark


Добавил в каждую из 1200 функций по 40 строчек
'wow

Работает, собака...



Верю, но заметь что 1а) Я не вру и 1б) думаю что
у тебя на машине с моим проектом будет тоже самое.
2) Вообще-то у меня комментарии длинные и
содержат закомментированный код (а VB у меня
как-то раз глючил на закоментаренном коде), да еще, при раскомментаривании эффект там тот же - всмысле, сохраняться перестает.
3) Как я говорил вначале о структуре проекта, эти фукнкции вызываются из некоей глобальной процедуры (а также вызывают некие подчиненные нестандартные функции определенные мной)
4) Если облом все это проверять, тогда жди файлик (но это до завтра наверное)
5) Это как это ты сделал 1200 функций? Через автоматизацию VBIDE что-ли? Мне надо подумать чтобы написать такое, хотя наверное кода и немного, все равно ты крут.
6) Интересно, почему Office 97 - выбор посвященных?
7) Спасибо.

2.2K
31 марта 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by GoodWill


Я послал на вышеназванный e-mail файлик с примером (и комментариями чего надо делать), буду ждать ответа. Заранее благодарен.

267
01 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Получилось!!!

Фишка не в том, что у тебя функций много, а в том, что у тебя в первой из них (про рабочих которая)
слишком длинная строка. Если твою длинющую сумму разбить на несколько (sum = sum + ...) строчки по
четыре в каждой, то все работает.

Про 1200 функций. Все гораздо проще. Ведь VBA - это текстовый редактор, и ничто тексторедакторовское ему
не чуждо. Я сделал в Экселе вот такую ячейку:
="Function Fun"&СТРОКА()&"()"&СИМВОЛ(10)&ПОВТОР("'wow"&СИМВОЛ(10),40)&" Fun"&СТРОКА()&" = Rnd"&СИМВОЛ(10)&"End Function"
протащил ее вниз на 1200 ячеек, выделил их, Ctrl+C, потом Ctrl+V в VBA.
К моему удивлению, там вставились лишние кавычки, но я их мгновенно удалил с помощью обычной текстовой замены.
Вот и все.

По поводу выбора посвященных:
Давно подмечено, что 2000-й офис намного тормознее 97-го, а ХР - 2000-го. При этом новые возможности, появившиеся в этих версиях, на мой взгляд, совершенно не окупают такой повышенной требовательности к ресурсам железа.
2.2K
01 апреля 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark
Получилось!!!

Фишка не в том, что у тебя функций много, а в том, что у тебя в первой из них (про рабочих которая)
слишком длинная строка. Если твою длинющую сумму разбить на несколько (sum = sum + ...) строчки по
четыре в каждой, то все работает.



Огромное спасибо. Я попробовал - работает! Я установил, кстати, что добиться эффекта несохранения можно следующим образом, к-примеру:

в функцию, где уже есть строчек 40, вставить следующее:

' _
' _
' _
' _
' _
' _
' _
' _
' _
' _
' _

(впрочем почему-то это не на каждой функции проходит)

Я не стал точно выяснять этот глюк, пока времени мало, но это уже можно считать минимальной локализацией ошибки.
Если есть желание - можно его послать в Microsoft - это в качестве награды. Кроме того, я не отказываюсь от своих слов, могу еще чем-нибудь наградить.


Цитата:

Про 1200 функций. Все гораздо проще. Ведь VBA - это текстовый редактор, и ничто тексторедакторовское ему
не чуждо. Я сделал в Экселе вот такую ячейку:
="Function Fun"&СТРОКА()&"()"&СИМВОЛ(10)&ПОВТОР("'wow"&СИМВОЛ(10),40)&" Fun"&СТРОКА()&" = Rnd"&СИМВОЛ(10)&"End Function"
протащил ее вниз на 1200 ячеек, выделил их, Ctrl+C, потом Ctrl+V в VBA.
К моему удивлению, там вставились лишние кавычки, но я их мгновенно удалил с помощью обычной текстовой замены.
Вот и все.



Красиво, я знал этот метод, но тормознул немного, к тому же он у тебя чуть более изощрен, чем я применял, например &ПОВТОР("'...

Цитата:

По поводу выбора посвященных:
Давно подмечено, что 2000-й офис намного тормознее 97-го, а ХР - 2000-го. При этом новые возможности, появившиеся в этих версиях, на мой взгляд, совершенно не окупают такой повышенной требовательности к ресурсам железа.



С этим согласен, у нас на работе почти у всех как раз он и стоит, но все же 2000-XP бывают очень нужны из-за их же новых форматов.

В-общем за все ОГРОМНОЕ СПАСИБО!

267
01 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Очевидно, что максимальная длина строки в ВБА чем-то ограничена (небось традиционным 255). Поэтому, когда полно переносов строк возникает такое переполнение - и не важно, с комментариями строки или с кодом.

Удачи!
2.2K
01 апреля 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark
Очевидно, что максимальная длина строки в ВБА чем-то ограничена (небось традиционным 255). Поэтому, когда полно переносов строк возникает такое переполнение - и не важно, с комментариями строки или с кодом.

Удачи!



Э-э-э-нет не совсем, я имел в виду именно 11 таких вот:

' _
' _

... (11 раз)

' _

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

Best regards!

267
01 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
Вот что удалось найти в хелпе к ВБА:

Физическая строка программы Visual Basic может содержать до 1023 символов. Имеется возможность создать длинную логическую строку, объединяя физические строки с помощью символа продолжения строки (пробел, за которым следует символ подчеркивания ( _)). С помощью символа продолжения строк допускается объединение в одну логическую строку до 10 физических строк. Таким образом, логическая строка может содержать до 10,230 символов. В других случаях, необходимо разбить строку на отдельные инструкции или присвоить некоторые выражения промежуточным переменным.

Я думаю, на этом проблему можно считать закрытой...
2.2K
04 апреля 2003 года
goodwill
19 / / 31.03.2003
Цитата:
Originally posted by Cutty Sark
Вот что удалось найти в хелпе к ВБА:
> Я думаю, на этом проблему можно считать
> закрытой...


1)
Однако я нашел повод чтобы ее продолжить

2) Возможно я - лентяй, но не нашел этого раздела
по-крайней мере в хелпе к 97му офису, а может
именно в 97м офисе этого и нет (не это повод,
см. далее).

3) Как правильно отметил уважаемый Cutty Sark
> С помощью символа продолжения строк
> допускается объединение в одну логическую
> строку до 10 физических строк.

Поправлю самого себя. Тогда можно как-будто
написать только 9 раз :

' _
' _
.....(9 раз).....
' _

это и подтверждается на практике, я в прошлый раз
на 1 переборщил, так как прибавлял по 2е строки.

Однако...


4)
4а)
Когда создашь логическую строку состоящую из
11ти физических строк и более, до 24х строк,
НИКАКОГО ПРЕДУПРЕЖДЕНИЯ ОФИС НЕ ВЫДАЕТ! :x
Просто, перестает сохранять уже потом, когда
многое написано, что меня и шокировало. :sad:
Это неправильно!

4б)
Слава Богу, после написания
' _
' _
.....(24 раза).....
' _

на 25-й, все же выдается сообщение
"Слишком много строк продолжения". :)
Вот это правильно, интерпретатор или компилятор ДОЛЖЕН ругаться на то что не соответствует спецификации языка, однако, это не делается в случае 4а)! :sad:


5) Таким образом, мы все-таки имеем глюку Microsoft, как я и писал, просто немного задокументированную глюку. Я не должен при написании программы помнить весь хелп по ВБА, к тому же глубоко закопанные места, и вообще, меня
должны предупредить что у меня программа неправильная, если так считает спецификация и сам васик. :D

6) Эта глюка есть во всех офисах 97-2000-XP в том виде, что описано выше. :D

Приятного программирования!
:D

267
04 апреля 2003 года
Cutty Sark
1.2K / / 17.10.2002
То, что о превышении лимита в 10 строчек не предупреждают - конечно, недоработка Майкрософта.

А в хелпе к 97-му ВБА скопированный мною текст можно найти набрав в "Поиске" фразу "слишком длинная строка". Поиск в виндовских хелпах - очень мощная и полезная штука...
1.9K
04 апреля 2003 года
DKef
44 / / 11.03.2003
Да... Ребят, Вам бы за бутолочкой водочки посидеть, поговорить :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог