Contar elementos repetidos en matriz

Trato de hacer como la función contar. Si pero en vez de en un rango, hacerlo en una matriz definida en vb, es decir, si la primera fila de la matriz es tomates, peras, tomates, que la segunda fila sea el numero de veces que se repite cada elemento en la matriz hasta su posición, de tal manera que quede así:
Tomates 1
Peras 1
Tomates 2
El motivo de intentar eso es que con rangos muy grandes la fórmula contar. Si me va lento, y en cambio por lo que observo, vb trabaja bastante más rápido con matrices y luego solo se trata de volcar los resultados a un rango.
¿Se te ocurre alguna manera?

1 respuesta

Respuesta
1
La verdad que VB será "mucho" más lento que la función contar. Si
Pero como quieras. Decime como quieres que siga. Igualmente no te entiendo que es lo que quieres que haga. Quisieras una matriz en vba (¿cómo la usarías?) O directamente una macro que recorra el rango y coloque esta info...
Ah pues pensaba que sería más rapido,... tengo un rango de 5 columnas,... hago una macro donde concateno 4 columnas de esas cinco y copio el resultado a otro hoja... si hago esa macro usando un bucle, a partir de las diez mil filas me va un poco lento, en cambio si cargo una matriz para lograr eso y luego la vuelco en un rango, va bastante bastante más rapido... obtenida esa fila en una matriz, es cuando quiero contar cuantas veces se repite cada elemento hasta su posición y solo lo se hacer volcando el resultado en un rango y usar la función contar. Si...
Sub ContarMatriz()
Dim i As Integer, concatenado As Integer
Dim rang As Range
Dim matriz() As String
Set rang = Worksheets("Hoja1").Range("A1").CurrentRegion
ReDim matriz(1 To rang.Rows.Count)
For i = 1 To rang.Rows.Count
matriz(i) = rang(i, 2) & "_" & rang(i, 3) & "_" & rang(i, 4) & "_" & rang(i, 5)
Next i
Range(Cells(1, 6), Cells(rang.Rows.Count, 6)) = Application.WorksheetFunction.Transpose(matriz)
For i = 1 To rang.Rows.Count
concatenado = Application.WorksheetFunction.CountIf(Range(Cells(1, 6), Cells(i, 6)), Cells(i, 6))
matriz(i) = rang(i, 2) & "_" & rang(i, 3) & "_" & rang(i, 4) & "_" & rang(i, 5) & "_" & concatenado
Next i
Range(Cells(1, 6), Cells(rang.Rows.Count, 6)) = Application.WorksheetFunction.Transpose(matriz)
End Sub
Hace lo que le pido perfectamente pero para rangos grandes me va lento, y aunque no pretendo emular contar.si porque nunca lo haré mejor que la función de excel, quizás aquí no sea la función más apropiada de usar o quizás sí, no sé,... la cuestión es que me ha cabreado no saberlo hacer sin usar la función contar.si ;P
Si no me he explicado bien, dímelo por favor, agradezco tu interés, gracias.
Salut.
Es que las 2 opciones que se me ocurren son:
1) Con la función contar. Si
2) La forma que lo hiciste
Por esto creo que tenés que buscarle la vuelta y volver contra la primer opción.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas