La respuesta anterior probablemente funcionaría con un libro diferente al libro activo , que es lo que necesitaba hacer. Esto es lo que usé
Asegúrese al inicio de que el libro de trabajo esté solo, por ejemplo:
Private Sub Workbook_Open()
If Application.Workbooks.Count > 1 Then 'check if there's >1 open wb's in this instance
If MsgBox("This workbook will be moved to a new instance of Excel," & vbLf & _
"so as to not affect performance of your other workbooks.", _
vbOKCancel + vbInformation + vbDefaultButton1 + vbMsgBoxSetForeground) _
= vbCancel Then Exit Sub
Debug.Print Application.Hinstance, "Moving wb to new instance."
OpenInNewInstance
Debug.Print Application.Hinstance, "Moved wb to new instance."
Else
Debug.Print "This wb is in it's own instance. (#" & Application.Hinstance & ")"
End If
End Sub
Sub OpenInNewInstance()
With ThisWorkbook
.Save 'save workbook before making it read-only
.ChangeFileAccess xlReadOnly 'make this wb read-only (so the other isn't)
Shell ("excel.exe /x """ & .FullName & """") 'open current wb in new instance
.Close 'close this workbook
End With
End Sub
Este código va en el ThisWorkbook
módulo , de modo que cuando se abre el libro de trabajo, se verifica de inmediato para ver si es el único libro abierto en este caso, y si no:
- Guardar libro actual
- Establezca el wb actual como de solo lectura (para evitar que una segunda copia sea un problema)
- Shell al símbolo del sistema para abrir Excel en una nueva instancia (usando el interruptor de
/x
línea de comando de Excel ), cargando otra instancia del libro actual
- Cerrar el libro actual
Si es necesario, puede usar una línea de comando personalizada al abrir la nueva instancia para transferir instrucciones, etc., a la nueva instancia. También podría considerar las ventajas y desventajas de ocultar la ventana de la aplicación para la nueva instancia.