Macro VBA de contar caracter en un rango.

Sub ContarSI()
  With ActiveCell
    Range("BYC" & .Row) = WorksheetFunction.CountIf(Range("A" & .Row & ":ALL" & .Row), Range("BYA" & .Row))
  End With
End Sub

buenas tardes. Tengo esta macro la cual cuenta entre esos dos rangos, se encuentra el criterio que esta en la columna BYA, y el resultado lo pegue en la columna BYC, el tema es que esta lo hace de acuerdo a la celda donde este activo o posicionado, quisiera que esta vez lo hiciera autamaticamente en todas las celdas de la hoja, ya que en este caso tiene cerca de 2.000 filas. Entonces que al darle ejecutar haga el calculo automatico en todos los datos, tal vez sea algo muy basico pero he intentado y la verdad no me dan mis conocimientos en VBA. 

Mil gracias por sus ayudas. Bendiciones a ustedes.

2 Respuestas

Respuesta
1

Este link Numerador Rifas y Folios - Video 1 - YouTube le da una posibilidad.

Aunque esta compilado si le interesa le suministro el código fuente en donde está el algoritmo para hacer la numeración al azar y sin repetir número. Puede contactarme en [email protected] favor en el asunto anotar la consulta.

¡Gracias! Eduardo. Estuve viendo tu vídeo. Creo que en un futuro cercano me va a ser de ayuda esa herramienta. Pronto me estaré contestando. Bendiciones amigo

Respuesta
2

No entiendo tu macro.

Explica con ejemplos qué resultados esperas.

Gracias dante, que vergüenza, formule mal la pregunta. Te explico correctamente a continuación.. necesito por favor una macro que me busque si el criterio de la columna BYA se encuentra en el rango de las columnas ALN y BXY. Y su resultado lo coloque en la columna BYC. Si el criterio está pues su resultado sea 1 y si no. Su resultado sea 0. tal como lo haría la fórmula de Contar.si

Lo que pasa es que en la macro que te coloque anteriormente está que busque en el primer rango. Pero puedes omitir esa macro. La diferencia es que esa macro lo hace de acuerdo a la fila dónde esté activa.. yo la necesito que lo haga en toda los datos automáticamente. Osea que si tiene datos de la celda 1 a la la celda 2.000 lo haga de una sola ejercucion. Discúlpame que formule mal la pregunta . Mil gracias estoy atento Dante.

Utiliza la siguiente:

Sub contarsi()
  With Range("BYC10:BYC" & Range("BYA" & Rows.Count).End(3).Row)
    .Formula = "=COUNTIF(ALN:BXY,BYA10)"
    .Value = .Value
  End With
End Sub

Si quieres que permanezcan las fórmulas, borra esta línea:

    .Value = .Value

Te cuento que demora demasiado en arrojar los resultados. Te explico algo. Yo tengo esta:

Sub Contar()
  With ActiveCell
    Range("BYC" & .Row) = WorksheetFunction.CountIf(Range("ALN" & .Row & ":BXY" & .Row), Range("BYA" & .Row))
  End With
End Sub

ella trabaja muy bien y hace lo que necesito. coloca el resultado en la columna BYC y cuenta las veces q esta el resultado de la columna BYA en el rango ALN:BXY. si no esta pues su resultado da = y si esta pues da 1o las veces que este. 

PERO lo hace solo en la celda que esta activa, tal cual como dice la maro "activeCell". Ahora en este caso, me gustaría cambiar que lo haga en todo el rango automáticamente, osea desde la fila 1 hasta la 2.000 que es lo que tiene datos.

No se si si solo haya que ingresarle alguna otra función solamente.

La que me pasaste anteriormente como lo que hace es introducir la fórmula, se tarda demasiado, creo que corre mejor cuando lo hace por medio de calculo en la macro.

Espero sea fácil Dante,, mil gracias disculpa tanta molestia, siempre atento a colaborarme.. bendiciones

Mi macro hace lo mismo que tu macro pero para todas las filas...

Hay que poner los datos en una matriz y contar con un diccionario

Preparo la macro...

Y su resultado lo coloque en la columna BYC. Si el criterio está pues su resultado sea 1 y si no. Su resultado sea 0.

Prueba el siguiente:

Sub Contar_Si()
  'Por Dante Amor
  Dim a As Variant, b As Variant, c As Variant
  Dim dic As Object
  Dim i As Long, j As Long, lr As Long
  '
  Set dic = CreateObject("Scripting.Dictionary")
  lr = Range("BYA" & Rows.Count).End(3).Row
  a = Range("ALN10:BXY" & lr).Value
  b = Range("BYA10:BYA" & lr).Value
  ReDim c(1 To lr, 1 To 1)
  '
  For i = 1 To UBound(a, 1)
    For j = 1 To UBound(a, 2)
      dic(a(i, j)) = Empty
    Next
  Next
  '
  For i = 1 To UBound(b, 1)
    If dic.exists(b(i, 1)) Then c(i, 1) = 1 Else c(i, 1) = 0
  Next
  Range("BYC10").Resize(UBound(c)).Value = c
End Sub

Avísame del tiempo para las 2000 filas.

Hice una prueba con 2000 registros y tarda 3 segundos.

Te cuento que revise la macro y efectivamente tarda pocos segundos en terminar su tarea, pero da algunos resultados erróneos, te adjunto captura para explicarte, en la columna BYC esta el resultado de la macro que cuenta cuantas veces esta el valor de la celda de la columna BYA enel rango entre ALN:BXY, Pero coloque en la columna BYE la fórmula "contar.si" para verificar si efectivamente estaba correcto y me encuentro con que la macro arrojo algunos valores como 1, cuando el valor no se encontraba en el rango, te coloque en colores amarillos los datos que si corresponden y se verifican con la fórmula, y con rojo los que están errados, ya que debería dar 0 porque ese dato de esa fila no se encuentra en el rango. Pero en tiempo de ejecución esta perfecto. :) Creo que falta algún ajuste y queda listo. Mil gracias

¿En dónde debe buscar?

Esta es tu petición:

Necesito por favor una macro que me busque si el criterio de la columna BYA se encuentra en el rango de las columnas ALN y BXY

Según tu fórmula, BYA10 solamente busca en la misma fila.

Tu petición es confusa, porque estás pidiendo que busque en las columnas ALN y BXY.

Puedes hacer la aclaración.

ahh ok. claro en la misma fila, osea todo en la misma fila.  osea el criterio de la columna BYA en el rango ALN:BXY pero de la misma fila.. me exprese mal :/

Prueba esta:

Sub Contar_Si()
  'Por Dante Amor
  Dim a As Variant, b As Variant, c As Variant
  Dim dic As Object
  Dim i As Long, j As Long, lr As Long
  '
  Set dic = CreateObject("Scripting.Dictionary")
  lr = Range("BYA" & Rows.Count).End(3).Row
  a = Range("ALN10:BXY" & lr).Value
  b = Range("BYA10:BYA" & lr).Value
  ReDim c(1 To lr, 1 To 1)
  '
  For i = 1 To UBound(a, 1)
    dic.RemoveAll
    For j = 1 To UBound(a, 2)
      dic(a(i, j)) = Empty
    Next
    If dic.exists(b(i, 1)) Then c(i, 1) = 1 Else c(i, 1) = 0
  Next
  '
  Range("BYC10").Resize(UBound(c)).Value = c
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas