Трик #83
Понякога трябва да създадете макрос, който ще работи дори ако имената на листовете, за които се отнася, се променят.
Ако Excel е записал макрос, който препраща към конкретен лист в работна книга, се знае, че кодът работи само ако името на листа (или листовете) остава същото. Например, ако името на работния лист е Budget и кодът на макроса съдържа връзката Sheet("Budget").Select, промяната на името на работния лист ще спре работата на макроса. Причината е, че записващото устройство за макроси генерира код въз основа на името на раздела на листа или името, което виждате, когато работите в Excel.
Има два варианта за преодоляване на ограничението. Първият включва използването на серийни номера. Номерът на листа се определя от позицията му в работната книга. Най-левият лист винаги има сериен номер 1, следващият лист вдясно винаги има сериен номер 2 и т. н. Excel VBA ви позволява да посочите всеки лист, като използвате неговия сериен номер, но за съжаление Excel не използва този метод при запис на макрос.
Също така, докато използвате редния номер на листа, например Sheet(3). Select е много по-добра опция от Sheet(“Budget”). Select, позицията на лист в работната книга може да се промени, ако добавите, премахнете или преместите листове.
Вместо да използват последователни номера, находчивите VBA програмисти използват CodeNames. На всеки лист с работна книга се присвоява уникално кодово име, което не се променя дори ако листът бъде преместен или преименуван или ако се добавят нови листове. Кодовото име на листа може да се види само във VBE - изберете командата Developer → Visual Basic Editor (Developer → Visual Basic Editor) или натиснете комбинациятаКлавиши Alt / Option + Fll, - отворете прозореца на проекта: изберете командата View → Project Explorer или натиснете клавишната комбинация Ctrl + R.
На фиг. 7.1 Кодовото име за листа с име на раздел Бюджет е Sheet3. Кодовото име на листа винаги е името, което се появява в скоби в прозореца на Project Explorer. В работна книга този лист може да бъде препратен с помощта на VBA код с помощта на командата Sheet3.Select, за разлика от Sheet("Budget").Select или Sheet(3).Select.
Ориз. 7.1. Кодови имена (CodeNames) и имена на листове в прозореца на проекта VBE
Ако вашата работна книга вече има много VBA код, написан или написан във VBE и не използва кодови имена, можете да промените кода на ниво проект (т.е. целия код във всички модули на работна книга), като изберете Редактиране → Замяна във VBE.
Единственият път, когато не можете да използвате кодови имена, е когато препращате към работни листове, които са в други работни книги, различни от работната книга, където се намира кодът.