Inicio > Microsoft Excel > gfellay > contar elementos repetidos en matriz

contar elementos repetidos en matriz

Experto:
Usuario:
Fecha: 08/08/2007
Valoración: (4,00 sobre 5) Categoría: Microsoft Excel
07/08/2007
malaguanyat, usuario preguntando en Microsoft Excel
Usuario
Hola,...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, q la segunda fila sea el numero de veces q se repite cada elemento en la matriz hasta su posicion, de tal manera q quede así:

tomates 1
peras 1
tomates 2


el motivo de intentar eso es q con rangos muy grandes la formula contar.si me va lento, y en cambio por lo q 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?

Saludos y muchas gracias
07/08/2007
malaguanyat, experto respondiendo en Microsoft Excel
Experto
la verdad que VB será "mucho" mas lento que la funcion 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 (como la usarias?) o directamente una macro que recorra el rango y coloque esta info...

Saludos
Gustavo
07/08/2007
malaguanyat, usuario preguntando en Microsoft Excel
Usuario
ah pues pensaba q 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 funcion 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 q le pido perfectamente pero para rangos grandes me va lento, y aunque no pretendo emular contar.si pq nunca lo hare mejor q la funcion 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 q me ha cabreado no saberlo hacer sin usar la función contar.si ;P

si no me he explicado bien, dimelo por favor, agradezco tu interés, gracias.

Salut.
07/08/2007
malaguanyat, experto respondiendo en Microsoft Excel
Experto
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.

Saludos
Gustavo
08/08/2007
malaguanyat, usuario preguntando en Microsoft Excel
Usuario
pues le dare la vuelta y me quedare con la primera opción. Gracias Gustavo.

Salut.
Enlaces patrocinados