Division de datos |
Responder |
Autor | |
cforyan
Nuevo Unido: 16/Marzo/2022 Localización: Chile Estado: Sin conexión Puntos: 1 |
Opciones de entrada
Gracias(0)
Enviado: 16/Marzo/2022 a las 21:24 |
Hola, tengo varias columnas con números bastante largas (2000 filas) y quiero hacer una divisón matemática entre estas columnas pero sin tener que recorrer celda por celda ya que cuando lo hago el código demora mucho (alrededor de 10 minutos). Hay forma de hacerlo más rápido? Gracias
Este es mi código For i = 2 To 11 moneda_indice = Sheets("Series").Cells(1, i).Value If Moneda = "CLP" Then If moneda_indice = "US$" Then For j = 5 To Range("A" & Rows.Count).End(xlUp).Row Sheets("Series").Cells(j, i) = Sheets("Series").Cells(j, i) * Sheets("Series").Cells(j, 11) Next End If ElseIf Moneda = "USD" Then If moneda_indice = "$" Then For j = 5 To Range("A" & Rows.Count).End(xlUp).Row Sheets("Series").Cells(j, i) = Sheets("Series").Cells(j, i) / Sheets("Series").Cells(j, 11) Next End If End If Next |
|
emiliove
Administrador Unido: 16/Junio/2009 Localización: Mexico Estado: Sin conexión Puntos: 5694 |
Opciones de entrada
Gracias(0)
|
Me imagino que hablas de Excel te mando al foro adecuado.
PD: Creo que yo fui el que se equivoco de foro, disculpa. Saludos. Editado por emiliove - 16/Marzo/2022 a las 22:19 |
|
AnSanVal
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 16/Marzo/2005 Localización: España Estado: Sin conexión Puntos: 5976 |
Opciones de entrada
Gracias(0)
|
Tu código no está completo. moneda no tiene valor y las variables no están declaradas. Me sorprende que siendo la columna K común para multiplicar/dividir cada número por el valor de K, el bucle i incluya la columna 11 (K), pues (p.e. ) K5/K5 el resultado es siempre 1. ¿? ► Prueba desactivando actualización de pantalla y los eventos, antes de iniciar el bucle i y restáuralos después de finalizarlo. ' . . . Application.ScreenUpdating = False Application.EnableEvents = False ' Aquí FOR i = ... cálculos ... NEXT i Application.ScreenUpdating = True Application.EnableEvents = True ' . . . Editado por AnSanVal - 18/Marzo/2022 a las 03:39 |
|
Saludos desde Tenerife.
|
|
sdgm
Colaborador Unido: 21/Abril/2005 Localización: Guatemala Estado: Sin conexión Puntos: 928 |
Opciones de entrada
Gracias(0)
|
Hola, cforyan. Como comenta Antonio, es muy difícil entender las consultas cuando sólo se publica parte del problema. Es mejor presentar cómo tienes tus datos en la hoja electrónica y explicar un poco más del entorno. Eso ayuda mucho a los que las leemos. Lo que logro entender, es que cuando la moneda es USD, necesitas dividir las columnas con encabezado "$" entre el valor de la columna K, y cuando la moneda es CLP, necesitas multiplicar las columnas con encabezado "US$" por el valor de la columna K. Como comentas, el código suele ser muy lento cuando modificas celdas en la hoja electrónica. Deberías tratar de idear cómo hacerlo utilizando métodos y fórmulas de la hoja electrónica. Verás que así la velocidad de respuesta es mucho mayor. Ahora, suponiendo que te entendí correctamente, considera la siguiente opción: Primero necesitarás crear otra hoja y determinar en una variable cuántas filas tienen tus datos. Esto te permitirá construir tus fórmulas: Dim CeldaActiva As String, Filas As Long CeldaActiva = ActiveCell.Address Sheets.Add ActiveSheet.Name = "CopiaTemp" Sheets("Series").Activate Filas = Range("A" & Rows.Count).End(xlUp).Row Segundo, copias a esta hoja temporal tus datos: Range("A1:K" & Filas).Copy Sheets("CopiaTemp").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Series").Select Tercero, construyes tus fórmulas: If moneda = "USD" Then Range("B5:J" & Filas).Formula = "=IF(B$1=""$"",CopiaTemp!B5/$K5,CopiaTemp!B5)" ElseIf moneda = "CLP" Then Range("B5:J" & Filas).Formula = "=IF(B$1=""US$"",CopiaTemp!B5*$K5,CopiaTemp!B5)" End If Cuarto, una vez que las hayas verificado, las conviertes en valores: Range("B5").Select Range("B5:J" & Filas).Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Y finalmente, eliminas la hoja temporal que agregamos al principio: Application.CutCopyMode = False Application.DisplayAlerts = False Sheets("CopiaTemp").Delete Application.DisplayAlerts = True Range(CeldaActiva).Select Pruébalo agregando uno por uno estos pasos, y comentas los resultados. Saludos! |
|
Cordialmente, David
|
|
edi1
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Nuevo Unido: 22/Mayo/2022 Localización: España Estado: Sin conexión Puntos: 0 |
Opciones de entrada
Gracias(0)
|
Hola compañero, Has probado ha debugear la función, lo puedes hacer muy facil: 1. Haces clic con el botón derecho en la macro en el panel de navegación y luego haga clic en Vista de diseño. 2. En la pestaña Diseño, en el grupo Herramientas, haaces clic en paso único. 3. Haga clic en Ejecutar y ejecutas linea a linea |
|
Responder | |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |