Jump to content
Sign in to follow this  
LARPI

Listado de existencias

Recommended Posts

Hola,

necesito crear un listado a partir de una base de datos de vehiculos que se encuentran en diferentes ubicaciones de la empresa. En un momento determinado del dia tengo que hacer un control de los vehículos que estan a cada base i por eso necesitaria un listado en función del último mevimiento de cada vehículo.

Adjunto archivo.

Gracias

vehiculos.zip

Share this post


Link to post
Share on other sites

Hola,

he estado mirando el archivo y no acaba de ser lo que necessito. Si pongo la base a me tendrían que salir en la hoja2 sólo los vehículos que actualmente estan en esta base, es decir los vehiculos que el último movimiento que han tenido ha sido el de entrada a esta base

Share this post


Link to post
Share on other sites

Hola.

podrias usar una formula en vez de macros:

=INDICE(Hoja1!B$2:B$8;K.ESIMO.MENOR(INDICE((Hoja1!$A$2:$A$800=Hoja1!$I$3)*(Hoja1!$C$2:$C$800="Entrada")*(FILA(A$2:A$800)-1);SUMAPRODUCTO(--((Hoja1!$A$2:$A$800=Hoja1!$I$3)*(Hoja1!$C$2:$C$800="Entrada")*(FILA(A$2:A$800)-1)=0))+FILA(A1))

Ponla en la celda [A5] de la Hoja2 y correla de izquierda a derecha y de arriba abajo.

Un saludo.

Ps: Un abrazo querido Gerson.

Share this post


Link to post
Share on other sites

Hola Toldeman,

había pensado en usar una fórmula. El problema es que si elimino alguna fila del origen en la hoja donde hay las fórmulas sale #REF# y con la fórmula no se me ordenan automáticamente los registros. En el ejemplo había pocos pero pueden haber muchos movimientos al largo del año.

Un saludo

Share this post


Link to post
Share on other sites

Hola.

Entonces necesitarias una macro, prueba esta que te propongo desde la hoja activa en este caso la hoja1.

Sub registrar()
Dim ul As Long, rango As Range
ul = Range("A" & Rows.Count).End(xlUp).Row
Set rango = Range("A2:A" & ul)
x = 4
Application.ScreenUpdating = False
For Each celda In rango
If celda = [I3].Value And celda.Offset(, 2) = "Entrada" Then
Range("B" & celda.Row & ":" & "F" & celda.Row).Copy
Sheets(2).Select
x = x + 1
Range("A" & x & ":F" & x).Select
Selection.PasteSpecial Paste:=xlPasteValues
Sheets(1).Select
Else
[A1].Select
End If
Next
Sheets(2).Select
Dim ul1 As Long
ul1 = Range("A" & Rows.Count).End(xlUp).Row
Range("A5:A" & ul1).Sort Key1:=[A5], order1:=xlAscending
Sheets(1).Select
Application.CutCopyMode = False
End Sub

La macro te ordena por fecha los datos que pasa a la hoja2.

Un saludo.

Share this post


Link to post
Share on other sites

Hola Larpi

En tu primer post no mencionas sobre ordenar la hoja2

Te pego el nuevo codigo, espero te funcione

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
With Target
If .Address(0, 0) = "I3" Or .Address(0, 0) = "J3" Then
With Sheets("Hoja2")
.Columns("A:F").ClearContents
With Range("A1").CurrentRegion
.AutoFilter 1, Range("I3")
.AutoFilter 3, Range("J3")
.SpecialCells(xlCellTypeVisible).Copy Sheets("Hoja2").Range("A4")
.AutoFilter
End With
.Columns("A:F").EntireColumn.AutoFit
.Columns("C").Delete
.Activate
Range("A4").CurrentRegion.Sort Key1:=Range("B5"), Order1:=xlAscending, Header:=xlYes
End With
End If
End With
Application.ScreenUpdating = True
End Sub

[/PHP]

Es un gusto compartir contigo Toldeman

Saludos desde Honduras

Share this post


Link to post
Share on other sites

Hola,

el codigod e Toldeman me funciona a la perfección. Pero me gustaria saber que significan los valores "X" que pones en el código. Estoy intentando poner explicaciones de cada línea para entenderlo mejor y acordarme más adelante pero no tengo ni idea de su significado.

Gracias

Share this post


Link to post
Share on other sites

Estoy haciendo pruebas pero la macro sólo me filtra las filas que contienen el movimiento entrada. El problema es que si hay una salida a una fecha posterior no la tiene en cuenta y me sale el vehículo que ya ha salido en el listado cuando en realidad ya no está en la base.

Si hoy es día 13 y se produjo una entrada el dia una y una salida el dia 10 este vehículo no debería salir en el listado de existencias.

No se si existe la posibilidad de eliminar las filas con matrículas duplicadas y que sólo deje la fila que tiene la fecha más reciente i a partir de aquí que en el listado aparecieran los vehículos con el movimiento "entrada".

Share this post


Link to post
Share on other sites

Con vuestras aportaciones y las consultas en preguntas ya resueltas he avanzado en alguna de las dudas que planteava en el anterior mensaje. Adjunto el archivo que he conseguido (creo) que elimine las matrículas repetidas y deje sólo el registro más reciente y que elimine también los movimientos que sean "salidas". Aunque creo que sólo tiene en cuenta duplicados y no repeticions múltiples.

El problema principal con el que me encuentro ahora es que no se la manera para que sólo me aparezcan los valores de la base que yo le indique (en el caso del ejemplo 1 o 2). También he visto que en el código aparece la instrucción para que el ancho de columna sea automático pero en algunos casos es demasiado pequeño.

Saludos

Vehiculos.zip

Share this post


Link to post
Share on other sites

Hola larpi.

No tengo muy claro lo que buscas, pero puedes probar el siguiente codigo:

1º Elimina registros con matriculas duplicadas.

2º Te graba en la la hoja2 los registros que corresponden a la columna C "entradas" y al correspondiente numero que hay en la celda I4 y coincide con los de la columna A.

3º Ordena los registros de la Hoja2 por el campo fecha.

Sub registrar()
Dim ul As Long, rango As Range
ul = Range("A" & Rows.Count).End(xlUp).Row
Set rango = Range("A2:A" & ul)
x = 1
Application.ScreenUpdating = False
Range("F2:F" & ul).Select
ActiveSheet.Range("$A$1:$F$" & ul).RemoveDuplicates Columns:=6, Header:=xlYes
For Each celda In rango
If celda = [I4].Value And celda.Offset(, 2) = "Entrada" Then
Range("A" & celda.Row & ":" & "F" & celda.Row).Copy
Sheets(2).Select
x = x + 1
Range("A" & x & ":F" & x).Select
Selection.PasteSpecial Paste:=xlPasteValues
Sheets(1).Select
Else
[A1].Select
End If
Next
Sheets(2).Select
Dim ul1 As Long
ul1 = Range("A" & Rows.Count).End(xlUp).Row
Range("B2:A" & ul1).Sort Key1:=[B2], order1:=xlAscending
Sheets(1).Select
Application.CutCopyMode = False
End Sub

Un saludo.

Share this post


Link to post
Share on other sites

Hola,

el problema es que si me copia las entradas i ha havido una salida en fecha posterior realmente en esta planata el vehículo ya no está. Al seguir intentándola y cogiendo un poco de aquí y un poco de allá he encontrado la manera que creo que me lo hace bién aunque tengo un problema con el signo.

Ahora el código está puesto de manera que elimine las filas cuando i4=columna A el problema es que lo quiero al revés y que se borren cuando I4<> a la columna A pero cuando lo pongo se me queda todo colgado.

Adjunto el archivo.

Muchas gracias por la ayuda

Vehiculosv3.zip

Share this post


Link to post
Share on other sites

Hola,

Revisando uno de tus adjuntos y la "muestra" del informe que requieres, encuentro que las tablas dinámicas lo hacen tal cual lo requieres.

Te dejo un adjunto donde puedes observar la gran similitud entre lo pedido y el resultado obtenido con Tablas dinámicas, no requiere el uso de macros.

Además ten en cuenta que con las tablas puedes filtrar por rangos de fechas, agrupar por periodos, meses, años, dias, etc.

En tu perfil dice que usas Excel 2010 y si así es puedes aprovechar el gran potencial y las mejoras que tiene esta herramienta. En esta versión de Excel han mejorado muchisimo las tablas dinámicas.

Ya nos comentarás si las Tablas Dinámicas pueden ser la solución a lo que buscas, no requieren el uso de macros, aunque se pueden implementar algunas según lo que necesites.

Gabriel

Vehiculos_TD.zip

Share this post


Link to post
Share on other sites

La tabla dinámica no hace lo que necessito porque me salen las últimas "entradas" pero si hay un movimiento de salida después esto significa que el vehículo ya no está en la base y por lo tanto no tiene que salir. El último archivo que adjunté me lo hacía todo sólo me falta saber como filtrar la base.

Adjunto de nuevo el archivo con las aclaraciones

Gracias

Vehiculosv3.zip

Share this post


Link to post
Share on other sites

Hola.

Prueba este codigo:

Sub base()
Dim ul As Long, rango As Range
ul = Range("A" &amp; Rows.Count).End(xlUp).Row
Set rango = Range("A2:A" &amp; ul)
x = 1
For Each celda In rango
x = x + 1
If celda.Value = [I4].Value And celda.Offset(, 2).Value &lt;&gt; "Entrada" Then Range("A" &amp; x &amp; ":" &amp; "F" &amp; x) = ""
If celda.Value &lt;&gt; [I4].Value Then Range("A" &amp; x &amp; ":" &amp; "F" &amp; x) = ""
Next
Range("A2:F" &amp; ul).Sort key1:=[B2], order1:=xlDescending
Range("F2:F" &amp; ul).Select
ActiveSheet.Range("$A$1:$F$" &amp; ul).RemoveDuplicates Columns:=6, Header:=xlYes
[A1].Select
End Sub

Un saludo.

Edito:

No entiendo porque si tienes base 1 solo sale un coche y teniendo base 2 te salen dos

Share this post


Link to post
Share on other sites

No sé, veo que me debo explicar muy mal porque esto tampoco es lo que necessito. En la hoja 1 tengo todas las entradas y salidas de cocues de cada base, si un coche el último moviemiento que tiene es de salida esto significa que al sacar el listado de existencias ya no tiene que aparecer. Por eso al poner base 1 sale sólo un coche ya que los demás el último movimiento que han tenido es de "salida" (ya no estan en la base). Lo mismo que en la base dos.

La macro que me has puesto me elimina los datos de origen.

Share this post


Link to post
Share on other sites

Hola, adjunto el archivo con las modificaciones hechas después de la aportación de ioyama. El problema es que primero hago el listado de las ultimas entradas en todas las bases y al final en la hoja 3 hago el filtro. Preferiria que se hiciera todo de golpe... Supongo que es posible.

Vehiculosv3.xls

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

×
×
  • Create New...

Important Information

Privacy Policy