Si ha leído los primeros capítulos de VBA y macros para Microsoft Excel, sabrá que me quejo de que la grabadora de macros de Excel no hace el mejor trabajo al registrar código utilizable. Por lo general, el código funciona bien, pero se registra de tal manera que puede no ser tan útil para conjuntos de datos de diferentes tamaños. El código podría funcionar bien hoy, pero no mañana.
Me encontré con un problema realmente extraño en el que la grabadora de macros realmente grababa un código que no funcionaba. Estaba escribiendo una macro que intentó copiar la validación de una celda a un rango de celdas. En Excel 2002, este código era el siguiente:
Range(“E5”).Copy Range(“E6:E12”).PasteSpecial Paste:=xlPasteValidation
Este código funcionó bien en Excel 2002, pero falló en la máquina de un cliente con Excel 2000. Una de las computadoras viejas de la oficina todavía tiene Excel 2000, así que probé el código allí. El problema fue con xlPasteValidation. Siempre que me encuentro con algo inusual, enciendo la grabadora de macros para ver cómo la grabadora de macros grabaría el código. Configuré la validación en E5, encendí la grabadora de macros, copié E5 y usé Pegado especial - Validación. Después de detener la grabadora de macros, noté que Excel 2000 registró la constante como:
Range(“E6:E12”).PasteSpecial Paste:=xlDataValidation
Entonces, fui a la aplicación cliente, cambié el código a xlDataValidation y lo ejecuté nuevamente. ¡Curiosamente, produjo el mismo error!
Resulta que la grabadora de macros de Excel 2000 tiene un error. Registrará la constante xlDataValidation, pero el intérprete de macros no reconocerá ni xlDataValidation ni xlPasteValidation. La Ayuda de Excel VBA en Excel 2000 pretende que no hay forma de pegar solo validaciones.
Para que esto funcione, debe descubrir el valor subyacente de xlPasteValidation. En mi máquina XL2002, fui al Editor de VBA. Escriba Ctrl + G para abrir la ventana inmediata y escriba esto en el panel inmediato:
Print xlPasteValidation
Presione enter y Excel 2002 le dirá que xlPasteValidation es una forma amigable de decir “6”. De vuelta en la máquina Excel 2000, probé este código:
Range(“E6:E12”).PasteSpecial Paste:=6
Afortunadamente, funciona. En realidad, se ve obligado a utilizar el valor subyacente en lugar de la constante. Advierto contra esta práctica en el libro ya que hace que el programa sea realmente difícil de leer para la próxima persona que mire el código. En este caso particular, realmente no tiene otra opción. Agregue un comentario que explique por qué lo codificó de esta manera:
‘Bug in XL2000; need to use “6” instead of the constant Range(“E6:E12”).PasteSpecial Paste:=6
Entonces, la pequeña lección de hoy es el problema muy específico de cómo pegar una validación especial en Excel 2000, pero la lección más grande es el trabajo de detective requerido para descubrir qué está sucediendo cuando sucede algo extraño en Excel VBA.