Como hacer rangos variables con macros

Tengo la siguiente macro que he creado entre grabaciones de macros e investigaciones de Internet, pero como no se como programar realmente ya me quede perdido con los últimos retoques

Sub Prueba()
'
' Prueba Macro
'

'
Range("A7:A1000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Application.ScreenUpdating = True
Selection.End(xlUp).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.TextToColumns Destination:=Range("A7"), DataType:=xlDelimited, _
TextQualifier:=xlSingleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
, 1), Array(13, 1), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True
Columns("K:N").Select
Columns("K:N").EntireColumn.AutoFit
Range("H13").Select
ActiveWindow.DisplayGridlines = False
Range("A8").Select

Dim C As Range
Set C = Columns("a").Find("Value", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False)
Do Until C Is Nothing
With C
C.Offset(, 1). Resize(, .CurrentRegion.Columns.Count - 1). Cut Cells(.Row - 1, "ba").End(xlToLeft). Offset(, 1)
C.EntireRow.Delete
End With
Set C = Columns("a").FindNext
Loop

Range("G864").Select
Selection.Insert Shift:=xlToRight
Selection.Insert Shift:=xlToRight
Columns("N:N").Select
Selection.Insert Shift:=xlToRight
Selection.End(xlUp).Select
Range("N7").Select
ActiveCell.FormulaR1C1 = "Variance"
Range("N8").Select
ActiveCell.FormulaR1C1 = "=+RC[-2]-RC[-1]"
Range("N8").Select
Selection.AutoFill Destination:=Range("N8:N864")
Range("N8:N863").Select
Columns("N:N").EntireColumn.AutoFit
Range("M18").Select
Selection.End(xlDown).Select
Range("N864").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-856]C:R[-1]C)"
Columns("K:O").Select
Range("K825").Activate
Columns("K:O").EntireColumn.AutoFit
Range("N841").Select
Selection.End(xlUp).Select
Selection.End(xlToLeft).Select
Selection.End(xlToLeft).Select
Selection.End(xlToLeft).Select
ActiveWindow.SmallScroll Down:=-27
End Sub

Con esta primera parte de la macro:

"Range("A7:A1000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Range("A7:A1000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Application.ScreenUpdating = True"

Estoy diciendo que busque las líneas en blanco de A7:A1000 las elimine, pero como hago para que en lugar de eliminar las líneas en ese rango lo haga hasta la ultima línea donde haya un valor (cualquiera), otra cosa la macro solo se me ejecuta si empiezo posicionado en alguna fila de la columna A, ¿no se porque?

Después en esta parte de la macro yo estoy diciendo que haga una fórmula de suma y resta en la celda N8 y que auto complete la misma fórmula hasta la celda N863, misma pregunta que en la anterior, como hago para que en lugar de la fila 863 se ejecute hasta una fila antes de donde haya un valor, ¿y después como hago para realizar una autosuma de la columna N?

ActiveCell.FormulaR1C1 = "=+RC[-2]-RC[-1]"
Range("N8").Select
Selection.AutoFill Destination:=Range("N8:N863")
Range("N8:N863").Select

2 respuestas

Respuesta

Para saber la última fila que tiene valor, debes usar la siguiente función:

ActiveSheet. UsedRange. SpecialCells(xlCellTypeLastCell)

Solo necesitas aplicarlo a tu función de borrado o de auto-completado...

Saludos... Creo que esto es lo que necesitabas...

En realidad no necesito saber cual es la ultima fila que tiene valor, lo que necesito es aplicar la fórmula de suma y resta hasta una fila antes de la ultima fila con valor

Prueba con esto:

With ActiveSheet 
    LastRow = .Cells(.Rows.Count, "N").End(xlUp).Row 
End With
Selection.AutoFill Destination:= Range("N8" & "'" & LastRow & "'" )

Esto debería hacer que el AutoFill se ejecutase desde el N8 hasta la última celda que tenga valor dentro de la misma columna N.

Si me sirve, solo que tengo otro problema que no había contemplado en mi pregunta inicial

Con esta parte de la macro yo le estoy diciendo que inserte dos columnas a la derecha en celda G864, como hago igual que en lugar de que sea en esta posición fija lo haga en la columna G en la ultima celda con valor ????

Range("G864").Select
Selection.Insert Shift:=xlToRight
Selection.Insert Shift:=xlToRight

 Gracias por tu tiempo realmente 

Es bastante simple...

With ActiveSheet 
    LastRow = .Cells(.Rows.Count, "G").End(xlUp).Row 
End With

Con estas lineas, LastRow contiene el valor de la última casilla, por tanto, lo que tienes que hacer es lo siguiente:

Range("G" & "'" & LastRow & "'").Select
Selection.Insert Shift:=xlToRight
Selection.Insert Shift:=xlToRight

Con esto, la selección será la última casilla de la fila G

Respuesta

Prueba esta macro, sin importar donde tengas tus datos siempre buscara poner la suma de filas y la suma de la columna justo en la suma 14, pruébala y comentas.

Sub ANALIZ()
Set DATOS = ActiveSheet.UsedRange

With DATOS
Set DATOS = .Columns(1)
On Error Resume Next
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
On Error GoTo 0
.TextToColumns Destination:=Range("C7"), DataType:=xlDelimited, _
TextQualifier:=xlSingleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
, 1), Array(13, 1), Array(14, 1), Array(15, 1)), TrailingMinusNumbers:=True

.Columns(14).EntireColumn.Insert
.Columns(14).Formula = "=" & .Cells(1, 14 - 2).Address(False, False) & _
"-" & .Cells(1, 14 - 1).Address(False, False)
.Cells(0, 14) = "VARIANCE"
.Cells(.Rows.Count + 2, 14).Formula = "=SUM(" & .Columns(14).Address & ")"
End With

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas