Es imposible evitar que se copien las macros... Cuando copias un libro Excel que contiene macros, se copia todo lo que este contiene.-
Sería fácil evitar que se vean (Protegiendo el código VBA), pero es imposible evitar que se ejecuten las macros o que se incluyan dentro del documento copiado. Aunque fuese un programa .EXE, creado con cualquier lenguaje de programación, siempre que copias el programa, estás copiando todo lo que contiene... incluido el código para ejecutarse... Y se ejecutaría... Ahora bien... Despues de darle muchas vueltas, creo que podría decirte un truco para evitar que las macros se ejecuten si no están en un determinado ordenador...
El truco consistiría en crear un archivo de texto vacio en cualquier carpeta de tu ordenador y crear una macro que verifique que el archivo existe en la carpeta esperada.
En el caso de que alguien copie tu documento Excel, no se le va a ocurrir copiar el documento de texto vacío escondido en otra carpeta, por lo tanto, cuando lo ejecute en otro ordenador que no sea el tuyo, tu controlarás qué es lo que va a funcionar (solamente el Excel -Evitando la ejecución de las macros- o si quieres, ni siquiera el Excel -cerrando el documento totalmente-)
La macro para comprobar si existe el archivo sería algo como esto:
Function BuscarArchivo() as boolean 'Devolverá verdad o falso si existe o no
Const Archivo="C:\Carpeta_Archivo\NombreArchivo.txt"
If Len(Dir$(Archivo)) Then
BuscarArchivo = True
Else
BuscarArchivo = False
End If
End Function
Despues de esto, solo te queda incluir la funcion "BuscarArchivo" en tus Macros y decidir qué hacer. Algo como esto:
Private Sub MiMacro()
If BuscarArchivo= False then
MsgBox "Este documento está copiado del original"
Application.DisplayAlerts = False
ThisWorkbook.Close 'Cierra el libro y termina
'o bien Exit Sub 'Sale sin ejecutar la macro
End if
.... Aqui va el resto del codigo de macro.
End Sub
Saludo y espero que puntues bien mi respuesta.... ;-)