Нельзя писать большие проги на VBA под Excel?
По-моему здесь однако критичен не размер кода программы, а количество функций (не хочется считать, но у меня их примерно 150).
Подскажите, как по вашему опыту, вообще возможно написать программу именно на VBA именно под Excel побольше того что получилось у меня? Также очень интересно, что для этого надо сделать или что у меня неправильно.
Заранее благодарен.
Привет! У меня проблема. Пишу программу на VBA под Excel. Она стала слишком большой по мнению MS Excel (хотя для меня такого размера кода мало) и перестала сохраняться. Сейчас сам текст кода на VBA (без учета таблицы) - примерно 83 килобайта размером, хотя я надеялся ее еще расширять. При сохранении таблицы Excel говорит что файл не удалось сохранить, но его остатки теперь находятся, к примеру, в файле 074F0000 без расширения, затем выдает "Файл не сохранен". Это под любой версией офиса 97-2000-XP с сервис-паками!
По-моему здесь однако критичен не размер кода программы, а количество функций (не хочется считать, но у меня их примерно 150).
Подскажите, как по вашему опыту, вообще возможно написать программу именно на VBA именно под Excel побольше того что получилось у меня? Также очень интересно, что для этого надо сделать или что у меня неправильно.
Заранее благодарен.
Никогда не сталкивался с подобной проблемой (хотя я где-то краем уха слышал, что количество пользовательских функций ограничено числом 255, но не ручаюсь за точность этого). Может, проблема не в размере? Попробуй разбить твои коды на несколько модулей. И еще убедись в том, что и имена модулей, и внутренние имена листов в книге (которые в VB меняются) не содержат русских букв (я сталкивался с глюками из-за этого).
Никогда не сталкивался с подобной проблемой (хотя я где-то краем уха слышал, что количество пользовательских функций ограничено числом 255, но не ручаюсь за точность этого). Может, проблема не в размере? Попробуй разбить твои коды на несколько модулей. И еще убедись в том, что и имена модулей, и внутренние имена листов в книге (которые в VB меняются) не содержат русских букв (я сталкивался с глюками из-за этого).
Спасибо за ответ, однако я уже проверил - все эти ухищрения не помогают. И коды разбивал на несколько модулей и все называется по-английски.
Возможно, у меня действительно количество пользовательских функций стало больше 255 (а не 150) - надо проверить.
Спасибо за ответ, однако я уже проверил - все эти ухищрения не помогают. И коды разбивал на несколько модулей и все называется по-английски.
Возможно, у меня действительно количество пользовательских функций стало больше 255 (а не 150) - надо проверить.
Возможно, это будет менее удобно, но постарайся объединять по несколько функций в одну.
Наверняка у тебя есть похожие по смыслу функции. Добавляешь аргумент Flag, а далее
Select Case Flag
Case 1
...function1
Case 2
...function2
....
Возможно, это будет менее удобно, но постарайся объединять по несколько функций в одну.
Наверняка у тебя есть похожие по смыслу функции. Добавляешь аргумент Flag, а далее
Select Case Flag
Case 1
...function1
Case 2
...function2
....
Спасибо за совет, буду пробовать, но это все не быстро... да и жаль, очень хотелось бы иметь все же много функций как есть - гораздо нагляднее. Кстати, количество функций и процедур, при котором валится эксель, у меня немного меньше чем даже 123 (а не 255). Так что дело также и не только в количестве функций - это согласно еще некоторым плохо формализуемым наблюдениям.
Возможно, это будет менее удобно, но постарайся объединять по несколько функций в одну.
Наверняка у тебя есть похожие по смыслу функции. Добавляешь аргумент Flag, а далее
Select Case Flag
Case 1
...function1
Case 2
...function2
....
Спасибо за совет, буду пробовать, но это все не быстро... да и жаль, очень хотелось бы иметь все же много функций как есть - гораздо нагляднее. Кстати, количество функций и процедур, при котором валится эксель, у меня немного меньше чем даже 123 (а не 255). Так что дело также и не только в количестве функций - это согласно еще некоторым плохо формализуемым наблюдениям. :sad:
Спасибо за совет, буду пробовать, но это все не быстро... да и жаль, очень хотелось бы иметь все же много функций как есть - гораздо нагляднее. Кстати, количество функций и процедур, при котором валится эксель, у меня немного меньше чем даже 123 (а не 255). Так что дело также и не только в количестве функций - это согласно еще некоторым плохо формализуемым наблюдениям. :sad:
Надо ради интереса попробовать на своей машине. Говоришь, не удается сохранить?
Надо ради интереса попробовать на своей машине. Говоришь, не удается сохранить?
1) Я пробовал это на двух машинах (на работе и дома) на Win98 и WinXP(дома), под всеми офисами.
2) Я бы зипнул конечно файл, да все это служебное, нежелательно для постороннего просмотра.
Большое спасибо за внимание. Однако, буду очень рад если можно потестировать и без этого.
Структура моего проекта примерно следующая: много функций, обращающихся к поименованным ячейкам таблицы(что несущественно мне кажется), они еще раз вызываются каждая из соответствующей функции. Все это (то есть объединяющие функции) обрабатывает объединяющая процедура. Это на всякий случай.
Далее. Действительно, не сохраняется как и писал.
Проявления немного разные, эксель XP просто писшет что "Файл не сохранен", другие ексели
могут кроме этого сохраниться во что-то промежуточное.
Вроде, добавить больше нечего, но надо будет - еще добавлю. Спасибо.
1) Я пробовал это на двух машинах (на работе и дома) на Win98 и WinXP(дома), под всеми офисами.
2) Я бы зипнул конечно файл, да все это служебное, нежелательно для постороннего просмотра.
Большое спасибо за внимание. Однако, буду очень рад если можно потестировать и без этого.
Структура моего проекта примерно следующая: много функций, обращающихся к поименованным ячейкам таблицы(что несущественно мне кажется), они еще раз вызываются каждая из соответствующей функции. Все это (то есть объединяющие функции) обрабатывает объединяющая процедура. Это на всякий случай.
Далее. Действительно, не сохраняется как и писал.
Проявления немного разные, эксель XP просто писшет что "Файл не сохранен", другие ексели
могут кроме этого сохраниться во что-то промежуточное.
Вроде, добавить больше нечего, но надо будет - еще добавлю. Спасибо.
Я создал файлик, забил туда 260 функций вида
Function Fun120()
Fun120 = Rnd
End Function
Он работает нормально и на 97-м русском Экселе, и на 2000-м английском. Увеличил количество функций до 1200 - все работает...
Значит, не все так просто...
В принципе, можешь прислать свой зип только мне. korzz собака pisem точка net. Хотя я не навязываюсь. :)
Я создал файлик, забил туда 260 функций вида
Function Fun120()
Fun120 = Rnd
End Function
Он работает нормально и на 97-м русском Экселе, и на 2000-м английском. Увеличил количество функций до 1200 - все работает...
Значит, не все так просто...
В принципе, можешь прислать свой зип только мне. korzz собака pisem точка net. Хотя я не навязываюсь. :)
Я попробовал то же что и ты - работает, однако функции у тебя (и меня при этом очень маленькие).
Я вот заметил что добавлением таких маленьких функций к "пред-валящемуся" проекту хуже не сделаешь - не свалится, однако если добавить функцию с большим количеством строк, в том числе или даже достаточно только комментариев, например строк 40, то перестанет сохраняться (свалится).
Может пошлю файлик, если начальник позволит, но это позже. Спасибо за участие.
Я попробовал то же что и ты - работает, однако функции у тебя (и меня при этом очень маленькие).
Я вот заметил что добавлением таких маленьких функций к "пред-валящемуся" проекту хуже не сделаешь - не свалится, однако если добавить функцию с большим количеством строк, в том числе или даже достаточно только комментариев, например строк 40, то перестанет сохраняться (свалится).
Может пошлю файлик, если начальник позволит, но это позже. Спасибо за участие.
Добавил в каждую из 1200 функций по 40 строчек
'wow
Работает, собака...
Добавил в каждую из 1200 функций по 40 строчек
'wow
Работает, собака...
Верю, но заметь что 1а) Я не вру и 1б) думаю что
у тебя на машине с моим проектом будет тоже самое.
2) Вообще-то у меня комментарии длинные и
содержат закомментированный код (а VB у меня
как-то раз глючил на закоментаренном коде), да еще, при раскомментаривании эффект там тот же - всмысле, сохраняться перестает.
3) Как я говорил вначале о структуре проекта, эти фукнкции вызываются из некоей глобальной процедуры (а также вызывают некие подчиненные нестандартные функции определенные мной)
4) Если облом все это проверять, тогда жди файлик (но это до завтра наверное)
5) Это как это ты сделал 1200 функций? Через автоматизацию VBIDE что-ли? Мне надо подумать чтобы написать такое, хотя наверное кода и немного, все равно ты крут.
6) Интересно, почему Office 97 - выбор посвященных?
7) Спасибо.
Я послал на вышеназванный e-mail файлик с примером (и комментариями чего надо делать), буду ждать ответа. Заранее благодарен.
Фишка не в том, что у тебя функций много, а в том, что у тебя в первой из них (про рабочих которая)
слишком длинная строка. Если твою длинющую сумму разбить на несколько (sum = sum + ...) строчки по
четыре в каждой, то все работает.
Про 1200 функций. Все гораздо проще. Ведь VBA - это текстовый редактор, и ничто тексторедакторовское ему
не чуждо. Я сделал в Экселе вот такую ячейку:
="Function Fun"&СТРОКА()&"()"&СИМВОЛ(10)&ПОВТОР("'wow"&СИМВОЛ(10),40)&" Fun"&СТРОКА()&" = Rnd"&СИМВОЛ(10)&"End Function"
протащил ее вниз на 1200 ячеек, выделил их, Ctrl+C, потом Ctrl+V в VBA.
К моему удивлению, там вставились лишние кавычки, но я их мгновенно удалил с помощью обычной текстовой замены.
Вот и все.
По поводу выбора посвященных:
Давно подмечено, что 2000-й офис намного тормознее 97-го, а ХР - 2000-го. При этом новые возможности, появившиеся в этих версиях, на мой взгляд, совершенно не окупают такой повышенной требовательности к ресурсам железа.
Получилось!!!
Фишка не в том, что у тебя функций много, а в том, что у тебя в первой из них (про рабочих которая)
слишком длинная строка. Если твою длинющую сумму разбить на несколько (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 бывают очень нужны из-за их же новых форматов.
В-общем за все ОГРОМНОЕ СПАСИБО!
Удачи!
Очевидно, что максимальная длина строки в ВБА чем-то ограничена (небось традиционным 255). Поэтому, когда полно переносов строк возникает такое переполнение - и не важно, с комментариями строки или с кодом.
Удачи!
Э-э-э-нет не совсем, я имел в виду именно 11 таких вот:
' _
' _
... (11 раз)
' _
так что длина строки здесь небольшая и дело не в этом, я думаю что это настоящий глюк достойный отдельного обсуждения.
Best regards!
Физическая строка программы Visual Basic может содержать до 1023 символов. Имеется возможность создать длинную логическую строку, объединяя физические строки с помощью символа продолжения строки (пробел, за которым следует символ подчеркивания ( _)). С помощью символа продолжения строк допускается объединение в одну логическую строку до 10 физических строк. Таким образом, логическая строка может содержать до 10,230 символов. В других случаях, необходимо разбить строку на отдельные инструкции или присвоить некоторые выражения промежуточным переменным.
Я думаю, на этом проблему можно считать закрытой...
Вот что удалось найти в хелпе к ВБА:
> Я думаю, на этом проблему можно считать
> закрытой...
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
А в хелпе к 97-му ВБА скопированный мною текст можно найти набрав в "Поиске" фразу "слишком длинная строка". Поиск в виндовских хелпах - очень мощная и полезная штука...