Búsqueda entre dos condiciones
Saludos
Como hago lo siguiente:
Tengo un diario de ventas de artículos la cual al final del dia al presionar un botón de cierre del dia borra el contenido para comenzar en cero y una hoja de registro en la que me va registrando las ventas diarias, esta es como mi histórico para cierre de mes.
Quiero que en la hoja de registro los artículos vendidos no se repitan en la fecha en que los vendo (Varios clientes pidiendo lo mismo). Y lo que necesito es hacer lo siguiente: una macro que me chequee si la fecha existe y si el articulo existe en esa fecha entonces que agregue la cantidad vendida y si no esta el articulo entonces que en la siguiente fila vacía agregue agregue en cada celda fecha, articulo y cantidad.
Espero su ayuda y que me hayan entendido
1 Respuesta
Tomo la consulta. Trataré de resolverla mañana. No finalices aún.
Escribime la macro del pase de Diario a Resumen, para poder tomar las columnas de cada item y hacer el agregado en base a eso.
Sdos!
Estoy esperando...
¿No tenés una macro que pase del diario al resumen? Entonces indicame los nombres de las hojas y los encabezados de cada hoja para saber dónde mirar y dónde volcar los datos,.,
Sdos!
Saludos Elsa y disculpe
NO tengo macro para pasar de diario a resumen ya que como dije antes no se como hacer
para que si un articulo es vendido dos o tres veces en el dia en la hoja resumen este
aparezca solo una vez con el total vendido. Solo le puedo dar la idea de que la condiciones
sean primero buscar que la fecha exista en este caso en la columna "A" en la columna "B"
esta el código asignado al articulo, en la "C" el nombre del articulo y en la "D" es donde
quiero que vaya el total vendido (Esto en la hoja resumen)
Te envío una captura de lo que tengo
Y mi código actual de momento solo tengo las hojas inventario y diario y quite algo al código que no viene al caso pero esto es lo que tengo:
Sub Venta()
Dim resultado As Range
Dim activa As Integer
Dim stock As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
'---------------------------------------------------------------
If Diariox.Cells(5, 4) = "" Then
MsgBox ("No hay cantidad para rebajar del Inventario"), vbInformation, "AVISO"
Else
'Búsqueda de contenido de celda en la hoja de inventario
Set resultado = Inventariox.Range("b:b").Find(Diariox.Cells(5, 3), , xlValues, xlWhole, xlByColumns, xlNext, False, , False)
'Guardando ubicación de la fila de la celda con el valor en hoja inventario
activa = resultado.Row
'Seleccion de de la hoja inventario para hacer descuento
Inventariox.Select
'Activacion de la celda donde esta el nombre del articulo para usarla como referencia
Range("B" & activa).Select '=
'Rebajaomos inventario
ActiveCell.Offset(0, 1) = ActiveCell.Offset(0, 1) - Diariox.Cells(5, 4)
'Seleccion de la pagina diario para buscar fila vacia en seccion de diario
Diariox.Select
'Búsqueda de celda vacia en el diario de venta
countult = Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Row
'MsgBox countult
Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Select
'Copia de datos en diario
Cells(countult, 1).Value = Date
Cells(countult, 2).Value = Diariox.Cells(5, 2)
Cells(countult, 3).Value = Diariox.Cells(5, 3)
'Cantidad
Cells(countult, 4).Value = Diariox.Cells(5, 4)
Cells(countult, 5).Value = Diariox.Cells(5, 5)
Cells(countult, 6).Value = Diariox.Cells(5, 6)
'Vendedor
Cells(countult, 8).Value = Diariox.Cells(5, 8)
'Venta
Cells(countult, 13).Value = Diariox.Cells(5, 10)
Cells(countult, 18).Value = Diariox.Cells(5, 6) - Diariox.Cells(5, 10)
'Acumulado del dia
Diariox.Cells(3, 14).Value = Diariox.Cells(3, 14) + Diariox.Cells(5, 6)
'Acumulado del mes
Diariox.Cells(6, 14).Value = Diariox.Cells(6, 14) + Diariox.Cells(5, 6)
'Acumulado Papeleria
Diariox.Cells(6, 17).Value = Diariox.Cells(6, 17) + Diariox.Cells(5, 10)
'Acumulado de Beneficio
Diariox.Cells(8, 19).Value = Diariox.Cells(8, 19) + (Diariox.Cells(5, 6) - Diariox.Cells(5, 10))
Diariox.Cells(5, 3).Value = ""
Diariox.Cells(5, 4).Value = ""
End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
'ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
End Sub
Sub Compra()
'--------------------------------------------------------------------------------------------------
Dim resultado As Range
Dim activa As Integer
Dim stock As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Select Case Diariox.Cells(9, 1)
'---------------------------------------------------------------
If Diariox.Cells(9, 4) = "" Then
MsgBox ("No hay cantidad para rebajar del Inventario"), vbInformation, "AVISO"
Else
'Búsqueda de contenido de celda en la hoja de inventario
Set resultado = Inventariox.Range("b:b").Find(Diariox.Cells(9, 3), , xlValues, xlWhole, xlByColumns, xlNext, False, , False)
'Guardando hubicacion de la fila de la celda con el valor en hoja inventario
activa = resultado.Row
'Seleccion de de la hoja inventario para hacer descuento
Inventariox.Select
'Activacion de la celda donde esta el nombre del articulo para usarla como referencia
Range("B" & activa).Select '=
'Sumamos inventario
ActiveCell.Offset(0, 1) = ActiveCell.Offset(0, 1) + Diariox.Cells(9, 4)
'Seleccion de la pagina diario para buscar fila vacia en seccion de diario
Diariox.Select
'Búsqueda de celda vacia en el diario de venta
countult = Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Row
'MsgBox countult
Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Select
'Copia de datos en diario
Cells(countult, 1).Value = Date
Cells(countult, 2).Value = Diariox.Cells(9, 2)
Cells(countult, 3).Value = Diariox.Cells(9, 3)
'Cantidad
Cells(countult, 4).Value = Diariox.Cells(9, 4)
Cells(countult, 5).Value = Diariox.Cells(9, 5)
'Cells(countult, 6).Value = Diariox.Cells(9, 6)
'Vendedor
Cells(countult, 8).Value = Diariox.Cells(5, 8)
'Compra
Cells(countult, 14).Value = Diariox.Cells(9, 6)
'Acumulado del compra
Diariox.Cells(6, 18).Value = Diariox.Cells(6, 18) + Diariox.Cells(9, 6)
End If
Diariox.Cells(9, 1).Value = ""
Diariox.Cells(9, 3).Value = ""
Diariox.Cells(9, 4).Value = ""
Diariox.Cells(9, 5).Value = ""
Diariox.Cells(9, 8).Value = ""
Case Else
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
'ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
'--------------------------------------------------------------------------------------------------
End Sub
Sub Cierre()
Diariox.Select
If Diariox.Cells(3, 14) = "" Then
MsgBox ("No hay información para cerrar"), vbInformation, "AVISO"
Else
'Búsqueda de celda vacia en el diario de venta
countult = Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Row
'MsgBox countult
Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Select
'Seleccion de celda par formatear
Cells(countult, 3).Select
With Selection.Font
.Name = "Calibri"
.Size = 11
.Color = -52429
End With
Selection.Font.Bold = True
Cells(countult, 3).Value = "'--- TOTAL DEL VENTA DEL DIA --- "
'Seleccion de celda par formatear
Cells(countult, 6).Select
With Selection.Font
.Name = "Calibri"
.Size = 11
.Color = -52429
End With
Selection.Font.Bold = True
'Total del dia
Cells(countult, 6).Value = Diariox.Cells(3, 14)
'Seleccion de celda par formatear
Cells(countult, 8).Select
With Selection.Font
.Name = "Calibri"
.Size = 11
.Color = -52429
End With
Selection.Font.Bold = True
'Cierre en la linea de Vendedor
Cells(countult, 8).Value = "'---------"
'Borrado valor de celda fin del dia
Diariox.Cells(3, 14).Value = ""
Diariox.Cells(5, 3).Select
End If
End Sub
PD.: El código esta en un modulo y es llamado por los botones Venta, Compra y Cierre
En inventario las columnas están dispuestas:
A - Código
B - Articulo
C - Stock
E - Precio Compra
F - Precio Venta
Nombres internos de las hojas Diario - Diariox la de inventario - Inventariox
Esto lo pongo para ser mas entendible
Je je, ya hay como un exceso de información.
Te paso la parte de la macro que interesa para acumular o registrar el importe... luego tendrás que ver cómo sigue.
Sub Venta() Dim resultado As Range Dim activa As Integer Dim stock As Integer Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ActiveSheet.DisplayPageBreaks = False '--------------------------------------------------------------- If Diariox.Cells(5, 4) = "" Then MsgBox ("No hay cantidad para rebajar del Inventario"), vbInformation, "AVISO" Else 'Búsqueda de contenido de celda en la hoja de inventario Set resultado = Inventariox.Range("b:b").Find(Diariox.Cells(5, 3), , xlValues, xlWhole, xlByColumns, xlNext, False, , False) 'Guardando ubicación de la fila de la celda con el valor en hoja inventario 'activa = resultado.Row 'controlamos si se trata de la misma fecha- 'resultado' está en B y fecha en col A If resultado.Offset(0, -1) = Date Then 'suma a la cantidad existente que está en D resultado.Offset(0, 2) = resultado.Offset(0, 2) + Diariox.Cells(5, 4) Else 'busco la 1er fila libre de hoja Inventario para libre = Inventariox.Range("C65536").End(xlUp).Row + 1 Inventariox.Cells(libre, 1) = Date Inventariox.Cells(libre, 2) = Diariox.Cells(5, 2) Inventariox.Cells(libre, 3) = Diariox.Cells(5, 3) Inventariox.Cells(libre, 4) = Diariox.Cells(5, 4) End If 'cierra el 1er If End If 'hasta aquí la parte del pase.
Hay distintas maneras de encontrar la primer fila libre, la tuya es totalmente válida en algunos casos (countult = Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Row)
Dejá la que mejor te quede.
PD) Me parece que te parabas en la col B, y luego intentabas incrementar lo de la col C ... revisa esa parte. De todos modos eso ya no iría. Además de que no es necesario seleccionar la hoja Inventario hasta donde me toca por lo menos.
Range("B" & activa).Select '=
'Rebajaomos inventario
ActiveCell.Offset(0, 1) = ActiveCell.Offset(0, 1) - Diariox.Cells(5, 4)
Ahora sí... leete los comentarios para ver donde agregar algunas líneas que faltan.
Sub Venta() Dim resultado As Range Dim activa As Integer Dim stock As Integer '--------------------------------------------------------------- If Cells(5, 4) = "" Then MsgBox ("No hay cantidad para rebajar del Inventario"), vbInformation, "AVISO" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ActiveSheet.DisplayPageBreaks = False 'Búsqueda de contenido de celda en la hoja de inventario Set resultado = Inventariox.Range("b:b").Find(Cells(5, 2), , xlValues, xlWhole, xlByColumns, xlNext, False, , False) 'Guardando ubicación de la fila de la celda con el valor en hoja inventario activa = resultado.Row 'inicio el recorrido revisando fechas para = codigo Do 'controlamos si se trata de la misma fecha- 'resultado' está en B y fecha en col A If resultado.Offset(0, -1) = Date Then 'suma a la cantidad existente que está en D resultado.Offset(0, 2) = resultado.Offset(0, 2) + Cells(5, 4) esta = 1 End If 'paso al registro siguiente Set resultado = Inventariox.Range("b:b").FindNext(resultado) 'ejecuto el bucle mientras no sea la misma fila ya encontrada Loop While resultado.Row <> activa And esta = 0 'si la variable está en 0 significa que no encontró código para el día If esta = 0 Then 'busco la 1er fila libre de hoja Inventario para libre = Inventariox.Range("C65536").End(xlUp).Row + 1 Inventariox.Cells(libre, 1) = Date Inventariox.Cells(libre, 2) = Cells(5, 2) Inventariox.Cells(libre, 3) = Cells(5, 3) Inventariox.Cells(libre, 4) = Cells(5, 4) '-------otros campos--------------- End If 'hasta aquí la parte del pase. FALTA limpiar --------- Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True 'ActiveSheet.DisplayPageBreaks = True Application.CutCopyMode = False End Sub
Hay una dif en tu código acerca de qué dato se busca, si el art (col 3) o el cód (col 2) ...
Buen dia Elsa
Creo que hubo una confusión, coloque el código que tengo para que vea su funcionamiento pero lo que quiero es una hoja de resumen de artículos vendidos, es decir, al presionar el botón cierre que me genere algo parecido a lo siguiente:
Ventas del dia en hoja de DIARIO:
FECHA CÓDIGO ARTICULO CANT. PRECIO TOTAL
05/02/2014 | SC00001 | RESMA PAPEL BOND | 2 | $210 | $420
05/02/2014 | SC00014 | FELPAS EN GEL | 1 | $100 | $100
05/02/2014 | SC00001 | RESMA PAPEL BOND | 1 | $210 | $210
05/02/2014 | SC00020 | CUADERNO 200 PAG. | 2 | $35 | $70
Al presionar el botón de cierre que se genere en la hoja RESUMEN
FECHA CÓDIGO ARTICULO CANT.
05/02/2014 | SC00001 | RESMA PAPEL BOND | 3 |
05/02/2014 | SC00014 | FELPAS EN GEL | 1 |
05/02/2014 | SC00020 | CUADERNO 200 PAG. | 2 |
En la hoja RESUMEN la fecha realmente puede ser poner el mes ya que la idea es saber que articulo se vende mas y cual menos la idea es no contarlos uno a uno porque es tedioso estar de una hoja a otra. Y ese es el código que no tengo.
Hoja RESUMEN
Buscar fecha
si fecha no existe agregarla y agregar información de articulo mas la cantidad,
si la fecha existe entonces buscar articulo en esa fecha de encontrarlo entonces suma cantidad de lo contrario agregar fecha e información de articulo mas la cantidad
Gracias, espero me entiendas
Es que tu código daba idea de que se ejecuta solo para el contenido de la celda Cod o Art:
Sub Venta()
'---------------------------------------------------------------
If Diariox.Cells(5, 4) = "" Then
MsgBox ("No hay cantidad para rebajar del Inventario"), vbInformation, "AVISO"
Else
'... y aquí venía el pase de datos. Entonces es solo pase x pase.
Bien, aquí va la nueva, para una hoja llamada Resumen y se ejecuta desde la hoja Diario.
Se desarrolló según el ejemplo enviado. Si luego querés un resumen mensual podes filtrar por mes o agregar una col con fórmula = MES(A2) hacia abajo. }
La opción SUBTOTALES del menú Datos te permitirá obtener el resumen mensual.
PD) No pude adjuntar la 2da macro, quizás nos excedimos en contenido para 1 sola entrada.
Por favor finaliza ésta, dejá una nueva indicando que es para mi y te la adjunto.
Sdos
Elsa
- Compartir respuesta