Macros de excel

Hola fejoal,
Tengo una sola columna de datos, en que cada celda tiene 4 columnas que quiero separar.
Para trabajar más rapido con esto intenté usar una macro que corta y pega hacia el lado los datos en columnas diferentes, simplemente con el botón que graba macros.
El problema es que cuando la aplico a la celda siguiente, se equivoca en que sigue trabajando con la celda anterior, y pega en las celdas especificas que usé para grabar la macro.
¿Cómo lo puedo hacer para que las celdas de trabajo queden relativas a la celda de origen?
O quizás me puedes enseñar un algoritmo que transforme toda la columna de una vez... No sé...
Espero puedas ayudarme
Gracias
Emilio

2 Respuestas

Respuesta
1
La mejor manera de separar datos ubicados en una columna hacia varias columnas es utilizando la opción "Texto en Columnas" del menú "Datos", claro que los datos en la columna tienen que tener un patrón de separación a lo largo de todas las celdas, como por ejemplo un símbolo separador, o un anchos fijos
- Primero se selecciona la columna con los datos a separar
- Luego se elige "Texto en Columnas" del menú "Datos"
- Aparece un asistente donde primero se elige el modo de separación, tal vez tu caso sea "Delimitados"
- En el paso dos se indica el símbolo separador si se eligió "Delimitados" antes; o se hace clic sobre la regla para marcar las separaciones si se eligió "De ancho fijo"
- El paso tres no es muy importante, puedes finalizar
Si optas por usar la macro que creaste (o grabaste), hay que cambiar todas las direcciones absolutas por relativas a la celda activa.
- Desde el menú "Herramientas" luego "Macro" y "Macros" seleccionas tu macro y tocas "Modificar"
- Aparece la macro en código Visual basic
- Hay que reemplazar todas las apariciones de direcciones fijas, como "Range("A1").Select" por direcciones relativas.
Se puede usar la propiedad OFFSET de esta forma:
"ActiveCell.Offset(1, 3).Select"
La anterior significaba "seleccionar A1", pero esta última significa "seleccionar la celda ubicada 1 hacia abajo y 3 a la derecha de la celda activa"
Con esto la macro funciona desde cualquier celda
Hay que experimentar con esto!
Suerte epellegr
Respuesta
1
En general trato de usar las herramientas que proporciona naturalmente MS Excel. Recién entonces aplico alguna macro si no logro mi objetivo.
En tu caso particular, Excel tiene una opción de separar en columnas (hacia la derecha) el contenido de una celda o un rango (columna)
Busca en "Datos", la opción "texto en columnas". Si el contenido de tus celdas estuviera delimitado por espacios, comas, guiones o tuvieran un ancho fijo, podrás usarlos para separarlo a voluntad.
Sin embargo, si necesitas usar una macro, edita la que grabaste y reemplaza la referencia a la celda con una instrucción de este tipo:
ActiveCell.Offset(0, 1).Select
Esta instrucción hace que seleccione la primer celda a la derecha de la actual. Una vez seleccionada, si la usas nuevamente, ésta será la actual y pasará a la siguiente y así sucesivamente. El cero indica que es la misma fila (RowOffset) y el 1 indica que es una columna a la derecha (ColumnOffset)
Espero haber sido claro y que esto te ayude.
Un abrazo!
Fernando
Gracias por lo anterior... avancé un poco más, y lo que hice fue que directamente grabé con celdas relativas...
Usé la instrucción "texto a columnas" en la siguiente rutina:
Selection.Copy
ActiveCell.Offset(0, 6).range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
ActiveCell.Select
Application.CutCopyMode = False
Selection.TextToColumns Destination:=ActiveCell, DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 4), Array(10, 9), Array(16, 1), Array(30, 1), Array(42, 1))
Esta tiene un problema, y otra cosa que quiero agregarle:
1) Me entrega la respuesta 5 columnas más a la derecha de lo que se lo indico cuando grabo la macro.
2) Quiero que lo haga en toda la columna... es decir, que siga hasta abajo,
gracias
Respecto a la primera:
Es lógico porque lo está pegando 5 columnas a la derecha de la actual, cuando usas:
ActiveCell.Offset(0, 6).range("A1").Select
Deberías usar
ActiveCell.Offset(0, 1).Select
En cuanto a la segunda, sólo tienes que seleccionar todo el rango que deseas separar. (No entiendo para qué es el procedimiento de copiar y pegar a la derecha)
En realidad tu instrucción sería, después de seleccionar el rango:
Selection.TextToColumns Destination:=ActiveCell.Offset(0, 1), DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 4), Array(10, 9), Array(16, 1), Array(30, 1), Array(42, 1))
Espero que te haya ayudado.
Un abrazo!
Fernando
Y para hacer que haga lo mismo con toda la columna... ¿cómo lo hago?
Este debería ser el código supuesto que tus datos estuvieran e la columna C:
Sub SplitColC()
Range("C:C").Select
Selection.TextToColumns Destination:=ActiveCell.Offset(0, 1), DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 4), Array(10, 9), Array(16, 1), Array(30, 1), Array(42, 1))
End Sub
Prueba y dime.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas