excel - online - visual basic for applications
¿Debo volver a activar.CutCopyMode antes de salir de mi subprocedimiento? (1)
La respuesta corta es que
Application.CutCopyMode = True
no hace nada o hace lo contrario de lo que crees que hace.
Si el estado actual de .CutCopyMode es False, establecerlo en True no activa el ''borde de baile'' y si el estado actual es xlCopy o xlCut (
constantes de enumeración XlCutCopyMode
), establecer .CutCopyMode en True lo desactiva de manera efectiva.
Además, no puede establecer .CutCopyMode en xlCopy o xlCut.
La larga historia comienza con la comprensión de qué propósito realiza la propiedad Application.CutCopyMode y cómo la documentación oficial incorrecta implica que puede volver a activarla.
Cuando corta manualmente (Ctrl + X) o copia (Ctrl + C) una o más celdas en la hoja de trabajo, las celdas adquirirán un ''borde de baile'' que indica el origen de la operación. En este punto, .CutCopyMode no es cero (ya sea xlCopy o xlCut) y existe una relación entre las operaciones de pegado posteriores y tanto el portapapeles de Office como el portapapeles de Windows, ya que retienen el contenido de la fuente.
Si eligió cortar (también conocido como mover ) las celdas, inmediatamente después de pegar (Ctrl + V) las celdas en una nueva ubicación. CutCopyMode se vuelve falso y pierde el ''borde de baile'' alrededor de la fuente. Esto se debe a que no queda contenido en las celdas de origen. El contenido permanece accesible desde el portapapeles de Office pero se elimina del portapapeles de Windows.
Si eligió copiar las celdas, puede pegar las celdas en una ubicación adicional y permanecerá el ''borde de baile''. La propiedad .CutCopyMode permanece distinta de cero (por ejemplo, xlCopy). Puede moverse a otra ubicación y pegar el mismo contenido; .CutCopyMode permanece distinto de cero y el ''borde de baile'' alrededor del contenido original persiste, al igual que la relación con el portapapeles de Office y el portapapeles de Windows.
Si ejecutó el código VBA que incluía
Application.CutCopyMode = False
en este punto, el borde de baile desaparecería y se eliminaría la conexión entre cualquier operación de pegado y el portapapeles de Office.
Este es un buen estado cuando se inicia un subprocedimiento VBA para que cualquier operación potencial de copiar / pegar dentro del código no pueda entrar en conflicto con el estado .CutCopyMode.
Sin embargo, esto solo debería ser necesario en circunstancias especiales (ver el siguiente párrafo).
Ciertas operaciones de Excel son suficientes para romper esta conexión del portapapeles de Office y forzar .CutCopyMode a False.
Una de ellas es iniciar manualmente un subprocedimiento de macro, por lo que hay un beneficio limitado al incluir
Application.CutCopyMode = False
al comienzo de su código.
Sin embargo, puede ser prudente ejecutar dentro de su código si su código ha iniciado una operación
Range.Copy
y ha completado cualquier operación de
método
Worksheet.Paste
o
Range.PasteSpecial
con el contenido de la copia.
Examinar e informar el estado actual de .CutCopyMode se puede hacer con algún código de macro de evento de hoja de trabajo.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case Application.CutCopyMode
Case True
Debug.Print "CutCopyMode is ON"
Case xlCopy
Debug.Print "CutCopyMode is in Copy mode"
Case xlCut
Debug.Print "CutCopyMode is in Cut mode"
Case False
Debug.Print "CutCopyMode is OFF"
Case Else
Debug.Print "???"
End Select
End Sub
Los resultados informados a la ventana Inmediato de VBE serán el modo Copia, el modo Corte o APAGADO. Application.CutCopyMode nunca informará directamente su estado como True².
Si bien puede realizar un cambio en el entorno operativo con
Application.CutCopyMode = False
, nunca he podido activar .CutCopyMode al establecer la propiedad en True.
No se produce ningún error y la documentación oficial establece específicamente que establecer la propiedad en Verdadero
"Inicia el modo Cortar o Copiar y muestra el borde en movimiento".
pero he descubierto que la única forma de recuperar las ''hormigas marchantes'' es iniciar otra operación de copia.
Entonces, para todos los efectos, codificar
Application.CutCopyMode = True
no hace daño.
Sin embargo, la codificación
Application.CutCopyMode = False
puede funcionar bien al renunciar al almacenamiento del portapapeles.
Si alguien puede volver a activar las hormigas marchantes manipulando la propiedad Application.CutCopyMode , me encantaría ver un ejemplo.
¹
La ''frontera danzante'' también se conoce coloquialmente como ''hormigas marchantes''.
²
Mientras que un valor booleano de Verdadero o Falso es un tipo distinto, para todos los efectos, Falso es igual a cero y cualquier cosa que no sea Falso es Verdadero.
Si se resuelve el número booleano ►, un VBA Falso es 0 y Verdadero siempre es igual a (-1) pero si se resuelve el número reverso ► booleano, cualquier número que no sea cero se considera Verdadero y un cero se considera Falso.
Para optimizar mi código, desactivo varias propiedades de miembro de Application Object ; uno en particular es la propiedad .CutCopyMode .
Sub MyProcedure()
With Application
.ScreenUpdating = False
.EnableEvents = False
.CutCopyMode = False
End With
'' lots of code here
¿Debo volver a activar .CutCopyMode (por ejemplo, True) con los demás antes de que finalice mi subcampo?
'' lots of code here
With Application
.ScreenUpdating = True
.EnableEvents = True
.CutCopyMode = True ''<~~ ???
End With
End Sub