Macro para copiar y parametrizar valores

Necesito hacer la siguiente macro para entregar un informe estadístico, según el siguiente detalle:

1) Copiar la base A1: F101 en la Hoja 2

2) Redondear a enteros los números de la base C2:E101 (estas celdas contienen números con 3 decimales y necesito transformarlos en enteros sin decimales)

3) Hacer una fórmula en la celda G2 que realice lo siguiente:

Si el numero de la celda F2 se encuentra entre los números de la celda C2 y la celda E2 entonces coloque la leyenda " Si" en la celda G2, de lo contrario "No"

4) Copiar esta fórmula en las celdas G3:G101

Fin de la Macro

1

1 respuesta

Respuesta
1

.

Buenas, Diego

Aquí va tu solución con indicación en el código de cada paso que solicitaste.

Accedé al Editor de VBA (Atajo: Alt + F11), insertá un módulo - si no tuvieras uno ya- y pegá el siguiente código:

Sub PrepInfo()
'DIEGO, indicá los rangos involucrados en las sigueintes dos variables:
RangoOrigen = "A1:F101" ' rango a copiar a la hoja de destino
HojaDest = "Hoja2" 'nombre de la hoja donde pegar lo copiado
CeldaDest = "A1" 'celda inicial en destino
RangoNum = "C2:E101" ' rango de números a redondear.
CeldaForm = "G2" ' celda donde colocar la fórmula condicional
' paso 1) Copiar la base A1: F101 en la Hoja 2
ActiveSheet.Range(RangoOrigen).Copy
Sheets(HojaDest).Range(CeldaDest).PasteSpecial xlPasteValues
Sheets(HojaDest).Range(CeldaDest).PasteSpecial xlFormats
Application.CutCopyMode = False
Sheets(HojaDest).Select
Range(CeldaForm).Select
' paso 2) Redondear a enteros los números de la base C2:E101
For Each numero In Range(RangoNum)
    If IsNumeric(numero) Then numero.Value = Round(numero.Value, 0)
Next
' paso 3) Hacer una fórmula en la celda G2
Range(CeldaForm).FormulaR1C1 = "=IF(AND(RC[-1]>RC[-4],RC[-1]<RC[-2]),""Si"",""No"")"
'paso 4) Copiar esta fórmula en las celdas G3:G101
RangoForm = Range(CeldaForm, Range(CeldaForm). Offset(Range(RangoNum). Rows. Count - 1)). Address
Range(CeldaForm).Copy Range(RangoForm)
Application.CutCopyMode = False
MsgBox "Listo! " & Chr(10) & "Fin de la Macro", vbInformation, "TERMINADO"
End Sub

Fijate que hay una serie de variables al inicio que responden exactamente a las direcciones que pasaste. Si, eventualmente, fueran otras, cambialas allá.

Como siempre, recomiendo que trabajés sobre un archivo de prueba para ver el comportamiento.

Avisame si es lo que estabas buscando o si tenemos que hacerle un ajuste.

Un abrazo

Fernando

(Buenos Aires, Argentina)

Hola, Fernando, cuando se ejecuta sale un error que dice " Microsoft Visual Basic  para aplicaciones"

X 400

.

Hola, Diego

Es curioso porque probé la rutina -antes de mandartela- y me funcionó correctamente.

Tal vez sea un conflicto entre tu Configuración Regional, en particular si tu separador de argumentos es coma o punto y coma.

De todos modos, en VBA, al redactarse en ingles y siempre con comas, no debería dar problema.

Vamos a probar reemplazando -en aquel código- la linea

Range(CeldaForm).FormulaR1C1 = "=IF(AND(RC[-1]>RC[-4],RC[-1] RC[-2]),""Si"",""No"")"

por esta otra:

Range(CeldaForm).Formula = "=IF(AND(F2>C2,F2<E2),""Si"",""No"")"

A ver si ese fue el origen del problema. Personalmente prefería la otra porque es independiente de las referencias de celda, funcionando en cualquier fila donde se aplique.

Probala y decime si funciona

Si volviera a detenerse y tenés la oportunidad de presionar el boton "Depurar" cuando sale el error, apretalo y copiame aquí la línea donde se detiene.

Una pregunta más: ¿Cambiaste algo de los parámetros originales o la ejecutaste como te la mandé?

Saludos

Fernando

.

Creo que el problema esta en la fórmula, yo necesito lo siguiente

Hacer una formula en la celda G2

Necesito saber si el numero de la Celda F2 esta comprendido entre los números que figuran en las celdas C2 y E2 

Ejemplo:

C2 = 5

E2 = 10

Si el numero que esta en la celda F2 es un numero del 5 al 10 entonces la leyenda es "SI" si no esta en ese rango "No"

Es decir, los numeros 5 /6/7/8/9/10 serian "SI", el resto (Del 0 al 4) y del (11 en adelante "No")

Luego, copiar esta formula en G3:G101

Gracias

.

Buenas,

Eso es lo que hace la fórmula que te envié, con una salvedad: Estaba excluyendo los extremos.

Para que los considere como parte del intervalo, sólo hay que reemplazarla por la siguiente:

Range(CeldaForm).Formula = "=IF(AND(F2>=C2,F2<=E2),""Si"",""No"")"

Ahora dice que si se cumplen las dos condiciones de que F2 sea mayor o igual que C2 y que F2 sea menor o igual que E2, coloque "Si", sino que muestre "No".

Avisame si está OK así.

Abrazo

Fernando

.

No cambie los parámetros, pero sigue saliendo el mismo error, solamente copia la base A1: F101, luego sale el error

.

Ok. Aunque no me comentaste en qué línea del código se detiene.

Tal vez sea que dentro del rango numérico tengas algo que da error.

Por las dudas probá con este código, reemplazándolo por el siguiente:

Sub PrepInfo()
'DIEGO, indicá los rangos involucrados en las sigueintes dos variables:  
RangoOrigen = "A1:F101" ' rango a copiar a la hoja de destino.  
HojaDest = "Hoja2" 'nombre de la hoja donde pegar lo copiado.  
CeldaDest = "A1" 'celda inicial en destino.  
RangoNum = "C2:E101" ' rango de números a redondear.  
CeldaForm = "G2" ' celda donde colocar la fórmula condicional  
' paso 1) Copiar la base A1: F101 en la Hoja 2  
ActiveSheet.Range(RangoOrigen).Copy
Sheets(HojaDest).Range(CeldaDest).PasteSpecial xlPasteValues
Sheets(HojaDest).Range(CeldaDest).PasteSpecial xlFormats
Application.CutCopyMode = False
Sheets(HojaDest).Select
Range(CeldaForm).Select
' paso 2) Redondear a enteros los números de la base C2:E101  
For Each numero In Range(RangoNum)
    On Error Resume Next
    If IsNumeric(numero) Then numero.Value = Round(numero.Value, 0)
    If Err.Number <> 0 Then numero.Interior.ColorIndex = 255
    On Error GoTo 0
Next
' paso 3) Hacer una fórmula en la celda G2  
Range(CeldaForm).FormulaR1C1 = "=IF(AND(RC[-1]>=RC[-4],RC[-1]<=RC[-2]),""Si"",""No"")"
'paso 4) Copiar esta fórmula en las celdas G3:G101  
RangoForm = Range(CeldaForm, Range(CeldaForm). Offset(Range(RangoNum). Rows. Count - 1)). Address
Range(CeldaForm).Copy Range(RangoForm)
Application.CutCopyMode = False
MsgBox "Listo! " & Chr(10) & "Fin de la Macro", vbInformation, "TERMINADO"
End Sub

Probalo y decime si continua el error. Fijate si los números quedaron sin decimales, también.

Seguiremos intentando hasta que quede.

Eventualmente, si sigue sin funcionar te pediré que me envíes el archivo para ver donde se traba.

Abrazo
Fernando

.

Fernando, ejecute la macro hasta el paso 1

Range (CeldaForm).Select

Ahí ya sale el error 400

.

Hola, Diego

Debe haber algún conflicto en alguna celda del rango C2:E101, pero debería verlo para entender, ya que las pruebas que hice localmente hacían todo lo que solicitabas.

Entonces, como te adelantara, me ofrezco a ver tu archivo para resolver el problema, si me lo enviás.

.

Te estoy enviando el E-Mail, el subject va a ser la pregunta, Ok

Abrazo.-

.

Ok, Diego

Cuando lo reciba lo veo. Me parece que debe ser una pavada (ojalá)

Abrazo

Fernando

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas