Buenas Tardes: Estoy buscando una forma de excel que me permita buscar la fecha más alta de muchas fechas con dos criterios, es decir, supongamos que tengo la siguiente información: Columna A: Nro Centro Columna B: CIF Columna C: Fecha Columna D: Cobros Yo necesito saber el ultimo cobro de un CIF respecto a un Nro de Centro, dado que puedo tener varios cobros con distintas fechas.
¿Se entiende mi pregunta? Podría adjuntar un ejemplo, pero no sé como se hace Si alguien por favor me podría ayudar! Muchísimas gracias!
1 Respuesta
Respuesta de santiagomf
1
1
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
Te he preparado estas dos funciones que creo que están bastante claras para que puedas ajustarlas a tus necesidades: Option Explicit Const nColCentro = 1 ' Columna en la que se encuentra el centro Const nColCIF = 2 ' Columna en la que se encuentra el cif Const nColFecha = 3 ' Columna en la que se encuentra la fecha Const nColCobros = 4 ' Columna en la que se encuentran los cobros Function buscarMayorFecha(ByVal nCentro As Integer, ByVal cif As String) As Variant Dim nLin As Integer Dim maxFecha As Date Dim aux As Variant ' Para leer el contenido de la celda de la fecha si coinciden el centro y cif buscarMayorFecha = "" If Trim$(cif) = "" Then Exit Function maxFecha = DateSerial(1900, 1, 1) For nLin = 1 To Cells.SpecialCells(xlCellTypeLastCell).Row If Cells(nLin, nColCentro) = nCentro And UCase$(Cells(nLin, nColCIF)) = UCase$(cif) Then aux = Cells(nLin, nColFecha) If aux <> "" Then ' SI la celda contiene algo If IsDate(aux) Then ' Y es de tipo fecha If aux > maxFecha Then maxFecha = aux ' Y es mayor que la última que teníamos... esta es la mayor End If End If End If Next nLin ' Si la máxima fecha es mayor que el 1/1/1900... entonces es que hemos encontrado alguna. ' Si no es mayor devolvemos... nada, una cadena de texto vacía que ya tiene asignado If maxFecha > DateSerial(1900, 1, 1) Then buscarMayorFecha = maxFecha End Function Function sumaCobrosCentroCifFecha(ByVal nCentro As Integer, ByVal cif As String, ByVal fecha As Variant) As Variant Dim nLin As Integer Dim sumaCobros As Double Dim snAlgunValor As Boolean Dim aux As Variant ' Para leer el contenido de la celda de la fecha si coinciden el centro y cif sumaCobrosCentroCifFecha = "" If Trim$(cif) = "" Or fecha = "" Then Exit Function snAlgunValor = False sumaCobros = 0 For nLin = 1 To Cells.SpecialCells(xlCellTypeLastCell).Row If Cells(nLin, nColCentro) = nCentro And UCase$(Cells(nLin, nColCIF)) = UCase$(cif) And Cells(nLin, nColFecha) = fecha Then aux = Cells(nLin, nColCobros) If aux <> "" Then ' SI la celda contiene algo If IsDate(aux) Then ' Y es de tipo numérico... lo sumamos a los cobros sumaCobros = sumaCobros + aux snAlgunValor = True ' Hay algún valor encontrado End If End If End If Next nLin ' Si hemos encontrado algún valor... devolvemos la suma. Si no... devolvemos una cadena de texto vacía If snAlgunValor Then sumaCobrosCentroCifFecha = sumaCobros Else sumaCobrosCentroCifFecha = "" End Function En los campos 'texto' (supongo que el CIF) utilizo la función UCASE$ para que compare siempre en mayúsculas y evitar que pueda no reconocer un cif por estar en minúsculas.
Ufff no sé qué es esto ni como se utiliza en excel. ¿No existe una fórmula normalita para conseguilo? Tipo sumar. Si. Conjunto pero en lugar que sume que devuelva el valor más alto... ¿puede ser?
No sé si la hay, pero yo no la conozco. El código que te he puesto hay que grabarlo en un módulo de Visual Basic. Es fácil Entra en el editor de Visual Basic a través del menú de herramientas - macros o bien pulsando las teclas <Alt><F11> Una vez que se abra la ventana del editor, añade un nuevo módulo en el menú "insertar - módulo". Te aparecerá una parte de la ventana en blanco (normalmente en la parte derecha y hacia arriba). Es ahí dónde tienes que copiar y pegar el código. De esa forma definirás las nuevas funciones para tu hoja de cálculo y así podrás usarlas sin ningún problema. Si me dejas una dirección de correo te mando una hoja de cálculo con las funciones ya grabadas. De todas formas... animo, que no es tan difícil. Lo complicado es empezar, con el tiempo lo vas viendo cada vez más sencillo.