¿Cómo crear una variable por cada reclamación en visual basic?

Tengo una base de datos que contiene en la hoja 1 una columna con la clave del producto, otra con la fecha de inicio de la vigencia de la garantía, otra con la fecha final de la vigencia de la garantía y en la hoja 2 tengo una columna con los registros de reclamaciones realizadas que contiene en la primera columna la clave del producto, en otra la fecha de la reclamación y en otra el monto de la reclamación.

Necesito crear una macro que me permita calcular el número de reclamaciones por producto y el monto total de reclamaciones por cada producto y escribirlas en la fila correspondiente en la hoja 1. No tengo idea de cómo se podría crear una variable que almacene los totales por cada uno de los productos ya que son más de 1000 datos de reclamaciones.

2 Respuestas

Respuesta
2

08.03.17

Buenas, Pedro

Había empezado a ensayar alguna solución en Visual Basic que extrajera los totales de cada producto.

Pero me dí cuenta de que eso lo hace MS Excel - y lejos más eficientemente que una macro- a través de sus Tablas Dinámicas.

Así que me tome el tiempo para reproducir un ejemplo y le agregué una de esas tablas quedando algo como esto:

Al efecto de mandarte esta imagen, coloqué la tabla a la derecha, pero mientras la construyes puedes indicarle que la muestra en otra hoja (que suele ser lo usual y más práctico)

Si te interesara como solución a tu necesidad, aquí te explico cómo se crea:

Una tabla dinámica es una herramienta de MS Excel para obtener un reporte agrupado de distintas maneras basado en datos incluidos en una tabla o base de datos.

Es dinámica porque, una vez armada, permite agregar, mover, o eliminar campos en ella hasta lograr el reporte deseado. Además, si cambian los datos en la base original, basta actualizarla (con botón derecho del mouse sobre ella y elegir Actualizar) para tener los resultados inmediatamente sin necesidad de fórmulas ni rutinas de VBA. Para armarla, sigue los siguientes pasos:

1.– Es necesario que cada columna tenga un título único, aún aquellas que estuvieran vacías.

Selecciona tu lista desde esta primera fila (títulos) hasta el último registro en ella. Continúa expandiendo ese rango hacia abajo este rango para que futuros registros (por si se agregaran) se incluyan en la Tabla dinámica.

Manténla seleccionada.

2.- Pulsa el botón en "insertar" encontrado en la barra del menú principal y selecciona "Tabla dinámica".

3.- Una ventana pide seleccionar la fuente de los datos. Marca "Lista o base de datos de MS Excel".

4.- Si hubieras dejado tu rango seleccionado, se asumirá ésta como la base de datos fuente. En caso contrario, puedes seleccionar el área en este paso.

Allí también le indicas dónde quieres ubicarla.

5.- Verás que te dejó el Diseño en blanco:

Y se mostrarán los títulos de las columnas disponibles. Verás, por ejemplo, en tu caso:

6.- El próximo paso depende de ti, porque esto es muy "personalizable". Sólo tienes que arrastrar etiquetas al área donde quieres que ellas sean mostradas.

Por ejemplo:

- Arrastra la etiqueta "Clave de Producto" al área de FILAS.
Con botón derecho del mouse sobre las etiquetas de las columnas en la tabla podrás quitarles los subtotales que suele colocar (o agregárselos si no estuvieren).

- Luego arrastrarla las etiquetas "Fecha ..." y "Monto..." al área de los VALORES

Esto es para que los Cuente y los Sume. Si dijera "Contar de" haz click derecho sobre ese campo y, en configuración del campo de Valor, elije "Sumar" y allí mismo puedes cambiar el título y darle formato a los números que vayan a aparecer.

(Nota: otras funciones posibles sobre campos numéricos son:
Contar/Promedio/Min/Max//Producto/ entre otros)

Así conseguirás una tabla donde podrás mostrar sólo los casos seleccionados.

Seleccionada la tabla, verás en la parte superior de la barra de herramientas un botón que dice "Diseño del informe", que sirve para modificar el formato de tu tabla. Como viene con autoformato, yo suelo cambiar a Formato Tabular, pero puedes dejarlo como mejor te luzca.

Saludos

Fernando

.

Efectivamente la hoja 2 de mi problema es muy similar a la tuya y en caso de que sólo tuviera eso estoy de acuerdo con que esa sería una solución eficiente; sin embargo, como mencioné en la descripción del problema, no todas las reclamaciones se deben "contar" ya que para cada producto, se establece en la hoja 1 una fecha de inicio y fin de la garantía y en mi caso sí hay reclamaciones que caen fuera del periodo de garantía, además tengo datos de reclamaciones cuyos productos no coinciden con ninguno de los productos que me describen en la hoja 1 y en ese caso me piden escribir esta lista aparte.

.

Hola, Pedro

La solución sigue siendo válida.

Claro que habría que agregar, en la tabla de Hoja 2, un control si corresponde o no contarla.

Para ello agregaría una fórmula como la siguiente que contemplaría ambas situaciones que mencionas.

Voy a imaginar, nuevamente, que tienes una tabla de vigencias en la hoja 1 como esta:

Apropósitamente no coloqué todos los productos de la primera imagen que te envíe.

Luego en una columna de la Hoja 2 coloca la siguiente fórmula:

=SI(ESNOD(BUSCARV(B4;'Hoja 1'!$B$4:$D$18;3;0));"No Existe Producto";SI(C4>BUSCARV(B4;'Hoja 1'!$B$4:$D$18;3;0);"Caducada";"SI"))

[Considera si usas comas o punto y coma para separar argumentos de las funciones. Yo usé ";"]
Asígnale el formato deseado y, luego, copia esta celda y pégala en las restantes de esta misma columna.

Como verás, la fórmula se encarga de ver el estado de cada reclamación.

Al tratarse de una fórmula funciona automáticamente. Es decir que bastará que cambies los parámetros de la tabla de la hoja 1 para que se actualicen los estados.

Quedará algo así como esto:

Como verás cada reclamación tiene su estado.

Deberás, claro, ampliar el rango de origen de la tabla dinámica para que considere el nuevo campo "Contar?" que acabamos de agregar.

Armé dos tipos de tabla:

¿En la primera coloqué el nuevo campo Contar? En el área de filtros. De esa manera al elegir la opción "SI", lo datos de la tabla dinámica se refieren exclusivamente a aquellos registros que sí te interesa computar. Es decir: aquellos que están dentro del listado y que fuera presentado dentro del plazo de vigencia.

Del mismo modo, si eligieses No Existe el producto tendrás la lista aparte de los que no corresponde reclamación.

La tabla de abajo - a la cual también le cambié el formato- muestra todos los registros clasificados por su estado.

Es la versatilidad que dan las tablas dinámicas de reformatear el reporte a gusto de lo que necesites ver.

Espero que esta solución te satisfaga.

Un abrazo

Fer

.

¡Gracias! Pero como el título indica estoy interesado en aprender a utilizar VB, sin embargo, votaré excelente por su atención y esfuerzo.

.

Ok, Pedro

Gracias por tu calificación.

Siempre es bueno aprender algo nuevo. Celebro eso.

La primera lección sobre Visual Basic debería indicar cuándo es necesario aplicarlo.

En este caso particular que planteaste una simple macro ni se acerca a la potencia de las tablas dinámicas, a la facilidad de su construcción, y al escaso mantenimiento que demanda cuando hay cambios en las condiciones.

Exitos con tu aprendizaje.

Abrazo

Fer

.

Respuesta
2

H o l a: Puedes enviarme un archivo con ejemplos de lo que tienes y de lo que esperas como resultado.

Con 2 ó 3 productos que me expliques, para poder crear la macro.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Pedro Juárez” y el título de esta pregunta.

Ya he enviado el archivo a tu correo, muchas gracias.

Te anexo la macro

Sub Calcular()
'Por.Dante Amor
    '
    Set h1 = Sheets("Productos")
    Set h2 = Sheets("Reclamaciones")
    Set h3 = Sheets("Errores")
    h1.Range("E2:F" & Rows.Count).ClearContents
    h3.Range("A2:C" & Rows.Count).ClearContents
    '
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    j = 2
    For i = 2 To u
        Set b = h1.Columns("A").Find(h2.Cells(i, "A"), lookat:=xlWhole)
        If Not b Is Nothing Then
            If h2.Cells(i, "B") >= h1.Cells(b.Row, "B") And h2.Cells(i, "B") <= h1.Cells(b.Row, "C") Then
                h1.Cells(b.Row, "E") = h1.Cells(b.Row, "E") + 1
                h1.Cells(b.Row, "F") = h1.Cells(b.Row, "F") + h2.Cells(i, "C")
            Else
                h2.Rows(i).Copy h3.Rows(j)
                j = j + 1
            End If
        Else
            h2.Rows(i).Copy h3.Rows(j)
            j = j + 1
        End If
    Next
    MsgBox "Fin"
End Sub

sal u dos

¡Gracias! Excelente respuesta, ¿Conoce algún curso en línea o algún documento donde pueda aprender acerca de esas funciones? Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas