Macro con Filas Variables

Hola tengo una macro que hace varias operaciones matemáticas y lógicas, pero cada día aumenta unas 500 filas, por lo que debe desplazarse el rango hasta la última fila con datos.
Por ejemplo: El rango de ayer estaba hasta la 35000, hoy es hasta la 35500 y la macro solo funciona hasta el primer rango de cuando genere la macro. Gracias por su ayuda.

1 respuesta

Respuesta
1
Utiliza la forma concatenada para rangos variables
por ejemplo si deseas utilizar un macro en donde las filas varian entonces debes hacer lo sgte
primero contar las filas que contengan datos ( importante no tener filas vacias entre los datos)
fila=Application.WorksheetFunction.CountA (Range("A:A")) +1 ' cuenta elementos de columna A, con esto sabemos cual seria la ultima fila y le agregamos 1 para actuar dese la sgte ( vacia)
Range("A" & fila) = 1 ' pondrias un 1 en la sgte celda vacia despues del ultimo dato
asi tu rango se cuelve variable en funcion del contenido de la columna
Gracias por tu valiosa colaboración!!!
Soy novata en el tema =) y me surge una duda...
En donde dejo la instrucción que me das? =S
Gracias!!!
Veamos tu macro... a ver si te la adapto para que tome rangos variables
el código es este:
Sub COMISION()
'
' COMISION Macro
'
'
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 5), 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), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), _
Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array( _
46, 1), Array(47, 1), Array(48, 1), Array(49, 1), Array(50, 1), Array(51, 1)), _
TrailingMinusNumbers:=True
Columns("J:J").Select
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.Replace What:="", Replacement:="NL", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Columns("E:E").Select
Selection.Delete Shift:=xlToLeft
Columns("J:J").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("J1").Select
ActiveCell.FormulaR1C1 = "DIAS"
Range("J2").Select
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-6]"
Range("J2").Select
Selection.NumberFormat = "General"
Range("J2").Select
Selection.AutoFill Destination:=Range("J2:J34553")
Range("J2:J34553").Select
ActiveWindow.ScrollRow = 144
ActiveWindow.ScrollRow = 930
ActiveWindow.ScrollRow = 3289
ActiveWindow.ScrollRow = 6220
ActiveWindow.ScrollRow = 10724
ActiveWindow.ScrollRow = 17587
ActiveWindow.ScrollRow = 20375
ActiveWindow.ScrollRow = 22805
ActiveWindow.ScrollRow = 24592
ActiveWindow.ScrollRow = 25522
ActiveWindow.ScrollRow = 26451
ActiveWindow.ScrollRow = 27309
ActiveWindow.ScrollRow = 28381
ActiveWindow.ScrollRow = 29739
ActiveWindow.ScrollRow = 31098
ActiveWindow.ScrollRow = 31670
ActiveWindow.ScrollRow = 32170
ActiveWindow.ScrollRow = 32742
ActiveWindow.ScrollRow = 33242
ActiveWindow.ScrollRow = 33743
ActiveWindow.ScrollRow = 34386
ActiveWindow.ScrollRow = 34529
ActiveWindow.ScrollRow = 34315
ActiveWindow.ScrollRow = 33457
ActiveWindow.ScrollRow = 31670
ActiveWindow.ScrollRow = 29525
ActiveWindow.ScrollRow = 26737
ActiveWindow.ScrollRow = 17944
ActiveWindow.ScrollRow = 10795
ActiveWindow.ScrollRow = 4004
ActiveWindow.ScrollRow = 1
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("K2:K3").Select
ActiveWindow.SmallScroll ToRight:=8
Columns("L:P").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("S:S").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("S1").Select
ActiveCell.FormulaR1C1 = "TOTAL CONSUMO IMEI 6 MESES"
Range("S2").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-6]:RC[-1])"
Columns("R:R").Select
Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("S2").Select
Selection.AutoFill Destination:=Range("S2:S34553")
Range("S2:S34553").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("P:R").Select
Range("R1").Activate
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("M:M").Select
Selection.Delete Shift:=xlToLeft
Columns("P:P").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("P1").Select
ActiveCell.FormulaR1C1 = "TOTAL CARGAS Y MICROS"
Range("P2").Select
ActiveCell.FormulaR1C1 = _
"=+RC[1]+RC[3]++RC[5]+RC[7]+RC[9]+RC[11]+RC[13]+RC[15]+RC[17]+RC[19]+RC[21]+RC[23]"
Range("P2").Select
ActiveCell.FormulaR1C1 = _
"=+RC[1]+RC[3]+RC[5]+RC[7]+RC[9]+RC[11]+RC[13]+RC[15]+RC[17]+RC[19]+RC[21]+RC[23]"
Columns("Q:Q").Select
Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("P2").Select
Selection.AutoFill Destination:=Range("P2:P34553")
Range("P2:P34553").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("Q:AN").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("S:S").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("S1").Select
ActiveCell.FormulaR1C1 = "VOZXMIN + SMSXMIN"
Columns("R:R").Select
Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("S2").Select
ActiveCell.FormulaR1C1 = "=+RC[-1]+RC[-2]"
Range("S2").Select
Selection.AutoFill Destination:=Range("S2:S34553")
Range("S2:S34553").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("V1").Select
End Sub
Gracias!!!!
Ok
Ya veo lo que hay que modificar estas tomando actualmente hstas fila 34553, bien. Necesito saber en funcion de que tomas este valor... es decir, por que hasta ese rango es por la cantidad de datos que hay en columna A o en alguna otra.
Necesito saber que considerar para contar el rango final.
¿Tu dices "por lo que debe desplazarse el rango hasta la última fila con datos" en que columna estan esos datos?.
lo tomo por la cantidad de datos que hay en la columna A, hasta el momento de elaborar la macro.
La macro sòlo hace las operaciones hasta fila 34553 que es el dato de ayer en este caso y para mañana que son 35000 aprox los que quedan despues de la fila 34553 ya no hace las operaciones hacia abajo de la ultima fila... Lo que hace que tenga que hacerlo todo otra vez =(
Espero haber sido clara.. =)
Mil gracias por tu ayuda.
Ok.
Aqui esta tu macro:
Sub COMISION()
'
' COMISION Macro
Dim fila As Long
fila = Application.WorksheetFunction.CountA(Range("A:A"))
If fila = 0 Then Exit Sub ' si no hay datos no corre el macro
Application.ScreenUpdating = False ' elimina refresco en pantalla para que se ejecute mas rapido
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 5), 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), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array( _
33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), _
Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array( _
46, 1), Array(47, 1), Array(48, 1), Array(49, 1), Array(50, 1), Array(51, 1)), _
TrailingMinusNumbers:=True
Columns("J:J").Select
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.NumberFormat = "m/d/yyyy"
Selection.Replace What:="", Replacement:="NL", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Columns("E:E").Select
Selection.Delete Shift:=xlToLeft
Columns("J:J").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("J1").Select
ActiveCell.FormulaR1C1 = "DIAS"
Range("J2").Select
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-6]"
Range("J2").Select
Selection.NumberFormat = "General"
Range("J2").Select
Selection.AutoFill Destination:=Range("J2" & ":" & "J" & fila)
Range("J2" & ":" & "J" & fila).Select
ActiveWindow.ScrollRow = 144
ActiveWindow.ScrollRow = 930
ActiveWindow.ScrollRow = 3289
ActiveWindow.ScrollRow = 6220
ActiveWindow.ScrollRow = 10724
ActiveWindow.ScrollRow = 17587
ActiveWindow.ScrollRow = 20375
ActiveWindow.ScrollRow = 22805
ActiveWindow.ScrollRow = 24592
ActiveWindow.ScrollRow = 25522
ActiveWindow.ScrollRow = 26451
ActiveWindow.ScrollRow = 27309
ActiveWindow.ScrollRow = 28381
ActiveWindow.ScrollRow = 29739
ActiveWindow.ScrollRow = 31098
ActiveWindow.ScrollRow = 31670
ActiveWindow.ScrollRow = 32170
ActiveWindow.ScrollRow = 32742
ActiveWindow.ScrollRow = 33242
ActiveWindow.ScrollRow = 33743
ActiveWindow.ScrollRow = 34386
ActiveWindow.ScrollRow = 34529
ActiveWindow.ScrollRow = 34315
ActiveWindow.ScrollRow = 33457
ActiveWindow.ScrollRow = 31670
ActiveWindow.ScrollRow = 29525
ActiveWindow.ScrollRow = 26737
ActiveWindow.ScrollRow = 17944
ActiveWindow.ScrollRow = 10795
ActiveWindow.ScrollRow = 4004
ActiveWindow.ScrollRow = 1
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("K2:K3").Select
ActiveWindow.SmallScroll ToRight:=8
Columns("L:P").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("S:S").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("S1").Select
ActiveCell.FormulaR1C1 = "TOTAL CONSUMO IMEI 6 MESES"
Range("S2").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-6]:RC[-1])"
Columns("R:R").Select
Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("S2").Select
Selection.AutoFill Destination:=Range("S2" & ":" & "S" & fila)
Range("S2" & ":" & "S" & fila).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("P:R").Select
Range("R1").Activate
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("M:M").Select
Selection.Delete Shift:=xlToLeft
Columns("P:P").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("P1").Select
ActiveCell.FormulaR1C1 = "TOTAL CARGAS Y MICROS"
Range("P2").Select
ActiveCell.FormulaR1C1 = _
"=+RC[1]+RC[3]++RC[5]+RC[7]+RC[9]+RC[11]+RC[13]+RC[15]+RC[17]+RC[19]+RC[21]+RC[23]"
Range("P2").Select
ActiveCell.FormulaR1C1 = _
"=+RC[1]+RC[3]+RC[5]+RC[7]+RC[9]+RC[11]+RC[13]+RC[15]+RC[17]+RC[19]+RC[21]+RC[23]"
Columns("Q:Q").Select
Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("P2").Select
Selection.AutoFill Destination:=Range("P2" & ":" & "P" & fila)
Range("P2" & ":" & "P" & fila).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("Q:AN").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("S:S").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("S1").Select
ActiveCell.FormulaR1C1 = "VOZXMIN + SMSXMIN"
Columns("R:R").Select
Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("S2").Select
ActiveCell.FormulaR1C1 = "=+RC[-1]+RC[-2]"
Range("S2").Select
Selection.AutoFill Destination:=Range("S2" & ":" & "S" & fila)
Range("S2" & ":" & "S" & fila).Select
Selection.Copy
Range("V1").Select
Application.ScreenUpdating = True 'Activa refresco en pantalla
Application.CutCopyMode = False
MsgBox "Terminado", vbInformation
End Sub
Ahora tomara tantas filas como datos tengas en columna A, ( imprtante no tener filas vacias entre dato y dato de columna A)
No olvides cerrar la pregunta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas