Ненастоящий программист

Вы знаете, а я вот своего рода тоже программист. Правда, плюшевый).

Давным-давно с самого детства изучал разные языки программирования, но так сложилось, что уже лет 20, наверное, на практике требуется только VBA – встроенный в Word, Excel, Corel Draw ну и т.п. Вот какая нужна прикладная задача – такую и решаю. Последнее время всё конечно на Excel.

Формулы Excel – они, конечно, очень массивный инструмент, но зачастую мал. Например, вместо того чтобы возится с формулами массива, и не забывать каждый раз Ctrl+Enter, быстрее накалякать простенький макрос, в котором полноценный For/Next. А как только нужно изобразить сколько-нибудь дружественный пользовательский интерфейс, а если еще и динамический – ну тут сразу пиши пропало.

И вот я собственно об Excel VBA. А конкретно - о его костылях. Прям слова другого нет. Бесят!  Итак, погнали:

Раз. Это гребаный десятичный разделитель в Excel. Все пользователи, конечно же, херачат Double в ячейке через запятую. Ну вот вообще всегда. И когда из-под VBA пишешь в ячейку – тоже запятая. Да, я знаю, как сменить разделитель, но чтобы одновременно в голове у всех пользователей – мдя. А разработчик-то американский, и поэтому на формах VBA разделитель конечно же точка. А теперь картина маслом: чтобы взять в переменную Double с листа – то просто равно, а если с формы – то через Val(). Я пробовал с листа брать через Val(), но пару раз получил Overflow, на ровном вообще месте, и завязал с этим. Просто приходится помнить, откуда ты берешь дробь.

Два. А есть вообще какой-нибудь механизм, который, как в нормальном языке, реализует глобальные переменные? Ну, то есть, наверное, и есть, но по факту проще сделать, чтобы каждая форма скидывала результаты куда-нибудь на лист. А следующая брала с листа. АААРРГГГХХХ!!!!!! Ну ведь это не настоящий язык программирования, да?

Три. А теперь адресация на листе. Вот представьте себе шахматную доску. Ну или поле в морской бой. По горизонтали у тебя буковки, по вертикали – циферки. Смотрим на лист – вуаля! А теперь давайте из-под VBA обратимся на лист. Способ раз – через Range. Что-нибудь типа Sheets(“Лист1”).Range(“A1”). Пока все хорошо, правда? Но это если ты знаешь куда обратиться, типа константа. А как в цикле перебирать ячейки? Не, ну я знал человека, который в цикле через ASCII таблицу перебирал символы и складывал в String, которой потом кормил Range… Ну чтож, мы все тут в Excel немножко не настоящие программисты. А теперь смотрим способ два – через Cells. Sheets(“Лист1”).Cells(x,y) – и вуаля, вот тут то и циклы поперли. Вот только ЧЕТЫРЕЖДЫБЛЯДСКАЯ ЯРОСТЬ!!!!!! Х - это строка, а Y это столбец. Почему, блять, тут-то наоборот??? Про ситуацию, когда сначала выбираешь диапазон Range, а потом к нему индексация Cells – я пока не буду, а то совсем ярость.

Четыре. Я, когда был еще почти настоящим программистом, привык, что индексация начинается с нуля. Любой массив тебе, любая куча, да хоть что – потому что индекс - это смещение, и для первого элемента оно очевидно нулевое. Ситуация первая – берем ComboBox, заполняем через AddItem, перебираем ListIndex – а он с нуля начинается. Красота. А тут мне потребовалось перебрать кучку таких ComboBox, а они с разными именами. Действия над ними одинаковые, а имена у них разные. Ну, напихал их в Collection, и что я вижу? Внутри Collection, какого то ХУЯ!!!!! Индексация с 1 начинается.

В общем, программисты бывают разные, в том числе не совсем настоящие. Но все равно всем бобра!

P.S. Не надо только мне доказывать что на 1С это было бы удобнее. Такой друг у меня уже есть!))

0
Автор поста оценил этот комментарий
Я так почти 15 лет работал))) правда все же перешел в нормальную СУБД, оставив офисные документы для отчетов и входных данных.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, вот и друг 1С-ник так же говорит мне каждую встречу). Но ведь 1С тоже не настоящий язык программирования, верно?))

показать ответы
0
DELETED
Автор поста оценил этот комментарий

Может я открою кому то секрет, но vba разработал пидарас в прямом и переносном смысле этого слова.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Да я в принципе вижу, но по мне пока не сказалось)))

0
Автор поста оценил этот комментарий
Быстро это как медленно, только наоборот ;) Опыт, он лучший учитель, попробуй сделать одно и тоже через ячнйки и через массив, выставь в коде таймеры и сравни результаты. Мне случалось исправлять код "плюшевого программиста", у жены на работе он чуть ли не вешал комп, дома на моем компе он выполнялся около 40(sic!) секунд, после исправления что-то типа 0.05 секунд. Файл там конечно был весьма большой, что-то искалось по строкам столбца и если находилось, писалось на отдельный лист что-то из соседних столбцов той строки или следующей чтоли строки, точно уже не помню.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Гм, может быть в этом что-нибудь и есть! Спасибо, попробую!

0
DELETED
Автор поста оценил этот комментарий

А ещё оператор сравнения от оператора присваивания отличается интонацией (т. е. контекстом использования) - при изучении VBA после нормальных ЯП выбесило сильнее, чем засерённая труба в Марио

раскрыть ветку (1)
Автор поста оценил этот комментарий

согласен, удобнее когда явно разделены операторы. Но к этому худо бедно привыкаешь.. Через несколько лет))

показать ответы
0
Автор поста оценил этот комментарий

Не обращай внимания, несущественно.

Я в мыслях о другом.

Существенно - увидел в бардаке нынешнем на ком держится и будет держаться мир по моему пониманию.

раскрыть ветку (1)
Автор поста оценил этот комментарий

В смысле, на ком?

1
Автор поста оценил этот комментарий
Зачем? Чтобы быстро работать в памяти, а не читать и записывать каждый раз в лист, это постоянно "перерисовывает" его. Ну и опять же, это де вам неудобно работать с различной адресацией всякими буквами и пр., а тут понятный массив.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Не понимаю применения термина "Быстро". У меня не графика, не нейросети и не кластерные вычисления. Большую часть выполнения кода - тупит устройство ввода (пользователь). На процессоре i5-i7 я мог бы перебирать поштучно тысячу ячеек, и все равно визуально тормоза не заметны были бы. А если вы про саму перерисовку, обновление листа средствами самого Экселя - так конечно, эту перерисовку при больших вычислениях отключаю.

показать ответы
0
Автор поста оценил этот комментарий

причина переполнения?

размер памяти?

раскрыть ветку (1)
Автор поста оценил этот комментарий

размер памяти в каком смысле? Оперативы - 64 Гб)))

показать ответы
0
Автор поста оценил этот комментарий

Скорее всего результат преобразования был за пределами типа переменной. Например, val возвращал какой-нибудь longint в byte.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Самое интересное что на входе были простые дроби порядка десятков - типа 1,5 или 2,5 - а пихал я его в Double. Я уж грешным делом думаю - может там какой-нибудь пробел попадал?

показать ответы
1
Автор поста оценил этот комментарий
Зато бесконечный фронт работ и возможность справедливо понегодовать.
А еще ты незаменим)
раскрыть ветку (1)
Автор поста оценил этот комментарий

Спасибо тебе добрый человек, прям понимаешь меня) Естественно незаменим))) Этим и пользуюсь.

показать ответы
2
Автор поста оценил этот комментарий

пока google sheets не прикрыли, можешь ознакомиться с их скриптами на почти канонiчном js.
А ещё мне подсказали, что вы там на vba без регэкспов существуете как-то. Если это правда, то это не жизнь вообще)

раскрыть ветку (1)
Автор поста оценил этот комментарий

Согласен, не хватает их временами. Но я к сожжалению чисто прикладные задачи пишу, красоту кода кроме меня оценить некому.

1
Автор поста оценил этот комментарий

Полезно.

Val ()

раскрыть ветку (1)
Автор поста оценил этот комментарий

Ситуация: Берешь цифры из TextBox, умножаешь на цифры из ячейки, вписываешь обратно в TextBox. Как правильно? Я пробовал = str(val(text)*val(cells)) и в итоге доигрался. На практике обычно канает как = val(text)*cells.

2
Автор поста оценил этот комментарий
А просто не надо в цикле перебирать ячейки. Надо брать весь диапазон и загонять его в массив, работать с массивом, и после одним движением массив загонять в диапазон. А дергать ячейки каждый раз, да если еще и писать в них, такое себе.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Интересная мысль, а зачем? Имеется "массив" на листе, зачем его перегонять еще куда то? Если вы про распределенный доступ, то у меня такого нет. Почему противопоказано дергать ячейками?

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества