Tengo una hoja de cálculo de Excel que se actualiza diariamente. Genera una lista basada en los datos actualizados. Digamos que genera una lista de todos los que necesitan completar una tarea en particular ese día. Esa lista cambia en longitud día a día. Para lograr el resultado necesario, utiliza fórmulas en una estructura "si otra celda en esta fila no está en blanco, haz...":
=SI(LARGO(I4)=0),"",)
A veces esta lista puede ser bastante larga. En lugar de requerir que el usuario se desplace demasiado, me gustaría proporcionar un botón "copiar al portapapeles". Luego, los usuarios pegan las filas en otra aplicación. No he tenido ningún problema para que copie una lista con una longitud fija; por ejemplo, copiar M4 a M500 en el portapapeles es fácil. Pero digamos que hoy, la lista solo llega a M286, y mañana es a M117, y así sucesivamente. Me gustaría copiar solo las celdas llenas, no las que siguen en blanco.
Esto es lo que he recopilado de Google:
Private Sub CommandButton1_Click() Application.ScreenUpdating = False Dim xSheet As Worksheet firstBlankRow = Worksheets("Sheet1").Range("M4").End(xlDown).Row + 1 MsgBox (unusedRow) Set xSheet = ActiveSheet xSheet.Range("M4:M" & firstBlankRow).Copy Application.ScreenUpdating = True End SubEsto encuentra con éxito la última celda con una fórmula. Sin embargo, eso no es exactamente lo que busco. Quiero la última celda con un valor, ese valor generado por la fórmula. En este caso particular, "última celda con un valor" siempre será "celda antes de la primera celda en blanco". No habrá huecos en la lista. Entonces, ¿estoy cerca? ¿Cómo consigo que encuentre hasta la última celda con un valor? Gracias.
="" o ' ) en la parte inferior de una columna, use el método Find con el parámetro de su argumento LookIn establecido en xlValues . Módulo de hoja, por ejemplo, Sheet1
Me ) desde donde se copiará. Option Explicit Private Sub CommandButton1_Click() CopyColumnNonBlanks Me.Range("M4") End Sub Módulo estándar, por ejemplo, Module1
Opcionalmente, puedes ponerlo en el módulo de la hoja con el primer código (no recomendado). Entonces tendrás que llamarlo con, por ejemplo
Sheet1.CopyColumnNonBlanks(ThisWorkbook.Worksheets("Sheet2").Range("A4"))para otra hoja de trabajo.
Option Explicit Sub CopyColumnNonBlanks(ByVal FirstCell As Range) With FirstCell.Cells(1) Dim lCell As Range: Set lCell = .Resize(.Worksheet.Rows.Count _ - .Row + 1).Find("*", , xlValues, , , xlPrevious) If lCell Is Nothing Then MsgBox "All cells in the column range are blank.", vbCritical Exit Sub End If .Resize(lCell.Row - .Row + 1).Copy End With End Sub