Помилка при вставці перевірки у VBA - Поради Excel

Зміст

Якщо ви прочитали кілька перших розділів VBA та макросів для Microsoft Excel, ви знаєте, що я скаржусь, що макрореєстратор Excel не робить найбільшої роботи із запису корисного коду. Зазвичай код працює нормально, але він записується таким чином, що може бути не таким корисним для наборів даних різного розміру. Код може працювати нормально сьогодні, але не завтра.

Я зіткнувся з дійсно дивною проблемою, коли рекордер макросів фактично записав код, який не працював. Я писав макрос, який намагався скопіювати перевірку з однієї комірки в діапазон комірок. В Excel 2002 цей код був таким:

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

Цей код працював нормально в Excel 2002, але не вдався на клієнтській машині з Excel 2000. Один із старих комп'ютерів в офісі все ще має Excel 2000, тому я спробував там код. Проблема була у xlPasteValidation. Щоразу, коли я стикаюся з чимось незвичним, я запускаю макрореєстратор, щоб побачити, як макрофіксатор запише код. Я налаштував перевірку в E5, увімкнув макрореєстратор, скопіював E5 і використав спеціальну вставку - перевірка. Після зупинки запису макросів я зазначив, що Excel 2000 записав константу як:

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

Отже, я перейшов до клієнтської програми, змінив код на xlDataValidation і запустив його знову. Дивно, але це призвело до тієї ж помилки!

Виявляється, макрореєстратор Excel 2000 насправді має помилку. Він запише константу xlDataValidation, але інтерпретатор макросів не розпізнає ні xlDataValidation, ні xlPasteValidation. Довідка Excel VBA у програмі Excel 2000 видає, що немає можливості вставити лише перевірки.

Щоб зробити цю роботу, вам потрібно виявити основне значення xlPasteValidation. На своїй машині XL2002 я перейшов до редактора VBA. Наберіть Ctrl + G, щоб відкрити безпосереднє вікно, і введіть це на безпосередній панелі:

Print xlPasteValidation

Натисніть Enter, і Excel 2002 скаже вам, що xlPasteValidation - це дружній спосіб сказати "6". Ще на машині Excel 2000 я спробував такий код:

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

На щастя, це працює. Ви насправді змушені використовувати базове значення замість константи. Я застерігаю від такої практики в книзі, оскільки це ускладнює читання програми для наступної людини, яка дивиться на код. У цьому конкретному випадку у вас справді немає вибору. Додайте коментар із поясненням, чому ви закодували його таким чином:

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

Отже - невеликий урок сьогодні - це цілком конкретна проблема, як вставити спеціальну перевірку в Excel 2000, але більший урок - це детективна робота, необхідна для з’ясування того, що відбувається, коли в Excel VBA відбувається щось дивне.

Цікаві статті...