Feil når du limer inn validering i VBA - Excel-tips

Innholdsfortegnelse

Hvis du har lest de første kapitlene i VBA og makroer for Microsoft Excel, vet du at jeg klager over at Excel-makroopptakeren ikke gjør den største jobben med å registrere brukbar kode. Vanligvis fungerer koden bra, men den er registrert på en slik måte at den kanskje ikke er så nyttig for datasett med forskjellige størrelser. Koden kan fungere bra i dag, men ikke i morgen.

Jeg fikk et veldig rart problem der makroopptakeren faktisk spilte inn kode som ikke fungerte. Jeg skrev en makro som prøvde å kopiere valideringen fra en celle til en rekke celler. I Excel 2002 var denne koden som følger:

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

Denne koden fungerte bra i Excel 2002, men mislyktes på en klients maskin med Excel 2000. En av de gamle datamaskinene på kontoret har fremdeles Excel 2000, så jeg prøvde koden der. Problemet var med xlPasteValidation. Hver gang jeg støter på noe uvanlig, starter jeg makroopptakeren for å se hvordan makroopptakeren vil spille inn koden. Jeg satte opp validering i E5, slått på makroopptakeren, kopierte E5 og brukte Paste Special - Validation. Etter å ha stoppet makroopptakeren, la jeg merke til at Excel 2000 registrerte konstanten som:

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

Så jeg gikk til klientapplikasjonen, endret koden til xlDataValidation og kjørte den igjen. Merkelig, det ga den samme feilen!

Det viser seg at Excel 2000-makroopptakeren faktisk har en feil. Den registrerer xlDataValidation-konstanten, men makrotolkeren gjenkjenner verken xlDataValidation eller xlPasteValidation. Excel VBA Help i Excel 2000 later som om det ikke er noen måte å lime inn bare valideringer.

For å få dette til å fungere, må du oppdage den underliggende verdien av xlPasteValidation. På min XL2002-maskin gikk jeg til VBA Editor. Skriv Ctrl + G for å åpne det umiddelbare vinduet og skriv dette i den umiddelbare ruten:

Print xlPasteValidation

Trykk på Enter og Excel 2002 vil fortelle deg at xlPasteValidation er en vennlig måte å si "6" på. Tilbake på Excel 2000-maskinen prøvde jeg denne koden:

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

Heldigvis fungerer det. Du blir faktisk tvunget til å bruke den underliggende verdien i stedet for konstanten. Jeg advarer mot denne praksisen i boken, da det gjør programmet veldig vanskelig å lese for neste person som ser på koden. I dette spesielle tilfellet har du egentlig ikke noe valg. Legg til en kommentar som forklarer hvorfor du kodet det på denne måten:

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

Så - den lille leksjonen i dag er det helt spesifikke problemet med hvordan du limer inn spesiell validering i Excel 2000, men den større leksjonen er detektivarbeidet som kreves for å finne ut hva som skjer når noe rart skjer i Excel VBA.

Interessante artikler...