Después de una búsqueda en la Internet, encontré un pequeño comentario de Bob Umlas (Excel MVP):
Data validation across sheets isn't supported. You may need an event macro with code to do the checking for you as the worksheet changes (no se puede aplicar validación de datos a través de varias hojas. Habría que usar una macro de tipo evento para hacer la comprobación a medida que se van introduciendo cambios en la hoja).
En las notas mostré dos métodos con fórmulas en contradicción con el comentario de Umlas. El problema con los métodos que expuse en mis notas es que no funcionan. Así que como gesto de contrición y arrepentimiento (que viene a ser lo mismo), aquí va mi nota sobre como validar datos a través de las hojas de un cuaderno utilizando Vba (macros).
Siguiendo con el ejemplo que expuse en esas notas, tenemos un cuaderno con tres hojas; en cada hoja hay una lista de nombres. La idea es que no podamos ingresar en cualquiera de las listas un nombre que ya existe en cualquiera de las otras listas.
Para cada lista hemos creado un nombre que se refiere al rango en forma dinámica (con la función DESREF)
=DESREF(Hoja1!$A$2;0;0;CONTARA(Hoja1!$A:$A)-1;1)
=DESREF(Hoja2!$A$2;0;0;CONTARA(Hoja2!$A:$A)-1;1)
=DESREF(Hoja3!$A$2;0;0;CONTARA(Hoja3!$A:$A)-1;1)
Lo que hacemos ahora es crear un evento de manera que cuando se produzca un cambio en alguna de las hojas, el evento dispare una macro que controle si el nuevo valor introducido en alguna de las tres listas ya existe.
El código de la macro que hace esta tarea es:
Sub valid_accross_sheets(valValue)
Dim iValCalc As Integer
iValCalc = WorksheetFunction.CountIf(Range("Lista1"), valValue) + _
WorksheetFunction.CountIf(Range("Lista2"), valValue) + _
WorksheetFunction.CountIf(Range("Lista3"), valValue)
If iValCalc > 1 Then
ActiveCell.ClearContents
MsgBox "El valor " & ActiveCell.Value & " ya existe"
End If
End Sub
Esta macro usa la función CONTAR.SI de Excel para comprobar cuantas veces aparece el valor de la celda activa (en la que hemos introducido el valor). Si el valor aparece más de una vez, el contenido de la celda activa es borrado y aparece un mensaje diciendo que el valor ya existe.
El valor de la celda activa es pasado a la macro por evento Workbook_SheetChange del objeto ThisWorkbook. Usamos este evento para evitar tener que programar un evento para cada hoja
El código es muy sencillo: hace una llamada a la macro valid_accross_sheets(valValue) pasando el valor de Target (la celda en la que hemos ingresado el nuevo valor).
Un detalle a tener en cuenta es que los rangos de los nombres deben ser continuos. Si dejamos una fila en blanco, el rango dinámico no incluirá el nuevo valor y la validación fallará.
El cuaderno con el ejemplo puede descargarse aquí.