Грешка при поставяне на валидиране във VBA - Съвети на Excel

Съдържание

Ако сте прочели първите няколко глави на VBA и макроси за Microsoft Excel, знаете, че се оплаквам, че макрорекордерът на Excel не върши най-добрата работа при запис на използваем код. Обикновено кодът работи добре, но е записан по такъв начин, че може да не е толкова полезен за набори от данни с различен размер. Кодът може да работи добре днес, но не и утре.

Натъкнах се на наистина странен проблем, когато рекордерът на макроси всъщност записва код, който не работи. Писах макрос, който се опитваше да копира проверката от една клетка в диапазон от клетки. В Excel 2002 този код беше както следва:

Range(“E5”).Copy Range(“E6:E12”).PasteSpecial Paste:=xlPasteValidation

Този код работи добре в Excel 2002, но се провали на клиентска машина с Excel 2000. Един от старите компютри в офиса все още има Excel 2000, затова опитах кода там. Проблемът беше с xlPasteValidation. Винаги, когато се сблъскам с нещо необичайно, стартирам макрорекордера, за да видя как макрорекордерът ще запише кода. Настроих проверка в E5, включих макрорекордера, копирах E5 и използвах Paste Special - Validation. След като спрях макрорекордера, забелязах, че Excel 2000 записа константата като:

Range(“E6:E12”).PasteSpecial Paste:=xlDataValidation

И така, отидох в клиентското приложение, промених кода на xlDataValidation и го стартирах отново. Странно е, че това доведе до същата грешка!

Оказва се, че рекордерът на макроси в Excel 2000 всъщност има грешка. Той ще запише константата xlDataValidation, но интерпретаторът на макроси не разпознава нито xlDataValidation, нито xlPasteValidation. Помощта за Excel VBA в Excel 2000 се преструва, че няма начин да поставите само проверки.

За да направите тази работа, трябва да откриете основната стойност на xlPasteValidation. На моята машина XL2002 отидох в редактора на VBA. Въведете Ctrl + G, за да отворите незабавния прозорец и въведете това в непосредствения прозорец:

Print xlPasteValidation

Натиснете Enter и Excel 2002 ще ви каже, че xlPasteValidation е приятелски начин да се каже „6“. Обратно на машината Excel 2000, опитах този код:

Range(“E6:E12”).PasteSpecial Paste:=6

За щастие работи. Всъщност сте принудени да използвате основната стойност вместо константата. Предупреждавам срещу тази практика в книгата, тъй като прави програмата наистина трудна за четене за следващия човек, който гледа кода. В конкретния случай наистина нямате избор. Добавете коментар, обясняващ защо сте го кодирали по следния начин:

‘Bug in XL2000; need to use “6” instead of the constant Range(“E6:E12”).PasteSpecial Paste:=6

И така - малкият урок днес е много специфичният проблем за това как да поставите специална проверка в Excel 2000, но по-големият урок е детективската работа, необходима, за да разбере какво се случва, когато в Excel VBA се случи нещо странно.

Интересни статии...