Ja esat izlasījis dažas pirmās programmas VBA un makro Microsoft Excel sadaļas, jūs zināt, ka es sūdzos, ka Excel makro reģistrators neveic vislielāko darbu, reģistrējot izmantojamo kodu. Parasti kods darbojas labi, taču tas tiek ierakstīts tā, ka, iespējams, tas nav tik noderīgs dažāda lieluma datu kopām. Kods šodien varētu darboties labi, bet ne rīt.
Es saskāros ar patiešām dīvainu problēmu, kad makro reģistrators faktiski ierakstīja nederīgu kodu. Es rakstīju makro, kas mēģināja kopēt validāciju no vienas šūnas uz šūnu diapazonu. Programmā Excel 2002 šis kods bija šāds:
Range(“E5”).Copy Range(“E6:E12”).PasteSpecial Paste:=xlPasteValidation
Šis kods programmā Excel 2002 darbojās lieliski, taču neizdevās klienta mašīnā ar programmu Excel 2000. Vienā no vecajiem biroja datoriem joprojām ir programma Excel 2000, tāpēc es tur izmēģināju kodu. Problēma bija saistīta ar xlPasteValidation. Ikreiz, kad man rodas kaut kas neparasts, es ieslēdzu makro reģistratoru, lai redzētu, kā makro reģistrators ierakstīs kodu. Es iestatīju validāciju E5, ieslēdzu makro reģistratoru, nokopēju E5 un izmantoju Paste Special - Validation. Pēc makro reģistratora apturēšanas es atzīmēju, ka Excel 2000 reģistrēja konstanti kā:
Range(“E6:E12”).PasteSpecial Paste:=xlDataValidation
Tātad, es devos uz klienta lietojumprogrammu, nomainīju kodu uz xlDataValidation un palaidu to vēlreiz. Dīvainā kārtā tas radīja to pašu kļūdu!
Izrādās, ka makro ierakstītājā Excel 2000 faktiski ir kļūda. Tas reģistrēs xlDataValidation konstanti, bet makro tulks neatpazīs ne xlDataValidation, ne xlPasteValidation. Excel VBA palīdzība programmā Excel 2000 izliekas, ka nav iespējams ielīmēt tikai validācijas.
Lai veiktu šo darbu, jums jāatklāj xlPasteValidation pamatvērtība. Ar savu mašīnu XL2002 es devos uz VBA redaktoru. Ierakstiet Ctrl + G, lai atvērtu tūlītējo logu, un ierakstiet to tiešajā rūtī:
Print xlPasteValidation
Nospiediet Enter un Excel 2002 pateiks, ka xlPasteValidation ir draudzīgs veids, kā pateikt “6”. Atpakaļ uz Excel 2000 mašīnu, es izmēģināju šo kodu:
Range(“E6:E12”).PasteSpecial Paste:=6
Par laimi tas darbojas. Jūs faktiski esat spiests izmantot nemainīgās vērtības pamatā esošo vērtību. Es brīdinu no šīs grāmatas prakses, jo tas padara programmu ļoti grūti lasāmu nākamajai personai, kas skatās kodu. Šajā konkrētajā gadījumā jums patiešām nav citas izvēles. Pievienojiet komentāru, kurā paskaidrots, kāpēc jūs to kodējāt šādi:
‘Bug in XL2000; need to use “6” instead of the constant Range(“E6:E12”).PasteSpecial Paste:=6
Tātad - mazā nodarbība šodien ir ļoti specifiska problēma, kā ielīmēt īpašu validāciju programmā Excel 2000, bet lielāka nodarbība ir detektīvdarbs, kas nepieciešams, lai noskaidrotu, kas notiek, kad Excel VBA notiek kaut kas dīvains.