Tengo una macro que convierte un de Excel a TXT, quisiera gregarle operaciones como multiplicación y redondear el resultado.

Tengo una macro en excel que convierte un archivo de excel a TXT de acuerdo a una información que alimentó manual. En alguna columnas hay que hacer operaciones como multiplicación de acuerdo valores de cada celda y ese valor final se debe ir redondeado. Estas operaciones yo actualmente las realizó Manual quiera saber si este proceso del cálculo se podría automatizar. Que cuando haga la conversación con la macro realice las operaciones en el caso que sea necesario.

1 respuesta

Respuesta
1

Puedes poner aquí tu macro. Utiliza el icono para poner código.

Qué celdas y qué operaciones quieres hacer. Pon ejemplos.

Buenas tardes Dante Gracias por responder.

En este link de drive esta colgado el archivo con la macro. En la hoja 1 esta la macro sin hayar cotizaciones  y en la hoja 2 está la macro con las cotizaciones correctas. De las celdas BA, BD y BI. 

https://drive.google.com/file/d/1SzT38poZOCVVIrnTALgt5rw7bU38Z4t8/view?usp=sharing 

LAS OPERACIONES SON LA SIGUIENTES; para hayar en la valor de la celda BA que sería multiplicando la celda AU x AZ = BA y  para hayar BI se multiplica AV x BH = BI para hayar la el valor de la celda BD seria la suma de BA + BB + BC = BD.

El resultado de las celdas BA Y BI deber ir redondeado al 100 más cercano. Cuando lo realizó manualmente Excel utilizo la función redondear.mas(BA10;-2) en la hoja 2 hay un ejemplo del cálculo manual.

Buenas tardes Dante,

Ahora voy a realizar una aclaración de como funciona La macro;

La macro genera varios archivos TXT de acuerdo a la informacion que yo le alimente desde la (FILA 4) si ingreso solo 5 filas de hay en adelante pues el programa solo genera 5 archivos TXT y a si sucesivamente depende de la filas que hayan en el archivo antes de darle DUPLICAR TXT.

La (FILA 2) es el encabezado de cada archivo osea esta información se agrega cada archivo cuando se genere, Es la única variación o variable es en la celda (O2 PERIODO COTIZACIÓN) Y (P2 PERIODO SERVICIO) que son los meses digamos, que son los que van a ir aumentar de acuerdo a las filas que yo alimente o desde mes yo que inicie van variando. 

Quedo muy atento a su respuesta.

Te muestro un ejemplo y tratas de realizar las otras operaciones

Para hayar en la valor de la celda BA que sería multiplicando la celda AU x AZ = BA

Cambia esta línea:

'Campo53 = C_Izq(h1.Cells(i, 53), 9) 'columna BA

Por esta:

Campo53 = C_Izq(h1.Cells(i, 47) * h1.Cells(i, 52), 9)  'BA = AU*AZ = col47*col52

Prueba y me comentas.

Dante gracias por responder, Pero mira que no funciona.

¿Puedes comentar qué sucede?

O prueba así:

DIM temp
temp = h1.Cells(i, 47) * h1.Cells(i, 52)
Campo53 = C_Izq(temp, 9)  'BA = AU*AZ = col47*col52

Buenos días Dante,

Igual sigue generando error al ejecutar la macro, Te adjunto la imagen con el error al ejecutar y me resalta la línea adjunta en amarillo y el mensaje de la imagen, Agradezco tu colaboración. Quedo atento.

Eso es porque tienes un valor en la columna AU o AZ que no es numérico o en la celda tienes algún error: #N/A #VALOR, etc.

Revisa tus datos.

Dante Agradezco tu aclaracion,

1-Si tiene razón el error esta en la columna AZ ya que los valores que me entregan viene así; ( .16) lo que realiza en esta columna es quitar el punto por la coma y quedo asi (0,16) solucionado se ejecuta bien, eso me tocaría ralizarlo manual en todas las tarifas no hay problema.

2- Pero lo que me preocupa es los resultados de la operaciones como te comente al inicio de la solicitud necesito que los resultados queden redondeados al 100 mas cercano, según investigue este proceso se realiza con la función ROUND pero no como aplicarla en este caso.

Por que hablando de este EJEMPLO en la celda BA5 el valor calculado es  311500,8 y debería quedar  311600, Agradezco tu colaboración y guia, para que los resultados deben quedar redondeados al 100 mas cercano.

NOTA en excel utilizo la función REDONDEAR.MAS como te comente al principio.

Dante Buen día,

Estoy Aplicando la función ROUND pero que no me redondea el resultado la tengo asi;

temp = Application.WorksheetFunction.Round(h1.Cells(i, 47).Value, 1 * h1.Cells(i, 52).Value, 1)
Campo53 = C_Izq(temp, 9)

Agradezco tu colaboración, quedo atento.

Prueba con RoundUp:

temp = WorksheetFunction.RoundUp(h1.Cells(i, 47).Value, 1 * h1.Cells(i, 52).Value, 1)

Estás seguro que en la columna 47 y en la 52 tienes valores numéricos, es decir, ya le quitaste la coma ( , ) 

Dante Gracias por la respuesta. Pero mira que no me ejecuta con el ROUNDUP tampoco.

Estás seguro que en la columna 47 y en la 52 tienes valores numéricos, es decir, ya le quitaste la coma ( , ) ?  Si ya me ejecuto cambiando los valores de la celda AZ.

Pero no se si estamos equivocados colocando el redondeo en la columna que corresponde esta asi;

Dim temp
temp = temp = WorksheetFunction.RoundUp(h1.Cells(i, 47).Value, 1 * h1.Cells(i, 52).Value, 1) en

esta columna no quiere ejecutar.

dice el siguiente error; El numero de Argumento es incorrecto o la asignacion de la propiedad no es valida

 Tengo esta pregunta;

Campo53 = C_Izq(temp, 9) Este redondeo no se aplica es en esta columna que es el resultado final en la celda.

Agradezco tu análisis Dante estoy atento, Gracias por la ayuda.

te adjunto macro actualizada para que me ayudes revisano.

https://drive.google.com/drive/folders/1z1bpI6h6i9LI5pqJLYo6YqtKdK8nciX6?usp=sharing 

temp = temp = WorksheetFunction.RoundUp(h1.Cells(i, 47).Value, 1 * h1.Cells(i, 52).Value, 1) 

Pusiste 2 veces "temp = "

Solamente debe ser una vez:

temp = WorksheetFunction.RoundUp(h1.Cells(i, 47).Value, 1 * h1.Cells(i, 52).Value, 1) 

Dante, Gracias por responder,

Igual sigue generando el mismo error;  El numero de Argumento es incorrecto o la asignacion de la propiedad no es valida

como lo puedes ver en la imagen

Agrdezco tu ayuda estoy atento.

Dante;

Estoy realizando la prueba de esta forma y tampoco funciona; me dice error en compilación código no válido.

Dim temp

temp = h1.Cells(i, 47) * h1.Cells(i, 52)
Campo53 = WorksheetFunction.RoundUp(C_Izq(temp, 9).Value, 2)

Agradezco tu ayuda.

temp = Application.WorksheetFunction.Round(h1.Cells(i, 47).Value, 1 * h1.Cells(i, 52).Value, 1)

Perdona no lo vi, desde un principio pusiste mal la fórmula y yo no la revisé.

La sintaxis correcta es:

temp = Application.WorksheetFunction.Round(h1.Cells(i, 47).Value * h1.Cells(i, 52).Value, 0)


Lo anterior es la sintaxis, pero revisando tu información encontré lo siguiente:

Los resultados queden redondeados al 100 mas cercano

Según tu ejemplo

311500,8 y debería quedar 311600

Supongo que la coma es el separador decimal.

La función Redondear es para redondear decimales y tú quieres redondear enteros, pero no los quieres redondear, según tu ejemplo le estás sumando 99.2 (99 enteros 2 decimales).

¿Eso es lo que quieres hacer?

Buenas tardes Dante; Quedo perfecta con el la siguiente línea le agregue el Up y me redondea al peso más cercano hacia arriba.

temp = Application.WorksheetFunction.RoundUp(h1.Cells(i, 47).Value * h1.Cells(i, 52).Value, -2)
Campo53 = C_Izq(temp, 9)

* Por ultimo Tengo estas dos preguntas que realizarte Agradezco me ayudes aclararlas.

1-¿Qué pasa si no declaro la variable Dim temp por que veo que no tengo declarada pero igual la macro se ejecuta bien?

2- ¿Para crear las otras fórmulas de las otras celdas puedo seguir trabajando con la misma variable para todas (temp) o tengo que crear una variable para cada operación que se realice?

Vba permite la ejecución sin declarar las variables. Pero lo mejor es que vayas aprendiendo a declarar las variables.

Sí, puedes utilizar temp para las demás operaciones.

Dante, Agradezco mucho su disposición y colaboración.

Me falta esta ultima operación que no se como realizarla. ya que se tendría que cumplir una doble condición para que se realice o ejecute el resultado iría en el CAMPO57  que es la igual a la celda BE4, en la cual se debe realizar una multiplicación por 0,5 en caso que el valor del campo CAMPO47 >= X valor y este valor se debe revisar o comparar de acuerdo al año ya que en cada año varia o es distinto. y entonces lo deberíamos comparar también con la (celda O2) La cual traer el año,

hay que aclarar que los años son en promedio 20 años y cada año tiene un valor distinto de acuerdo a su año. yo estaba pensando en lo siguiente; pero no se si hay una mejor opción.

EJEMPLO; yo la aplicaría así no se si esta bien por eso acudo a usted por su experiencia. 

Aplicar el condional IF  AND.

TABLA DE SALARIOS POR AÑO;

AÑO 2000= 500, AÑO 2001 = 700, AÑO 2002 = 900, AÑO 2003 = 930,  AÑO 2004 = 950. etc

AÑO 2000;

IF CAMPO47 >= 500 AND RAGE("02") = 2001 THEN

CAMPO51 = CAMPO47 * 0.5

END IF

AÑO 2001;

IF CAMPO47 >= 700 AND RAGE("02") = 2001 THEN

CAMPO51 = CAMPO47 * 0.5

END IF

AÑO 2002;

IF CAMPO47 >= 900 AND RAGE("02") = 2001 THEN

CAMPO51 = CAMPO47 * 0.5

END IF

y a si sucesivamente realizaría el resto de años. agradezco me colabores y me guíes por favor. ruego me confirmes si esta correcto mi concepto o si tienes otra idea mejor me la compartas como lo aplicaría en mi macro que tengo actualmente, Quedo muy atento a sus comentarios.

te confirmo el link de la macro.

https://drive.google.com/drive/folders/1z1bpI6h6i9LI5pqJLYo6YqtKdK8nciX6?usp=sharing 

No entiendo la condición.

TABLA DE SALARIOS POR AÑO.
AÑO 2000= 500, AÑO 2001 = 700, AÑO 2002 = 900, AÑO 2003 = 930,  AÑO 2004 = 950. et

Pero en la condición solamente pusiste el 2001.

IF CAMPO47 >= 500 AND RAGE("02") = 2001 THEN
CAMPO51 = CAMPO47 * 0.5
END IF
AÑO 2001;
IF CAMPO47 >= 700 AND RAGE("02") = 2001 THEN
CAMPO51 = CAMPO47 * 0.5
END IF
AÑO 2002;
IF CAMPO47 >= 900 AND RAGE("02") = 2001 THEN
CAMPO51 = CAMPO47 * 0.5
END IF

Es un error de captura?

¿Cada año debe compararse con el valor según la tabla de salarios?

Es un error de captura ?  Si tiene razón depronto me equivoque y los repetí por que los años deben ser distintos ya que los valores van cambiando de acuerdo al año.

¿Cada año debe compararse con el valor según la tabla de salarios? Si señor es correcto. 

Agradezco tu colaboración me colabores con la nomenclatura correcta como realmente debería realizar el condicional o si hay otra forma mejor. Quedo atento a sus comentarios. Gracias Dante  por siempre  responder.

¿No entiendo la condición? Condición debe ser doble por eso digo que desde mi punto de vista debería ser el IF AND, en realizada no se como expresarlo en realizada, como comparo el año que se encuentra en la celda RANGE("02") y esta en la función poner_emcabezado.

¿Es un error de captura? Si tiene razón de pronto me equivoque y los repetí por que los años deben ser distintos ya que los valores van cambiando de acuerdo al año.

¿Cada año debe compararse con el valor según la tabla de salarios? Si señor es correcto.

Agradezco tu colaboración me colabores con la nomenclatura correcta como realmente debería realizar el condicional o si hay otra forma mejor. Quedo atento a sus comentarios. Gracias Dante por siempre responder.

TABLA DE SALARIOS POR AÑO;
AÑO 2000= 500, AÑO 2001 = 700, AÑO 2002 = 900, AÑO 2003 = 930,  AÑO 2004 = 950. etc

Tienes esa tabla en una hoja de excel,  o podrías poner la tabla en una hoja de excel, por ejemplo:

Hola Dante, Gracias por la respuesta.

Ya los coloque en la Hoja2 de a acuerdo a tus indicaciones cual seria el siguiente paso, estoy atento muchas Gracias.

asi quedo;

Hola Maestro Dante;

Adjunto LINK con la macro actualizado.

https://drive.google.com/drive/folders/1z1bpI6h6i9LI5pqJLYo6YqtKdK8nciX6?usp=sharing 

No pude entrar a descargar el archivo.

Te envié la solicitud para que me des acceso a descargar el archivo.

Hola Dante, Ya te habilite o te di los permisos, disculpa, estoy atento, Muchas Gracias

Buenos días dante, 

Ya envié también el archivo a tu correo;  mailto:[email protected] 

Agradezco mucho tu ayudo maestro. Estoy pendiente. Gracias 

Ese es mi correo pero no te pedí que me enviaras un correo, solamente lo puse para descargar el archivo.

No me envíes correos a menos que te lo pida y será al correo que yo te indique.


Revisando nuevamente tu condición:

IF CAMPO47 >= 500 AND RAGE("02") = 2001 THEN
CAMPO51 = CAMPO47 * 0.5
END IF
AÑO 2001;
IF CAMPO47 >= 700 AND RAGE("02") = 2001 THEN
CAMPO51 = CAMPO47 * 0.5
END IF
AÑO 2002;
IF CAMPO47 >= 900 AND RAGE("02") = 2001 THEN
CAMPO51 = CAMPO47 * 0.5
END IF

Sin importar el valor del campo47 o el año, siempre el resultado en campo51 es igual a campo47 * 0.5

No me envíes correos a menos que te lo pida y será al correo que yo te indique.

Que pena Dante entiendo, Disculpa no quise ofenderte no vuelve a pasar.

Sin importar el valor del campo47 o el año, siempre el resultado en campo51 es igual a campo47 * 0.5 ?  Siempre y cuando se cumplan las dos condiciones Campo47>= y el AÑO. se debe realizar la operación ( CAMPO47 * 05) de los contrario el valor en el campo (campo51)  debe ser cero (0).

Agradezco tu colaboración y perdona tanta molestia.

NOTA; ( CAMPO47 * 05) esta operación puede cambiar de acuerdo a valor del campo47, puede cambiar de (0.5 a 0.7 y 1) pero no quiero hacer mas enredado para que me entiendas el concepto. Creo que si tu me ayudas a crear la primera validación o regla yo podría crear las otras tablas siempre y cuando este a mi alcance. No se que opinas tu que eres el experto.

No entiendo.

Lo que yo veo es que el campo47 es mayor a 500 entonces multiplicar. Sin importar el año.

Hola dante, gracias por responder.

Lo que yo veo es que el campo47 es mayor a 500 entonces multiplicar. Sin importar el año ?

Claro el año si importa. Voy a realizar un pequeño ejemplo real de acuerdo el listado que te envié en la hoja2 del archivo.

Año       salario 

1995     $475736

1996     $568500

Ya sabemos que la macro genera archivos de acuerdo a las líneas que le coloqué  a partir de la fila4 y aparte inicia desde el año y mes que le coloqué en el encabezado fila2.

Digamos que coloco 2 líneas o filas y que inicia en diciembre de 1995. Esto que quiere decir que cuando yo cuando ejecute la macro va generar dos archivos TXT uno con el mes de diciembre de 1995 y otro con el mes de enero de 1996.

Validación campos;

Archivo 1 de diciembre de 1995.

Si tengo en el campo CAMPO47 el valor $475736 la macro se ejecuta. Ya que tanto el valor y el año coinciden de acuerdo a la tabla. Entonces se realizaría la operación por el 0.5. Esto para el primer archivo que es diciembre de 1995.

Archivo 2 de enero de 1996.

Ahora para el segundo arhivo tengo enero del 1996. Y Tengo en el CAMPO47 este valor $475736. Acá no se cumple la condición ya que en la tabla tenemos que para el (año 1996 $568500) entonces el valor del campo52 será cero (0). 

No se si es clara la explicación por eso te decía es que es importante tener en cuenta tanto los valores como los años. Quedo atento a tus comentarios. Gracias.

Entre el campo50 y el campo52 pon el siguiente código:

  Campo50 = C_Izq(h1.Cells(i, 50), 9) 'IBC CAJA
  campo51 = String(9, "0")
  nAño = Right(Range("O2").Value, 4)
  Set f = Sheets("Hoja2").Range("A:A").Find(nAño, , xlValues, xlWhole)
  If Not f Is Nothing Then
    If Val(campo47) >= f.Offset(, 1).Value Then campo51 = Format(Val(campo47) * 0.5, "000000000")
  End If
  Campo52 = C_Der(h1.Cells(i, 52), 7) 'Tarifa AFP

Muchas Gracias Dante; El código esta funcionando perfecto. Solo cambia el CAMPO51 por el correcto que es el CAMPO57.  y lo ingrese entre el campo56 y campo58 y deshabilite el campo original que era el 57 ya que lo deje entre comillas. 

Campo56 = C_Izq(h1.Cells(i, 56), 9)

campo57 = String(9, "0")
nAño = Right(Range("O2").Value, 4)
Set f = Sheets("Hoja2").Range("A:A").Find(nAño, , xlValues, xlWhole)
If Not f Is Nothing Then
If Val(campo47) >= f.Offset(, 1).Value Then campo57 = Format(Val(campo47) * 0.5, "000000000")
End If

'campo57 = C_Izq(h1.Cells(i, 57), 9)  'FSP SOLIDARIDAD DESHABILITADO

Campo58 = C_Izq(h1.Cells(i, 58), 9) ' FSP SUBSISTENCIA

Por ultimo me puedes ayudar por favor informando donde ingreso la función RoundUp para que el resultado de la operación Quedo redondeado.

campo57 = String(9, "0")
  nAño = Right(Range("O2").Value, 4)
  Set f = Sheets("Hoja2").Range("A:A").Find(nAño, , xlValues, xlWhole)
  If Not f Is Nothing Then
    If Val(campo47) >= f.Offset(, 1).Value Then campo57 = Format(Val(campo47) * 0.5, "000000000")
  End If

Prueba lo siguiente:

If Val(campo47) >= f.Offset(, 1).Value Then
  campo57 = Format(WorksheetFunction.Round(Val(campo47) * 0.5, 0), "000000000")
End if

Hola dante agradezco mucho tu colaboración y apoyo en este proceso y disculpa tanta intensidad.

lo deje final de esta forma y me cuadro, y en la multiplicacion del 0.5 le agregue la división por 100 ya que el 0.5 realmente es un porcentaje 0.5%. Muchas Gracias.

campo57 = Format(WorksheetFunction.RoundUp(Val((campo47) * 0.5) / 100, -2), "000000000")

Gracias por su amable disposición y repuestas.

Me alegra saber que ya funciona para ti, gra cias por comentar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas