Recorrer tabla Excel e ir ordenando los datos!

Tengo una base de datos en una tabla y los datos están desordenados. La tabla es bastante grande, tiene 9 columnas y muchísimas filas. Debo recorrer toda la tabla y cambiar donde ponga "verdadero" o "falso" por "si" o "no", cambiar las celdas que estén todas en mayúsculas o todas en minúsculas por la capitalización normal(primera letra mayúscula y el resto minúscula) y lo que veo imposible:

- La 4ª y 5ª columna son para pueblo y ciudad respectivamente, pero en algunas filas los valores están cambiados y donde debería ir el pueblo está la ciudad y viceversa. Debo corregirlo

- En algunas filas, el valor de la segunda celda está en la primera celda junto con el valor que ya había en esa primera celda, lo que además hace que todos los datos de las siguientes celdas estén en la columna equivocada. Debo coger ese segundo valor (es un apellido y está separado del nombre por un espacio), llevarlo a la segunda celda y mover todos los demás datos de esa fila una celda a la derecha.

He podido cambiar las mayúsculas y minúsculas y los verdaderos y falsos, pero de la forma que lo he hecho no tengo manera de saber donde estoy para saber qué dato estoy manejando en cada momento y así poder intercambiar pueblo por ciudad por ejemplo.

Se que es muy largo, ojalá puedas echarme una mano. Estoy en apuros!

1 Respuesta

Respuesta
1

En cuanto a:

- La 4ª y 5ª columna son para pueblo y ciudad respectivamente, pero en algunas filas los valores están cambiados y donde debería ir el pueblo está la ciudad y viceversa. Debo corregirlo

¿Caul seria el criterio que ejecutaria el proceso de cambio?. Es decir, en palabras simples, ¿cómo le dices a excel que es una ciudad o un pueblo?. Sin definir esto es imposible llevar alenguaje programable lo que deseas

Cierto! El caso es que las ciudades solo pueden ser una entre 11, por lo que había pensado en comprobar si el valor de la 4ª celda es igual a algunas de esas ciudades, y si no lo es, entonces hacer el cambio porque quiere decir que hay otra cosa ahí, que es el pueblo. Pero claro, no se como llevarlo a la practica.

Gracias por tu pronta respuesta!

Ok, entonces el algoritmo seria:

Si 4 celda <> lista entonces pasar contenido de 4 columna a 5 columna y 5 columna a 4 columna

Pregunta, en donde esta la lista para realizar la comparacion, indicame el rango (desde que celda a que celda de que columna, supongo que estar fuera de la tabla, tal ves en otra hoja

La verdad es que no están en ninguna parte Luis! Son los 11 estados de EEUU que componen el "deep south" (te había escrito pueblo y ciudad para simplificar) con ciudades de esos estados. No nos los dan en ningún sitio, por eso yo había pensado en la comparación uno a uno manual, osea "si 4ª celda <> 'Tennessee' o 4ª celda <> 'Texas' o...etc" , ni siquiera se si se puede hacer eso!!

De verdad que muchas gracias por tu interés, espero que puedas ayudarme!

No hay problema, si no te los dan... los vas a tener que conseguir y ponerlos en el libro en la hoja sgte en la que esta la tabla, es decir si en la hoja1 esta la data a ordenar es preferible que el la hoja2 este la lista de estados ( de preferencia colocarlos en la columna A desde la fila 1 sin rotulos)

Asi, luego recorrer la tabla y comparar los datos no es ningun problema, pero primero lo primero:

Asi qeu si estas en posicion de realizar lo que te indico, me avisas una vez que este con los datos ok y te escribo el macro.

Ok Luis ya los tengo localizados y puestos en la hoja2 como me has dicho!

Ok, entonces primero algunas consideracines:

1. La lista de estados estara en la hoja2 en columna A sin rotulos ni filas vacias entre datos desde a1 hacia abajo,

2. La tabla de datos a recorrer esta en la hoja1 desde fila 2 hacia abajo ( la 1 tiene rotulos)

El estado esta en la cuarta columna y la ciudad en la quinta.

3 no hay fllas vacias entre los datos de la hoja1

4 la columna A de la hoja1 no tiene celdas vacias entre datos ( se desprende de lo anterior pero vale la pena aclararlo)

5 la columna estados esta bien escrita( es decir si en ves de decir 'Texas' dice 'Tezas', el macro no lo advertira).

Bien aca el macro:

Sub comprueba_estado()
Dim i As Long
i = Application.WorksheetFunction.CountA(Sheets(1).Range("A:A"))
If i = 0 Then Exit Sub
If Application.WorksheetFunction.CountA(Sheets(2).Range("A:A")) = 0 Then MsgBox "Falta la lista de estados en la hoja2", vbCritical: Exit Sub
'4c7569735f50
Dim r As Range
Dim estado As String
Dim ciudad As String
Application.ScreenUpdating = False
For Each r In Sheets(1).Range("A2:" & "A" & i)
estado = r.Offset(0, 3)
ciudad = r.Offset(0, 4)
If Application.WorksheetFunction.CountIf(Sheets(2).Range("A:A"), r.Offset(0, 3)) = 0 Then
r.Offset(0, 3) = ciudad: r.Offset(0, 4) = estado
End If
DoEvents
Next
Set r = Nothing
Application.ScreenUpdating = True
MsgBox "terminada la correccion de estados", vbInformation
End Sub

Una vez lo corras debes esperar que aparezca el mensaje de finalizacion de

Luis....me acabas de dejar con la boca abierta!!

La otra parte que te he consultado, la de separar de las primeras celdas las que tengan también el apellido y luego mover todos los datos una intentar a la derecha sabrías como puedo hacerlo?

Te explico otra vez:

La primera columna tiene el nombre y la segunda el apellido, pero en algunas filas el nombre y apellido están juntos en la primera celda, y por tanto todos los demás datos están movidos un sitio a la izquierda. Se trata de coger el apellido, ponerlo en la segunda columna, y por consiguiente mover el resto de datos una intentar a la derecha para que coincidan con sus respectivas columnas.

Muchísimas gracias por tu ayuda Luis!! !

Bueno si tienes por ejemplo en una misma celda

"LUIS PEREZ" y deseas separar esot sdatos, en la pestaña datos existe la opcion ( boton), Texto en columnas, alli puedes determinar que caracter es el que separa los datos en este caso seria un espacio, asi los separas automaticamente

Si vas a separar la columna A entonces primero inserta una columna entre A y B, luego seleccionas la columan A vas a la opcion que te indico y separas indicando como sepradorseparador, tabulador y luego espacio si corresponde

Entiendo...

Siento por ser tan insistente Luis! El problema es que eso debería hacerse también por Macro y lo veo imposible!

Tu sabrías como podría hacerse eso?

De verdad que te estoy eternamente agradecido!!

Acabo de probar lo que me has dicho y si, efectivamente separa el nombre y apellido y manda el apellido a la segunda columna, pero sobreescribe el valor que hay allí, cuando lo que debería hacer es desplazar lo que había en la segunda columna a la tercera, y lo que había en la tercera a la cuarta, y así sucesivamente...

Antes del macro, ¿en columna A "solo" tienes nombre y apellido separado por un espacio?

No! Ese es el problema...que columna A es para nombre y B para apellido pero sólo en algunas filas, el valor de la columna B (apellido) está también junto con el valor de A (nombre) en la columna A.

Por lo tanto hay filas que pone :

Pepe | Perez | 26

Y hay otras que pone:

Pepe Perez | 26 |

Donde 26 es la edad, que debería ir en la tercera columna.

No se como agradecerte tu inestimable ayuda Luis!!

Según modelo de datos, entiendo que

Pepe Perez | 26 |

Esta posicionado asi: pepe perez en columna A 26 en columna B

Deberia ser :

Pepe columna A perez columna B 26 columna C

Si asi es el caso este es el macro:

Antes de correrlo por seguridad te sugiero realizes una copia de tu libro

Sub separar_nombre()
Dim r As Range
Dim i As Long
'4c7569735f50
i = Application.WorksheetFunction.CountA(Sheets(1).Range("A:A"))
If i = 1 Then Exit Sub
Application.ScreenUpdating = False
For Each r In Sheets(1).Range("A2:" & "A" & i)
If InStr(1, Trim(r), Chr(32), vbTextCompare) > 0 Then
r.Select
Range(r.Offset(0, 1).Address, Selection.End(xlToRight)).Select
Selection.Cut
r.Offset(0, 2).Select
ActiveSheet.Paste
r.Select
Selection.TextToColumns Destination:=Range(r.Address), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
End If
DoEvents
MsgBox "Terminada separacion de nombres", vbInformation
End Sub

Simplemente espectacular Luis!

Te estoy agradecido hasta el infinito, alabo a la gente que como tu y de manera altruista se presta a compartir sus avanzadisimos conocimientos.

Sin animo de abusar, una ultima cuestión y te dejo en paz! Tengo que generar unas pivot charts o gráficos dinámicos en función de algunas cuestiones. Sabría hacerlo manualmente, pero creo que debo generarlas por macro. Tu sabes si eso se puede hacer?

Por ejemplo, uno de los gráficos debería mostrar el numero medio de pescado comido por persona y por estado. Tu sabes si eso puede consultarse a través de una macro y generar el gráfico directamente?

Un gran abrazo y eternas gracias Luis!

Sorry en esa parte no te puedo ayudar, ( nunca lo he realizado)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas