¿Cómo busco en las hojas de Excel un valor de precio más reciente para un artículo?

Supuse que querrá poner el precio más reciente en una celda y posiblemente mostrar la fecha en que ocurrió. Puede hacer esto con el código VBA.

Tal como está escrito, se activa un sub evento Evento Worksheet_BeforeDoubleClick cuando hace doble clic en una celda que contiene un número de elemento (o posiblemente una descripción). Ese sub evento luego llama a la función MostRecentPrice definida por el usuario que busca en las otras hojas de trabajo el mismo número de artículo. Devuelve una matriz de dos elementos que contiene el precio más reciente y la fecha correspondiente. El sub evento Evento Worksheet_BeforeDoubleClick coloca el precio más reciente en la columna de precios y muestra un cuadro de mensaje con la fecha asociada.

El código asume que la fecha de la factura está en la celda A1, los números de artículo están en la columna C y los precios en la columna E. Comenté el código para que pueda ver dónde se deben hacer cambios para diferentes supuestos.

Tenga en cuenta que el sub Worksheet_BeforeDoubleClick debe instalarse en el panel de códigos de la nueva hoja de facturas. No funcionará en absoluto si lo pones en otro lugar. Haga clic con el botón derecho en la pestaña de la hoja y elija Ver código … para mostrar ese panel de código. La función definida por el usuario MostRecentPrice puede instalarse en el mismo lugar, pero la mayoría de los programadores la colocarían en una hoja de módulo normal.

Tenga en cuenta también que debe guardar el libro con la extensión de archivo .xlsm. Guardar el libro con una extensión .xlsx eliminará las macros, y ¿cuál sería la diversión en eso?

‘Este código debe ir en el panel de código de la hoja de trabajo que se está buscando para hacer doble clic. ¡No funcionará si se instala en otro lugar!
Private Sub Worksheet_BeforeDoubleClick (Por valor de objetivo como rango, Cancelar como booleano)
‘Se activa cuando hace doble clic en una celda con un número de artículo o una descripción. _ _
Pone el precio más reciente en la columna de precios y muestra el cuadro de mensaje con la fecha más reciente.
Dim PriceColumn As String
Dim ItemColumn As String
Dim Price como variante
PriceColumn = “E” ‘Los precios van aquí
ItemColumn = “C” ‘El número de artículo o la descripción van aquí
Si no se cruza (Target, Me.Columns (ItemColumn)) no es nada entonces
Si Target.Value “” Entonces
Precio = Precio más reciente (objetivo)
Intersecar (Target.EntireRow, Me.Columns (PriceColumn)). Valor = Precio (0)
If Price (1) “” Then MsgBox “El precio más reciente ocurrió en” & CDate (Price (1))
Cancelar = Verdadero ‘Desactiva temporalmente el significado normal de la acción de doble clic
Terminara si
Terminara si
End Sub

Función MostRecentPrice (artículo como rango) como variante
‘Busca en todas las hojas de trabajo del libro de trabajo el precio y la fecha más recientes para el artículo
Dim ws As Worksheet
Dim rg As Range
Dim LatestDate As Date, wsDate As Date
Dim dateAddress As String, PriceColumn As String
Dim Price como variante
dateAddress = “A1” ‘La fecha de la factura se encontrará en esta celda
PriceColumn = “E” ‘El precio se encontrará en esta columna
If Item.Value “” Entonces
Para cada ws en Item.Parent.Parent.Worksheets
Seleccionar caso con nombre
Case Item.Parent.Name, “Data” ‘No busque en estas hojas de trabajo
Caso diferente
Establecer rg = Nada
Establezca rg = ws.Columns (Item.Column) .Find (Item.Value, LookAt: = xlWhole, MatchCase: = False)
Si no rg no es nada entonces
wsDate = CDate (ws.Range (dateAddress))
Si wsDate> LatestDate entonces
Precio = Intersecar (rg.EntireRow, ws.Columns (PriceColumn)). Valor
LatestDate = wsDate
Terminara si
Terminara si
Seleccionar final
próximo
Terminara si
If LatestDate> 0 entonces
MostRecentPrice = Array (Precio, LatestDate)
Más
MostRecentPrice = Array (“No encontrado”, “”)
Terminara si
Función final

La forma más sencilla sería ordenarlos por fecha y luego buscar manualmente su artículo. Trabajo más corto a corto plazo, mucho más trabajo a largo plazo.

Mejor respuesta: filtro avanzado

  1. Inserte algunas filas en blanco en la parte superior.
  2. Copie los encabezados de columna en la fila 1
  3. Ingrese sus criterios, como el nombre del artículo o el número del artículo
  4. Haga clic en la tabla con sus datos. (Tenga en cuenta que no tiene que formatearse como una tabla, ni tener todo seleccionado, pero SÍ debe tener encabezados de columna)
  5. Seleccione la pestaña Datos y luego “Filtro / consulta avanzada”
  6. Su rango de lista se debe completar automáticamente. Para criterios, seleccione y arrastre a través de los encabezados de sus columnas y las filas debajo de ellos con información de criterios.
  7. Sugiero el filtro en su lugar, aunque es posible que desee copiar a otra ubicación.

La ventaja es que puede seguir usando el mismo filtro / clasificación avanzado, una y otra vez. Has hecho el trabajo duro, todo lo que haces es cambiar los criterios,

Es POSIBLE, pero no tan fácil, poner los criterios de filtro y el destino del resultado en una nueva hoja en blanco.

Lo siento, acabo de pasar los últimos 45 minutos a una hora tratando de responder su pregunta sin recurrir a escribir código. Me di por vencido cuando me di cuenta de que me iba a llevar mucho más tiempo de lo que pensaba. Estaba tratando de incorporar las funciones DMAX, INDEX, MATCH, COUNTIF e INDIRECT en una fórmula de matriz para devolver el precio de un artículo de inventario con la última fecha basada en una lista de las hojas de trabajo que le interesan. Quizás alguien más inteligente que yo pueda ven y responde esto en menos de las dos horas que me hubiera llevado.

El punto es que la respuesta no es trivial. (Si es así, sinceramente me gustaría ver la respuesta. Sería una verdadera educación). Sería MUCHO más fácil si pudiera consolidar los datos en una lista maestra. Hay varias formas de hacer esto, incluido el uso de la funcionalidad de consolidación de Excel ( https://support.office.com/en-us …), pero incluso así, DMAX sería una especie de proceso complejo (DMAX devuelve el mayor valor de algo (como Fecha de factura) basada en múltiples criterios.

Realmente, realmente necesitas convertir tus datos a una base de datos si haces mucho de este tipo de cosas. En efecto, esto es lo que estás haciendo cuando consolidas tus datos en una sola lista. Una base de datos es algo que debe consultarse con frecuencia. Una vez que lo haya configurado, puede escribir una consulta en aproximadamente 30 segundos para devolver lo que está buscando. Y también podría escupir facturas.

Una base de datos de seguimiento de facturas es uno de los tipos de bases de datos de enseñanza clásicas (utilizando Factura y Detalle de factura como las tablas principales). Pero eso está más allá del alcance de esta pregunta.

Su pregunta es bastante vaga, por lo que debo suponer que existe una tabla con al menos fechas en una columna. La siguiente imagen muestra una solución al problema. Tenga en cuenta que uso punto y coma mientras que necesita usar una coma entre el argumento de la función.

Su pregunta es bastante vaga (como ya se mencionó en otra respuesta), pero esta fórmula puede ser útil para usted.

= ÍNDICE (C: C; COUNTA (C: C))

Devolveré el último valor que no esté en blanco en la columna C.

Esto es aún mejor, pero es una fórmula de matriz. No estoy seguro si estás familiarizado con eso.

{= ÍNDICE (B: B; MAX (ROW (B: B) * (B: B <> “”)))}

¿Varias hojas en un libro de trabajo?

¿Los mismos datos en cada hoja?

Ordenar cada hoja por fecha.

Mira el precio de fecha más reciente.

Seleccione la hoja con el precio más reciente.

Si no desea meterse con su conjunto de datos con una clasificación, agregue una columna numerada 1 o cree un libro de respaldo.