Грешка приликом лепљења валидације у ВБА - Екцел савети

Преглед садржаја

Ако сте прочитали првих неколико поглавља ВБА и макронаредби за Мицрософт Екцел, знате да се жалим да Екцел макро снимач не обавља најбољи посао снимања употребљивог кода. Обично код ради у реду, али се снима тако да можда није толико користан за скупове података различите величине. Код ће можда данас добро функционисати, али сутра неће.

Наишао сам на заиста чудан проблем када је макро снимач заправо снимио код који није радио. Писао сам макро који је покушао да копира валидацију из једне ћелије у низ ћелија. У програму Екцел 2002, овај код је био следећи:

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

Овај код је добро функционисао у програму Екцел 2002, али није успео на клијентској машини са програмом Екцел 2000. Један од старих рачунара у канцеларији и даље има Екцел 2000, па сам тамо пробао код. Проблем је био у клПастеВалидатион. Кад год налетим на нешто необично, покрећем макро снимач да видим како ће макро снимач снимити код. Подесио сам валидацију у Е5, укључио макро снимач, копирао Е5 и користио Пасте Специал - Валидатион. Након заустављања макро снимача, приметио сам да је Екцел 2000 константу забележио као:

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

Дакле, отишао сам у клијентску апликацију, променио код у клДатаВалидатион и поново га покренуо. Чудно, произвела је исту грешку!

Испоставило се да Екцел 2000 макро снимач заправо има грешку. Снимит ће константу клДатаВалидатион, али тумач макроа неће препознати ни клДатаВалидатион ни клПастеВалидатион. Екцел ВБА помоћ у програму Екцел 2000 претвара се да не постоји начин да се налепе само валидације.

Да би ово успело, морате открити основну вредност клПастеВалидатион. На својој машини КСЛ2002 отишао сам у ВБА Едитор. Откуцајте Цтрл + Г да бисте отворили непосредни прозор и унесите ово у непосредно окно:

Print xlPasteValidation

Притисните Ентер и Екцел 2002 ће вам рећи да је клПастеВалидатион пријатељски начин да кажете „6“. Поново на машини Екцел 2000, испробао сам овај код:

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

Срећом, успева. Заправо сте присиљени да користите основну вредност уместо константе. Упозоравам на ову праксу у књизи, јер чини програм заиста тешким за читање следећој особи која гледа код. У овом конкретном случају заиста немате избора. Додајте коментар који објашњава зашто сте га кодирали на следећи начин:

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

Дакле - мала лекција је врло специфичан проблем како залепити посебну проверу у Екцел 2000, али већа лекција је детективски рад потребан да би се утврдило шта се дешава када се у Екцел ВБА догоди нешто необично.

Занимљиви Чланци...