Búsqueda de valores repetidos en una columna

Intento programar en un código una búsqueda de un valor en un rango de valores en la columna F y que cada uno tiene asociado un valor en la columna AP, tal que si por ejemplo la cantidad de veces que se repite el valor 298730 en F es >= 2, entonces podré hacer el promedio (AVERAGE) de sus valores asociados en AP pero si no, que muestre un mensaje que diga: "No se puede hacer el promedio"

Estoy trabajando con la formula CONTAR. SI pero hay algo que estoy haciendo mal al instalar la forma de búsqueda.

Pego el código sacado de contexto y quisiera puedas mirarlo y decirme que estoy haciendo mal.

Desde ya muchas gracias!

Case "298730"
lÚltimaFila = Worksheets("Historico").[AP2].End(xlDown).Row
ComboBox4.AddItem Hoja3.Range("L10").Value
'-------------------------------------------------------------------------------------------------------------------
If ActiveCell.FormulaR1C1 = "=IF(COUNTIF((R1C1:R65000C6),""298730"") < 2)" Then
ComboBox4.AddItem Format((Evaluate("=MAX(IF('Historico'!F2:F" & lÚltimaFila & "=" & CStr(CodigoM.Value) & ",'Historico'!AP2:AP" & lÚltimaFila & "))")), "0.000") 'REAL
'ComboBox4.AddItem Format((Evaluate("=AVERAGE(IF('Historico'!F2:F" & lÚltimaFila & "=" & CStr(CodigoM.Value) & ",'Historico'!AP2:AP" & lÚltimaFila & "))")), "0.000") 'PROMEDIO
Label12.Caption = "hh/ml"
Else
ComboBox4.AddItem Format((Evaluate("=AVERAGE(IF('Historico'!F2:F" & lÚltimaFila & "=" & CStr(CodigoM.Value) & ",'Historico'!AP2:AP" & lÚltimaFila & "))")), "0.000") 'PROMEDIO
ComboBox4.AddItem Format((Evaluate("=MAX(IF('Historico'!F2:F" & lÚltimaFila & "=" & CStr(CodigoM.Value) & ",'Historico'!AP2:AP" & lÚltimaFila & "))")), "0.000") 'REAL
Label12.Caption = "hh/ml"
End If

1 Respuesta

Respuesta
1

Reemplaza esto:

If ActiveCell.FormulaR1C1 = "=IF(COUNTIF((R1C1:R65000C6),""298730"") < 2)" Then

Por esto:

    ActiveCell.FormulaR1C1 = "=COUNTIF((R1C1:R65000C6),""298730"")"
    If ActiveCell < 2 Then

Dante

Coloque la expresión que me comentaste pero el ActiveCell siempre queda con valor 0 y obviamente sale por la opción de no hacer el AVERAGE. Me asegure de cambiar la cantidad de valores 298739 e la columna F desde ninguno a 3 y siempre sale por no hacer el promedio

¿Qué podrá ser?

Puede ser que el número 298739, lo está buscando como texto y en las celdas tienes números. Entonces no debería ir entre comillas

ActiveCell.FormulaR1C1 = "=COUNTIF((R1C1:R65000C6),298730)"
    If ActiveCell < 2 Then

Dante, hice la corrección pero aun así, no cuenta la cantidad de artículos iguales; es decir, el ActiveCell queda en cero luego pasara siempre sin hacer el Promedio.

Me asegure que este sin comillas y poner todas las celdas como números pero no cuenta el articulo que esta repetido 2 veces.

Es difícil saber qué tienes en la celda, sin una imagen o si tu archivo, yo hice la prueba y las 2 fórmulas me funcionan.

Prueba con la fórmula en una macro nueva y con un dato controlado.

Pon el cursor, por ejemplo en la celda H2 y ejecuta la macro

Sub x()
ActiveCell.FormulaR1C1 = "=COUNTIF((R1C1:R65000C6),123)"
End Sub

Ahora escribe el número 123 en cualquier celda dentro del rango A1:F65000

De esa forma podrás revisar que la fórmula es correcta.


La fórmula funciona correctamente. Lo que tampoco entiendo es que en tu macro tienes un select case y ahí tienes esto:

Case "298730"

Estás preguntando por el texto, pero si tienes un número, es probable que ni siquiera entre por ese case.


s a l u d o s

Si no te es inconveniente, quisiera poder pasarte por mail el programa y la guía de como llegar al problema

Muchas gracias Dante!

Además Dante, el valor que obtengo con CONTAR.SI, no va a una celda en cuestión sino que lo toma un ComboBox, ese creo es el problema.

Pero tu macro tiene esto:

If ActiveCell.FormulaR1C1 = "=IF(COUNTIF((R1C1:R65000C6),""298730"") < 2)" Then

Entonces ya no sé qué es lo que necesitas.

Dante, eso es algo que yo considere colocar pero obviamente me doy cuenta que no debe estar bien.

Lo que necesito es calcular para cada código (Case...) el PROMEDIO además de otras cosas y cuando va al Histórico, si no encuentra datos > o = a 2, no puede hacer el mismo, para lo cual quisiera salte un mensaje de error.

Pensé que colocando esa fórmula podría filtrar que salte el depurador cuando no encuentra suficientes datos en col F de Histórico pero evidentemente no lo logre.

La fórmula está bien, pero para que la entiendas deberás probarla por separado.

Prueba con la fórmula en una macro nueva y con un dato controlado.

Pon el cursor, por ejemplo en la celda H2 y ejecuta la macro

Sub x()
ActiveCell.FormulaR1C1 = "=COUNTIF((R1C1:R65000C6),123)"
End Sub

Ahora escribe el número 123 en cualquier celda dentro del rango A1:F65000

De esa forma podrás revisar que la fórmula es correcta.


No puedo avanzar con lo que sigue hasta que me confirmes si probaste la fórmula y funcionó la cuenta.

Si Dante

Es correcta la fórmula. Ya la había probado en una hoja y funciona perfecto.

Vamos por partes:

Esto es algo muy complejo

ComboBox4.AddItem Format((Evaluate("=AVERAGE(IF('Historico'!F2:F" & lÚltimaFila & "=" & CStr(CodigoM.Value) & ",'Historico'!AP2:AP" & lÚltimaFila & "))")), "0.000")


Entiendo que quieras minimizar el código y que quieras ocupar en un solo paso el formato, evaluar, calcular el promedio y además una condición IF, si así te funciona, no tengo problemas, pero si no te funciona entonces hay que irse por las piedritas, es decir, paso a pasito.

Primero, necesitas saber si hay datos para realizar el promedio, ¿correcto?

Entonces:

    Set hi = Sheets("Historico")                                'establecer la hoja en una variable
    uf = hi.[AP2].End(xlDown).Row                               'utilizar nombres cortos en las variables
    res = Application.CountIf(hi.Range("F2:F" & uf), CodigoM)   'contar
    If res > 0 Then
        ComboBox4.AddItem Format((Evaluate("=AVERAGE(IF('" & hi.Name & "'!F2:F" & uf & "=" & _
                          CStr(CodigoM) & ",'" & hi.Name & "'!AP2:AP" & uf & "))")), "0.000")
    End If

o calculas primero el promedio y después le pones formato.

    Set hi = Sheets("Historico")                                'establecer la hoja en una variable
    uf = hi.[AP2].End(xlDown).Row                               'utilizar nombres cortos en las variables
    res = Application.CountIf(hi.Range("F2:F" & uf), CodigoM)   'contar
    If res > 0 Then
        prom = Application.AverageIf(hi.Range("F2:F" & uf), CStr(CodigoM), hi.Range("AP2:AP" & uf))
        ComboBox4.AddItem Format(prom, "0.000")
    End If

De esa forma al momento de depurar el código puedes saber el valor que estás obteniendo en cada paso, si pones todo en un solo paso, quién sabe en dónde está el problema.


s a l u d o s

¡Gracias! Dante!

Excelente!

Había considerado una alternativa que es poner en celdas del Histórico la fórmula de CONTAR.SI para cada Código y hacer referencia a ellas pero necesitaba ponerlo por Macro.

Lo tuyo es excelente de verdad!

Muchas gracias nuevamente!

Daniel.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas