quitar - Excel VBA: ¿cómo borro el portapapeles en otro libro en otra aplicación?
no se puede liberar espacio en el portapapeles excel 2013 (3)
Dado que workbook wb
pertenece a otra instancia de aplicación, debe utilizar
wb.Application.CutCopyMode = False
en lugar
Application.CutCopyMode = False
donde wb.Application
devuelve la instancia de las aplicaciones a la que pertenece el libro de trabajo wb
.
Fondo:
Tengo un script que está formateando Raw Data y anexándolo al final de un libro de análisis que tengo abierto. La secuencia de comandos se ejecuta desde el libro de análisis, ya que los datos sin procesar se completan cada vez.
Problema:
La secuencia de comandos funciona bien con una excepción, no puedo borrar el portapapeles en el otro libro y sospecho que esto se debe a que está abierto en otra instancia (Aplicación) de Excel.
Mi código hasta el momento:
Sub Data_Ready_For_Transfer()
Dim wb As Workbook
Dim ws As Worksheet
Dim rnglog As Range
Dim lastrow As Range
Dim logrange As Range
Dim vlastrow As Range
Dim vlastcol As Range
Dim copydata As Range
Dim pastecell As Range
Dim callno As Range
Set wb = GetObject("Book1")
Set ws = wb.Worksheets("Sheet1")
Application.ScreenUpdating = False
''if we get workbook instance then
If Not wb Is Nothing Then
With wb.Worksheets("Sheet1")
DisplayAlerts = False
ScreenUpdating = False
.Cells.RowHeight = 15
Set rnglog = wb.Worksheets("Sheet1").Range("1:1").Find(What:="Log Date", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
Set lastrow = rnglog.EntireColumn.Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
Set logrange = wb.Worksheets("Sheet1").Range(rnglog, lastrow)
rnglog.EntireColumn.Offset(0, 1).Insert
rnglog.EntireColumn.Offset(0, 1).Insert
rnglog.EntireColumn.Offset(0, 1).Insert
rnglog.EntireColumn.TextToColumns Destination:=rnglog, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 9)), TrailingMinusNumbers:=True
rnglog.Value = "Log Date"
rnglog.Offset(0, 1).Value = "Time"
logrange.Offset(0, 2).FormulaR1C1 = "=WEEKNUM(RC[-2])"
logrange.Offset(0, 2).EntireColumn.NumberFormat = "General"
rnglog.Offset(0, 2).Value = "Week Number"
logrange.Offset(0, 3).FormulaR1C1 = "=TEXT(RC[-3],""mmmm"")"
logrange.Offset(0, 3).EntireColumn.NumberFormat = "General"
rnglog.Offset(0, 3).Value = "Month"
Set vlastrow = wb.Worksheets("Sheet1").Range("A:A").Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
Set vlastcol = vlastrow.EntireRow.Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
Set copydata = .Range("A2", vlastcol)
copydata.Copy
End With
With ActiveWorkbook.Worksheets("RAW Data")
Set pastecell = .Range("A:A").Find(What:="*", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
Set callno = .Range("1:1").Find(What:="Call No", LookAt:=xlPart, MatchCase:=False, SearchOrder:=xlByColumns, SearchDirection:=xlNext)
pastecell.Offset(1, 0).PasteSpecial xlPasteValues
.Cells.RemoveDuplicates Columns:=5, Header:=xlYes
Application.CutCopyMode = False
End With
wb.Close False
Application.ScreenUpdating = True
MsgBox "Done"
End If
End Sub
Pensé que solucionaría el problema cerrando el libro de trabajo de Datos SIN PROCESAR (quiero hacerlo de todos modos), pero recibí un aviso ya que los datos del portapapeles son bastante grandes, así que esto tampoco funciona.
Lo que hago es simplemente copiar cualquier celda en blanco en mi ActiveWorkbook una vez que haya pegado los valores que copié antes y ya no los necesito, y esto reemplaza los datos grandes en el Portapapeles con una cadena vacía (comparativamente nada) y me permite cerrar el libro de trabajo cuando lo necesito.
Entiendo que esto es más bien una solución, pero funciona todo el tiempo.
Otra solución
Lo que debe intentar es obtener el MSForms DataObject
e intentar colocarlo en el portapapeles
Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
y luego despejarlo de la siguiente manera:
clipboard.Clear
Y si esto no funciona, siempre puedes configurar el texto del portapapeles como vacío
clipboard.SetText ""
clipboard.PutInClipboard
Application.CutCopyMode = False
no me funcionó para borrar el búfer ni dejar de obtener un error al intentar ActiveSheet
. Pegar errorActiveSheet
. Pegar error
Para borrar un búfer grande, que está produciendo un error ActiveSheet
.Paste, por ejemplo, es simplemente copiar una celda vacía, por ejemplo, Range("A1").Copy
, donde la celda A1 estaría vacía o muy pequeña. ¡Esto hará que el buffer sea realmente pequeño! ¡Arreglo fácil! Tal vez no precisamente correcto, pero es funcionalmente correcto.