Fel när du klistrar in validering i VBA - Excel Tips

Innehållsförteckning

Om du har läst de första kapitlen i VBA och makron för Microsoft Excel, vet du att jag klagar över att Excel-makroinspelaren inte gör det största jobbet med att spela in användbar kod. Vanligtvis fungerar koden bra, men den spelas in på ett sådant sätt att den kanske inte är så användbar för olika datamängder. Koden kan fungera bra idag, men inte imorgon.

Jag stötte på ett riktigt konstigt problem där makroinspelaren faktiskt spelade in kod som inte fungerade. Jag skrev ett makro som försökte kopiera valideringen från en cell till ett cellområde. I Excel 2002 var den här koden följande:

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

Den här koden fungerade bra i Excel 2002, men misslyckades på en klients maskin med Excel 2000. En av de gamla datorerna på kontoret har fortfarande Excel 2000, så jag försökte koden där. Problemet var med xlPasteValidation. När jag stöter på något ovanligt startar jag makroinspelaren för att se hur makroinspelaren skulle spela in koden. Jag ställde in validering i E5, aktiverade makroinspelaren, kopierade E5 och använde Paste Special - Validation. Efter att ha stoppat makroinspelaren noterade jag att Excel 2000 spelade in konstanten som:

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

Så jag gick till klientapplikationen, ändrade koden till xlDataValidation och körde den igen. Konstigt nog, det gav samma fel!

Det visar sig att makroinspelaren i Excel 2000 faktiskt har ett fel. Den registrerar xlDataValidationskonstanten, men makrotolken känner inte igen xlDataValidation eller xlPasteValidation. Excel VBA-hjälp i Excel 2000 låtsas som om det inte finns något sätt att klistra in bara valideringar.

För att detta ska fungera måste du upptäcka det underliggande värdet av xlPasteValidation. På min XL2002-maskin gick jag till VBA Editor. Skriv Ctrl + G för att öppna det omedelbara fönstret och skriv detta i den omedelbara rutan:

Print xlPasteValidation

Klicka på Enter och Excel 2002 berättar att xlPasteValidation är ett vänligt sätt att säga “6”. Tillbaka på Excel 2000-maskinen försökte jag den här koden:

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

Lyckligtvis fungerar det. Du tvingas faktiskt använda det underliggande värdet istället för det konstanta. Jag varnar för denna praxis i boken eftersom det gör programmet väldigt svårt att läsa för nästa person som tittar på koden. I det här fallet har du verkligen inget val. Lägg till en kommentar som förklarar varför du kodade det på detta sätt:

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

Så - den lilla lektionen idag är det mycket specifika problemet med hur man klistrar in specialvalidering i Excel 2000, men den större lektionen är detektivarbetet som krävs för att ta reda på vad som händer när något konstigt händer i Excel VBA.

Intressanta artiklar...