Hvis du har læst de første par kapitler i VBA og makroer til Microsoft Excel, ved du, at jeg klager over, at Excel-makrooptageren ikke gør det største job med at optage brugbar kode. Normalt fungerer koden fint, men den registreres på en sådan måde, at den måske ikke er så nyttig til datasæt med forskellige størrelser. Koden fungerer muligvis fint i dag, men ikke i morgen.
Jeg løb ind i et virkelig mærkeligt problem, hvor makrooptageren faktisk optog kode, der ikke fungerede. Jeg skrev en makro, der forsøgte at kopiere valideringen fra en celle til en række celler. I Excel 2002 var denne kode som følger:
Range(“E5”).Copy Range(“E6:E12”).PasteSpecial Paste:=xlPasteValidation
Denne kode fungerede fint i Excel 2002, men mislykkedes på en klients maskine med Excel 2000. En af de gamle computere på kontoret har stadig Excel 2000, så jeg prøvede koden der. Problemet var med xlPasteValidation. Når jeg løber ind i noget usædvanligt, starter jeg makrooptageren for at se, hvordan makrooptageren vil optage koden. Jeg oprettede validering i E5, tændte for makrooptageren, kopierede E5 og brugte Indsæt speciel - validering. Efter at have stoppet makrooptageren bemærkede jeg, at Excel 2000 registrerede konstanten som:
Range(“E6:E12”).PasteSpecial Paste:=xlDataValidation
Så jeg gik til klientapplikationen, ændrede koden til xlDataValidation og kørte den igen. Mærkeligt nok producerede det den samme fejl!
Det viser sig, at Excel 2000-makrooptageren faktisk har en fejl. Den registrerer xlDataValidation-konstanten, men makrotolken genkender hverken xlDataValidation eller xlPasteValidation. Excel VBA-hjælp i Excel 2000 foregiver at der ikke er nogen måde at indsætte kun valideringer.
For at få dette til at fungere, skal du finde den underliggende værdi af xlPasteValidation. På min XL2002-maskine gik jeg til VBA Editor. Skriv Ctrl + G for at åbne det øjeblikkelige vindue og skriv dette i den umiddelbare rude:
Print xlPasteValidation
Klik på Enter, og Excel 2002 vil fortælle dig, at xlPasteValidation er en venlig måde at sige “6” på. Tilbage på Excel 2000-maskinen prøvede jeg denne kode:
Range(“E6:E12”).PasteSpecial Paste:=6
Heldigvis fungerer det. Du er faktisk tvunget til at bruge den underliggende værdi i stedet for konstanten. Jeg advarer mod denne praksis i bogen, da det gør programmet virkelig svært at læse for den næste person, der ser på koden. I dette særlige tilfælde har du virkelig ikke noget valg. Tilføj en kommentar, der forklarer, hvorfor du kodede det på denne måde:
‘Bug in XL2000; need to use “6” instead of the constant Range(“E6:E12”).PasteSpecial Paste:=6
Så - den lille lektion i dag er det meget specifikke problem med, hvordan man indsætter speciel validering i Excel 2000, men jo større lektion er det detektivarbejde, der kræves for at finde ud af, hvad der sker, når der sker noget underligt i Excel VBA.