Saltar al contenido

Como puedo usar la sentencia "With sheets" para sustituir los .select y los ciclos?


Recommended Posts

publicado

Saludos a todos,

Realice una macro que realiza la simulación Montecarlo, pero debido a mi poca experiencia en programación VBA, el uso excesivo de los ciclos hace que mi programa sea muy lento al realizar varias iteraciones (alrededor de 5000 iteraciones), por lo que necesito ayuda para optimizar el código. Se que se puede usa la sentencia "With Sheets....." pero no entiendo muy bien como se usa. Alguien podria ayudar a optimizar el código? Les presento algunos casos:

1. Primero se carga un archivo con los datos y precios de los títulos que se evaluaran en la simulación Montecarlo, una vez cargados, debo tomar los títulos y colocarlos en otra pestaña, pero estos títulos están en celdas intercalas separadas por una celda que siempre tendrá como titulo "Valor Libros", por lo que cree este código para hacer la copia de los títulos en la segunda pestaña ("DVVariaciones"):

Sub CopiarTitulos()
'Contar columnas en pestanna DVPrecios
ultColumna = Sheets("DVPrecios").Cells(5, Columns.Count).End(xlToLeft).Column
Sheets("DVVariaciones").Cells(1, "C") = ultColumna
Sheets("DVVariaciones").Select
Range("C5").Activate
i = 3
'Fin Contar columnas en pestanna DVPrecios

'Copiar titulos en DVVariaciones
While ultColumna >= i
ActiveCell.FormulaR1C1 = "=IF(DVPrecios!RC<>""VALOR LIBROS"",DVPrecios!RC,"""")"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
If Selection.Value = "" Then Selection.Delete Shift:=xlToLeft
ActiveCell.Offset(0, 1).Select
i = i + 1
Wend


Range("C5").Select
Cells.EntireColumn.AutoFit
' Fin Copiar titulos en DVVariaciones
End Sub[/CODE]

2. Luego de copiar los títulos en la pestaña "DVVariaciones", debo realizar con una formula el calculo de las variaciones de los precios tomando los datos de dos celdas consecutivas en la pestaña anterior de forma que me queda: precio= celdaC5/celdaC6 - 1, esto lo hice grabando la macro, pero no es muy eficiente el código cuando se trata de una gran cantidad de datos. Este es el código:

[CODE]Sub CalcularVarianza()
'para contar el numero de filas
Dim ult As Long
Dim ult2 As Long
Dim i As Long
Dim j As Long
Dim ultimaFila As Long
Dim ultimaColumna As Long




ult = Sheets("DVPrecios").Cells(Rows.Count, 5).End(xlUp).Row
ultimaFila = ult
Sheets("Cálculos").Cells(2, "A") = ultimaFila
i = 1
j = 6


'Contar columnas en pestanna DVPrecios
Column = Sheets("DVPrecios").Cells(5, Columns.Count).End(xlToLeft).Column
Set mc1 = Worksheets("DVPrecios").Cells(5, Column)
FinalRange = mc1.Address(RowAbsolute:=False, ColumnAbsolute:=False)
ultimaColumna = Application.WorksheetFunction.CountIf(Worksheets("DVPrecios").Range("C5:" & FinalRange), "<>VALOR LIBROS")
' Sheets("Cálculos").Select
' Range("A1").Select
Sheets("Cálculos").Cells(1, "A") = ultimaColumna
'Fin Contar columnas en pestanna DVPrecios


Sheets("DVVariaciones").Select
Range("B" & j).Select
ActiveCell.FormulaR1C1 = "1"
Range("C6").Activate


While ultimaFila > j
While ultimaColumna >= i
ActiveCell.FormulaR1C1 = "=IFERROR(DVPrecios!RC/DVPrecios!R[1]C-1,"""")"
ActiveCell.Offset(0, 2).Select
i = i + 1
Wend
'colocar iteracion
j = j + 1
Range("B" & j).Select
ActiveCell.FormulaR1C1 = "=R[-1]C+1"
i = 1
Range("C" & j).Activate
Wend


'Limpiar espacios en blanco
Range("C5").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.Delete Shift:=xlToLeft
Cells.EntireColumn.AutoFit

Range("C5").Activate
End Sub[/CODE]

Me gustaría que fuera menos cíclico y mas eficiente, por lo que agradecería su colaboración. Adjunto la macro y el archivo de carga de los datos para que tengas una idea de lo que he programado.

[ATTACH]36159.vB[/ATTACH]

SimulacionMontecarlo2.zip

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.