Columnas
Hola! De nuevo yo. Muchas gracias por tu colaboración, ahora quiero preguntarte algo de nuevo: Tengo una columna de datos que se encuentra en desorden, necesito saber de esa columna cual es el dato que más se repite y el numero de veces que lo hace.
Muchas Gracias.
Muchas Gracias.
1 Respuesta
Respuesta de fjulianes
1
1
Marlenyrb :
Me parece que los más práctico es usar Tablas Dinámicas.
Supongo que la columna a analizar forma parte de un rango más amplio de datos.
Vamos a nombrar ese rango como RRR.
Ponemos el cursor en una celda cualquiera del rango y tecleamos CTRL+* (del teclado numérico de la derecha KeyPad) . Esto selecciona todo el rango .
Del menu seleccionamos INSERTAR / NOMBRE / DEFINIR RRR.
Ahora generamos la Tabla Dinámica mediante DATOS / Asistente para Tablas Dinámicas / Siguiente (Lista o BD de Micr. Excel) / RRR en Rango: / Siguiente .
Ahora estamos en el Paso 3 de 4 del Asistente para Tablas Dinámicas.
Y sobre la derecha vemos los nombres de los campos (encabezado de columnas) del rango de trabajo.
Supongo que la columna a analizar se llama PRODUCTO, y es una de los nombres que aparecen a la derecha.
Llevo el cursor a PRODUCTO y lo arrastro a la zona llamada FILA .
Vuelvo a llevar el cursor a PRODUCTO (en la derecha) y lo arrastro a la zona DATOS.
Allí se vera como SUMA DE PRODUCTO o CONTAR DE PRODUCTO.
Si es SUMA de PRODUCTO, hacer doble click sobre SUMA DE PRODUCTO. En "Resumir por:" clickear "Contar" en reemplazo de "Suma" . La leyenda cambia a CONTAR DE PRODUCTO . Y presionar el botón ACEPTAR.
Hacemos DOBLE CLICK en la leyenda PRODUCTO en zona FILA,
marcamos el Botón "Avanzado...",
En "Opciones de autoordenar" marcamos "Descendente",
Y en "Usar el campo", buscamos CONTAR DE PRODUCTO (o el nombre real del campo),
Botón "Aceptar" y nuevamente Botón "Aceptar"
Ahora volvimos al " el Paso 3 de 4 del Asistente para Tablas Dinámicas".
Presionamos el Botón "Siguiente" y luego el Botón Terminar .
En una hoja nueva vamos a ver la tabla con los elementos de la columna elegida y la cantidad de repeticiones de cada uno, ordenado en forma descendente. Solución del Problema.
Cuando agreguemos más filas al rango, debemos volver a dar el nombre mediante el mismo procedimiento expuesto arriba ( posicionar el cursor en una celda del rango, CTRL+*, INSERTAR / NOMBRE / DEFINIR RRR.).
En la hoja de la TD, poner el cursor en cualquier celda con datos de cantidad y del menu seleccionar DATOS / ACTUALIZAR DATOS.
La explicación se basa en Excel 97 . Podría existir alguna diferencia en otras versiones.
Las tablas dinámicas son exceletes para análisis estadísticos o resúmenes. Podes jugar arrastrando campos de un lugar a otro en el "Paso 3 de 4" y viendo que resulta (al "Terminar"). Esto no afecta para nada los datos originales . Para eliminar la tabla dinámica simplemente eliminas la hoja en la que se encuentra. Podes hacer tantas tablas dinámicas como quieras.
El único cuidado que hay que tener es que haga referencia al rango con el que REALMENTE queremos trabajar. Por eso conviene trabajar con nombres de rangos en vez de referencias del tipo $b$15:$k$85. (Insertar / Nombre / Definir ).
Una vez generada una Tabla Dinámica, podes modificarla, poniendo el cursor en una celda cualquiera de ella y meiante botón derecho del Mouse, seleccionar "Asistente ..." . Va a aparecer en la famosa ventana "Paso 3 de 4", donde podes hacer cambios o ir para "Atras", a tu gusto.
Espero que llegues a buen puerto.
Si tenés algún problema no dudes en consultarme.
Suerte.
Si querés resolver el tema desde otro punto de vista, ej con programación VBA por favor decime, no hay problema.
FJ
Me parece que los más práctico es usar Tablas Dinámicas.
Supongo que la columna a analizar forma parte de un rango más amplio de datos.
Vamos a nombrar ese rango como RRR.
Ponemos el cursor en una celda cualquiera del rango y tecleamos CTRL+* (del teclado numérico de la derecha KeyPad) . Esto selecciona todo el rango .
Del menu seleccionamos INSERTAR / NOMBRE / DEFINIR RRR.
Ahora generamos la Tabla Dinámica mediante DATOS / Asistente para Tablas Dinámicas / Siguiente (Lista o BD de Micr. Excel) / RRR en Rango: / Siguiente .
Ahora estamos en el Paso 3 de 4 del Asistente para Tablas Dinámicas.
Y sobre la derecha vemos los nombres de los campos (encabezado de columnas) del rango de trabajo.
Supongo que la columna a analizar se llama PRODUCTO, y es una de los nombres que aparecen a la derecha.
Llevo el cursor a PRODUCTO y lo arrastro a la zona llamada FILA .
Vuelvo a llevar el cursor a PRODUCTO (en la derecha) y lo arrastro a la zona DATOS.
Allí se vera como SUMA DE PRODUCTO o CONTAR DE PRODUCTO.
Si es SUMA de PRODUCTO, hacer doble click sobre SUMA DE PRODUCTO. En "Resumir por:" clickear "Contar" en reemplazo de "Suma" . La leyenda cambia a CONTAR DE PRODUCTO . Y presionar el botón ACEPTAR.
Hacemos DOBLE CLICK en la leyenda PRODUCTO en zona FILA,
marcamos el Botón "Avanzado...",
En "Opciones de autoordenar" marcamos "Descendente",
Y en "Usar el campo", buscamos CONTAR DE PRODUCTO (o el nombre real del campo),
Botón "Aceptar" y nuevamente Botón "Aceptar"
Ahora volvimos al " el Paso 3 de 4 del Asistente para Tablas Dinámicas".
Presionamos el Botón "Siguiente" y luego el Botón Terminar .
En una hoja nueva vamos a ver la tabla con los elementos de la columna elegida y la cantidad de repeticiones de cada uno, ordenado en forma descendente. Solución del Problema.
Cuando agreguemos más filas al rango, debemos volver a dar el nombre mediante el mismo procedimiento expuesto arriba ( posicionar el cursor en una celda del rango, CTRL+*, INSERTAR / NOMBRE / DEFINIR RRR.).
En la hoja de la TD, poner el cursor en cualquier celda con datos de cantidad y del menu seleccionar DATOS / ACTUALIZAR DATOS.
La explicación se basa en Excel 97 . Podría existir alguna diferencia en otras versiones.
Las tablas dinámicas son exceletes para análisis estadísticos o resúmenes. Podes jugar arrastrando campos de un lugar a otro en el "Paso 3 de 4" y viendo que resulta (al "Terminar"). Esto no afecta para nada los datos originales . Para eliminar la tabla dinámica simplemente eliminas la hoja en la que se encuentra. Podes hacer tantas tablas dinámicas como quieras.
El único cuidado que hay que tener es que haga referencia al rango con el que REALMENTE queremos trabajar. Por eso conviene trabajar con nombres de rangos en vez de referencias del tipo $b$15:$k$85. (Insertar / Nombre / Definir ).
Una vez generada una Tabla Dinámica, podes modificarla, poniendo el cursor en una celda cualquiera de ella y meiante botón derecho del Mouse, seleccionar "Asistente ..." . Va a aparecer en la famosa ventana "Paso 3 de 4", donde podes hacer cambios o ir para "Atras", a tu gusto.
Espero que llegues a buen puerto.
Si tenés algún problema no dudes en consultarme.
Suerte.
Si querés resolver el tema desde otro punto de vista, ej con programación VBA por favor decime, no hay problema.
FJ
Vaya que te conoces excel al derecho y al revés!
Si, por supuesto que es más conveniente con Visual, por que esta rutina de encontrar este dato, puede variar entre 1 y 20 veces (lo que el usuario seleccione) y sería más factible tener la función que lo calcule y pasarle el parámetro para el número de veces.
Un abrazo.
NOTA: ¿Puedo saber como te llamas?
Mi nombre es Marleny Rubiano
Si, por supuesto que es más conveniente con Visual, por que esta rutina de encontrar este dato, puede variar entre 1 y 20 veces (lo que el usuario seleccione) y sería más factible tener la función que lo calcule y pasarle el parámetro para el número de veces.
Un abrazo.
NOTA: ¿Puedo saber como te llamas?
Mi nombre es Marleny Rubiano
Marleny :
Te paso una macro que realiza el calculo. Pero no dejes de probar (y de jugar con) las Tablas Dinámicas. Son (una vez acostumbrada a ellas) fáciles y excelentes. Es más sencillo usarlas que leer sobre ellas.
Para ingresar la rutina :
Desde excel (tu planilla), tipeá ALT+F11 para ingresar al Visual Basic.
Insertá un modulo (Insertar/Modulo) y allí copiá el siguiente procedimiento (subrutina MaximoenColumna).
'*************************
Sub MaximoenColumna()
Dim x As Long, y As Long
Dim txt As String, resp As String
Dim vector1(), vector2()
Dim TV As Long '** tamaño del vector
Dim MasElem As Long
Dim UEV As Long '** ultimo elemento del vector
Dim ValorCelda, cargado
'*** supongo 100 datos
TV = 5
MasElem = TV
ReDim vector1(1 To TV)
ReDim vector2(1 To TV)
UEV = 0
'*** supongo que la celda A1 pertenece al rango a analizar
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Name = "MiRango"
'*** cargo en TXT todas las opciones de columnas
txt = "Ingrese el Número correspondiente a la columna o 0" _
& Chr(10) & Chr(10) & "0 - salir"
For x = 1 To Range("MiRango").Columns.Count
txt = txt & Chr(10) & Format$(x, "#0") & " - " & Range("mirango").Cells(1, x).Value
Next
'*** pregunto a usuario la columna a abalizar
Do
resp = InputBox(txt, "Seleccion de Columna a abalizar ", "0")
If IsNumeric(resp) Then
x = Val(resp)
If x = 0 Then '**salir
End
End If
If x >= 1 And x <= Range("MiRango").Columns.Count Then
Exit Do
End If
End If
Loop
'*** x tiene el numero de columna a analizar
'*** del rango (Matriz MiRango) selecciono solo la columna elegida
Range("Mirango").Offset(1, x - 1).Resize(Range("MiRango").Rows.Count - 1, 1).Select
For x = 1 To Selection.Rows.Count
ValorCelda = Selection.Cells(x, 1).Value
If x = 1 Then
vector1(x) = ValorCelda
vector2(x) = 1
UEV = 1
Else
cargado = 0
For y = 1 To UEV '** veo si se repite el dato
If vector1(y) = ValorCelda Then
vector2(y) = vector2(y) + 1
cargado = 1
Exit For
End If
Next
'*** cargo nuevo valor
'*** si llegue al final del vector lo agrando
If cargado = 0 Then
If UEV = TV Then
TV = TV + MasElem '** amplio el tamaño del vector
ReDim Preserve vector1(1 To TV)
ReDim Preserve vector2(1 To TV)
End If
UEV = UEV + 1
vector1(UEV) = ValorCelda
vector2(UEV) = 1
End If
End If
Next
txt = "El/Los elemento(s) : " & Chr(10) & Chr(10) & "[ "
cargado = 0
For x = 1 To UEV
Range("a1").Cells(x, Range("MiRango").Columns.Count + 2) = vector1(x)
Range("a1").Cells(x, Range("MiRango").Columns.Count + 3) = vector2(x)
If vector2(x) >= cargado Then
txt = txt & vector1(x) & " "
cargado = vector2(x)
End If
Next
txt = txt & "]" & Chr(10)
txt = txt & Chr(10) & "tiene(n) : " & cargado & " repeticiones"
MsgBox txt
End Sub
'*************************
Como ves no es tan simple. Pero para explicarla vamos por partes.
Primero se necesita saber que columna querés analizar. Y se pregunta mediante InputBox, tomadose la primer columna del rango como títulos de estas.
Después se selecciona la columna elegida y se cargan los valores en un vector (vector1), y la cantidad de repeticiones en otro (vector2) .
Finalmente se buscan los elementos con la mayor cantidad de repeticiones, recorriendo los vectores (vector1 -de leyendas- y vector2 -de cantidades-).
Y se muestran mediante MSGBOX.
Los resultados resultaron coincidentes con los de las tablas dinámicas.
Para ejecutar la macro, volver a Excel.
Ir a la Hoja donde residen los datos.
ALT+F8 (Herramientas/Macro/Macros...), para seleccionar la macro (MaximoenColumna) y el botón "Ejecutar".
IMPORTANTE: Se supone que la celda A1 pertenece al rango donde se encuentra la columna a analizar, si así no fuera hay que cambiar en :
Range("A1").Select
A1 por una celda correcta.
Espero que te sirva.
Si tenés alguna duda o querés alguna ampliación o explicación, no hay ningún problema, es un placer.
Desde Buenos Aires, Argentina, un abrazo.
Suerte.
Mi nombre es Federico.
Te paso una macro que realiza el calculo. Pero no dejes de probar (y de jugar con) las Tablas Dinámicas. Son (una vez acostumbrada a ellas) fáciles y excelentes. Es más sencillo usarlas que leer sobre ellas.
Para ingresar la rutina :
Desde excel (tu planilla), tipeá ALT+F11 para ingresar al Visual Basic.
Insertá un modulo (Insertar/Modulo) y allí copiá el siguiente procedimiento (subrutina MaximoenColumna).
'*************************
Sub MaximoenColumna()
Dim x As Long, y As Long
Dim txt As String, resp As String
Dim vector1(), vector2()
Dim TV As Long '** tamaño del vector
Dim MasElem As Long
Dim UEV As Long '** ultimo elemento del vector
Dim ValorCelda, cargado
'*** supongo 100 datos
TV = 5
MasElem = TV
ReDim vector1(1 To TV)
ReDim vector2(1 To TV)
UEV = 0
'*** supongo que la celda A1 pertenece al rango a analizar
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Name = "MiRango"
'*** cargo en TXT todas las opciones de columnas
txt = "Ingrese el Número correspondiente a la columna o 0" _
& Chr(10) & Chr(10) & "0 - salir"
For x = 1 To Range("MiRango").Columns.Count
txt = txt & Chr(10) & Format$(x, "#0") & " - " & Range("mirango").Cells(1, x).Value
Next
'*** pregunto a usuario la columna a abalizar
Do
resp = InputBox(txt, "Seleccion de Columna a abalizar ", "0")
If IsNumeric(resp) Then
x = Val(resp)
If x = 0 Then '**salir
End
End If
If x >= 1 And x <= Range("MiRango").Columns.Count Then
Exit Do
End If
End If
Loop
'*** x tiene el numero de columna a analizar
'*** del rango (Matriz MiRango) selecciono solo la columna elegida
Range("Mirango").Offset(1, x - 1).Resize(Range("MiRango").Rows.Count - 1, 1).Select
For x = 1 To Selection.Rows.Count
ValorCelda = Selection.Cells(x, 1).Value
If x = 1 Then
vector1(x) = ValorCelda
vector2(x) = 1
UEV = 1
Else
cargado = 0
For y = 1 To UEV '** veo si se repite el dato
If vector1(y) = ValorCelda Then
vector2(y) = vector2(y) + 1
cargado = 1
Exit For
End If
Next
'*** cargo nuevo valor
'*** si llegue al final del vector lo agrando
If cargado = 0 Then
If UEV = TV Then
TV = TV + MasElem '** amplio el tamaño del vector
ReDim Preserve vector1(1 To TV)
ReDim Preserve vector2(1 To TV)
End If
UEV = UEV + 1
vector1(UEV) = ValorCelda
vector2(UEV) = 1
End If
End If
Next
txt = "El/Los elemento(s) : " & Chr(10) & Chr(10) & "[ "
cargado = 0
For x = 1 To UEV
Range("a1").Cells(x, Range("MiRango").Columns.Count + 2) = vector1(x)
Range("a1").Cells(x, Range("MiRango").Columns.Count + 3) = vector2(x)
If vector2(x) >= cargado Then
txt = txt & vector1(x) & " "
cargado = vector2(x)
End If
Next
txt = txt & "]" & Chr(10)
txt = txt & Chr(10) & "tiene(n) : " & cargado & " repeticiones"
MsgBox txt
End Sub
'*************************
Como ves no es tan simple. Pero para explicarla vamos por partes.
Primero se necesita saber que columna querés analizar. Y se pregunta mediante InputBox, tomadose la primer columna del rango como títulos de estas.
Después se selecciona la columna elegida y se cargan los valores en un vector (vector1), y la cantidad de repeticiones en otro (vector2) .
Finalmente se buscan los elementos con la mayor cantidad de repeticiones, recorriendo los vectores (vector1 -de leyendas- y vector2 -de cantidades-).
Y se muestran mediante MSGBOX.
Los resultados resultaron coincidentes con los de las tablas dinámicas.
Para ejecutar la macro, volver a Excel.
Ir a la Hoja donde residen los datos.
ALT+F8 (Herramientas/Macro/Macros...), para seleccionar la macro (MaximoenColumna) y el botón "Ejecutar".
IMPORTANTE: Se supone que la celda A1 pertenece al rango donde se encuentra la columna a analizar, si así no fuera hay que cambiar en :
Range("A1").Select
A1 por una celda correcta.
Espero que te sirva.
Si tenés alguna duda o querés alguna ampliación o explicación, no hay ningún problema, es un placer.
Desde Buenos Aires, Argentina, un abrazo.
Suerte.
Mi nombre es Federico.
- Compartir respuesta
- Anónimo
ahora mismo