Вы знаете, а я вот своего рода тоже программист. Правда, плюшевый).
Давным-давно с самого детства изучал разные языки программирования, но так сложилось, что уже лет 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С это было бы удобнее. Такой друг у меня уже есть!))