Pasar de 1 fila con 3 celdas a 3 filas con 3 celda
Hola mi consulta es la siguiente, como hacer para que tres celdas consecutivas con este formato A B C;D;E pasen a
A B C
A B D
A B E
Es decir de una fila con tres celdas pasar a tres filas con tres celdas.
Muchas gracias de antemano
A B C
A B D
A B E
Es decir de una fila con tres celdas pasar a tres filas con tres celdas.
Muchas gracias de antemano
Respuesta de valedor
1
1
Ya nos vamos entendiendo, estoy suponiendo que lo que quieres mover, es el VALOR de la celda, solo confírmame y te paso la macro...
Aquí esta la macro para mover tus datos, estoy considerando que NO tienes más datos ALREDEDOR de estos, la celda activa DEBE de estar en cualquier celda DENTRO del área de tus datos, la macro se detendera HASTA que haya una celda en blanco abajo y dos celdas a la derecha, pruébalas, yo moví mil filas para tener tres mil al final y se tardo 19 segundos en un K6-2 a 350, creo que esta bien...
Option Explicit
Public Sub MoverDatos()
'Seleccionamos la primer celda de mis datos
ActiveCell.CurrentRegion.Cells(1, 1).Select
Application.ScreenUpdating = False
'Nos detendremos cuando ya no haya datos a mover
Do Until Trim(ActiveCell.Offset(1, 0).Value) = "" And _
Trim(ActiveCell.Offset(0, 3).Value) = ""
'Insertamos dos fila
ActiveCell.Offset(1, 0).EntireRow.Insert
ActiveCell.Offset(1, 0).EntireRow.Insert
'Copiamos los valores de A y B
Range(ActiveCell, ActiveCell.Offset(0, 1)).Copy _
Range(ActiveCell. Offset(1, 0), ActiveCell.Offset(2, 1))
'Cortamos el valor de D
ActiveCell.Offset(0, 3). Cut ActiveCell.Offset(1, 2)
'Cortamos el valor de E
ActiveCell.Offset(0, 4). Cut ActiveCell.Offset(2, 2)
'Activamos la siguiente fila
ActiveCell.Offset(3, 0). Activate
Loop
Application.ScreenUpdating = True
End Sub
Option Explicit
Public Sub MoverDatos()
'Seleccionamos la primer celda de mis datos
ActiveCell.CurrentRegion.Cells(1, 1).Select
Application.ScreenUpdating = False
'Nos detendremos cuando ya no haya datos a mover
Do Until Trim(ActiveCell.Offset(1, 0).Value) = "" And _
Trim(ActiveCell.Offset(0, 3).Value) = ""
'Insertamos dos fila
ActiveCell.Offset(1, 0).EntireRow.Insert
ActiveCell.Offset(1, 0).EntireRow.Insert
'Copiamos los valores de A y B
Range(ActiveCell, ActiveCell.Offset(0, 1)).Copy _
Range(ActiveCell. Offset(1, 0), ActiveCell.Offset(2, 1))
'Cortamos el valor de D
ActiveCell.Offset(0, 3). Cut ActiveCell.Offset(1, 2)
'Cortamos el valor de E
ActiveCell.Offset(0, 4). Cut ActiveCell.Offset(2, 2)
'Activamos la siguiente fila
ActiveCell.Offset(3, 0). Activate
Loop
Application.ScreenUpdating = True
End Sub
Bueno primero gracias, y segundo perdón por seguir molestando, pero no sale, consigo separar A Y B pero nada más, voi a intentar ser más explicito. celda1 A, celda2 B, celda3 C;D;E
lo que trato de hacer es que de esa fila con esas celdas queden 3 filas
Celda1 A, celda2 B, celda3 C
Celda1 A, celda2 B, celda3 D
Celda1 A, celda2 B, celda3 E
Con la macro que tu propones (que por cierto me has dejado impresionado por lo complicado que parece todo esto) lo que consigo es tener
celda1 A, celda2 B, celda3 C;D;E
Celda1 A, celda2 B, celda3 vacia
Celda1 A, celda2 B, celda3 vacia
Espero que ahora este todo más claro y también espero que no sea algo muy complicado de hacer. Gracias
lo que trato de hacer es que de esa fila con esas celdas queden 3 filas
Celda1 A, celda2 B, celda3 C
Celda1 A, celda2 B, celda3 D
Celda1 A, celda2 B, celda3 E
Con la macro que tu propones (que por cierto me has dejado impresionado por lo complicado que parece todo esto) lo que consigo es tener
celda1 A, celda2 B, celda3 C;D;E
Celda1 A, celda2 B, celda3 vacia
Celda1 A, celda2 B, celda3 vacia
Espero que ahora este todo más claro y también espero que no sea algo muy complicado de hacer. Gracias
Propongo ser más claros en lo que quiere uno, yo supuse esto
A1 = A
B1 = B
C1 = C
D1 = D
E1 = E
A2 = A
B2 = B
C2 = C
D2 = D
E2 = E
Para obtener esto
A1 = A | B1 = B | C1 = C
A2 = A | B2 = B | C2 = D
A3 = A | B3 = B | C3 = E
A4 = A | B4 = B | C4 = C
A5 = A | B5 = B | C5 = D
A6 = A | B6 = B | C6 = E
Pero me dices que tienes
A1 = A | B1 = B | C1 = C;D;E
A2 = A | B2 = B | C2 = C;D;E
O sea, en al columna C esta los tres valores que quieres separar, ahora, con las celda de las columnas A y B no hay problema por que tienen un solo valor, pero en la columna C, mi pregunta es si estos valores son C;D;E así, las letras C, DE y E separadas por ;(punto y coma) o solo es la forma de decirme que hay tres valores, si es otro el contenido de esta columna C, necesito que me digas explícitamente cual es, y que criterio sigues para diferenciar uno de otro, el punto y coma esta bien, aunque podría ser cualquier otro carácter.
A1 = A
B1 = B
C1 = C
D1 = D
E1 = E
A2 = A
B2 = B
C2 = C
D2 = D
E2 = E
Para obtener esto
A1 = A | B1 = B | C1 = C
A2 = A | B2 = B | C2 = D
A3 = A | B3 = B | C3 = E
A4 = A | B4 = B | C4 = C
A5 = A | B5 = B | C5 = D
A6 = A | B6 = B | C6 = E
Pero me dices que tienes
A1 = A | B1 = B | C1 = C;D;E
A2 = A | B2 = B | C2 = C;D;E
O sea, en al columna C esta los tres valores que quieres separar, ahora, con las celda de las columnas A y B no hay problema por que tienen un solo valor, pero en la columna C, mi pregunta es si estos valores son C;D;E así, las letras C, DE y E separadas por ;(punto y coma) o solo es la forma de decirme que hay tres valores, si es otro el contenido de esta columna C, necesito que me digas explícitamente cual es, y que criterio sigues para diferenciar uno de otro, el punto y coma esta bien, aunque podría ser cualquier otro carácter.
Los valores de la columna C van separados por punto y coma, menos mal que solo te he propuesto parte del problema por que si tengo que explicarlo todo (con lo bien que me explico) tardaríamos siglos. Con que me soluciones esto me conformo, el resto me peleare yo con ello. Gracias
La siguiente macro debe de funcionar y no te preocupes con el tiempo uno aprende a darse a entender, puedes preguntar cuanto gustes...
Le agregue un adornito para que te vaya mostrando en la barra de estado la linea que esta procesando, para que el usuario vea que esta trabajando, saludos...
Option Explicit
Public Sub MoverDatos()
Dim co1 As Long
Dim co2 As Integer
Dim Filas As Long
Dim strDatos() As String
On Error Resume Next
'Seleccionamos la primer celda de mis datos
ActiveCell.CurrentRegion.Cells(1, 1).Select
'Obtenemos el numero de filas a manipular
Filas = ActiveCell.End(xlDown).Row
'Desactivamos la actualizacion en pantalla
Application.ScreenUpdating = False
'Recorremos las filas
For co1 = 1 To Filas
Application.StatusBar = "Procesando la fila: " & Format(co1)
'Insertamos dos fila
ActiveCell.Offset(1, 0).EntireRow.Insert
ActiveCell.Offset(1, 0).EntireRow.Insert
'Copiamos los valores de A y B
Range(ActiveCell, ActiveCell.Offset(0, 1)).Copy _
Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(2, 1))
strDatos = Split(ActiveCell.Offset(0, 2).Value, ";")
For co2 = LBound(strDatos) To UBound(strDatos)
ActiveCell.Offset(co2, 2).Value = strDatos(co2)
Next co2
'Activamos la siguiente fila
ActiveCell.Offset(3, 0).Activate
Next co1
'Liberamos la barra de estado
Application.StatusBar = False
'Activamos la actualizacion de la pantalla
Application.ScreenUpdating = True
End Sub
Le agregue un adornito para que te vaya mostrando en la barra de estado la linea que esta procesando, para que el usuario vea que esta trabajando, saludos...
Option Explicit
Public Sub MoverDatos()
Dim co1 As Long
Dim co2 As Integer
Dim Filas As Long
Dim strDatos() As String
On Error Resume Next
'Seleccionamos la primer celda de mis datos
ActiveCell.CurrentRegion.Cells(1, 1).Select
'Obtenemos el numero de filas a manipular
Filas = ActiveCell.End(xlDown).Row
'Desactivamos la actualizacion en pantalla
Application.ScreenUpdating = False
'Recorremos las filas
For co1 = 1 To Filas
Application.StatusBar = "Procesando la fila: " & Format(co1)
'Insertamos dos fila
ActiveCell.Offset(1, 0).EntireRow.Insert
ActiveCell.Offset(1, 0).EntireRow.Insert
'Copiamos los valores de A y B
Range(ActiveCell, ActiveCell.Offset(0, 1)).Copy _
Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(2, 1))
strDatos = Split(ActiveCell.Offset(0, 2).Value, ";")
For co2 = LBound(strDatos) To UBound(strDatos)
ActiveCell.Offset(co2, 2).Value = strDatos(co2)
Next co2
'Activamos la siguiente fila
ActiveCell.Offset(3, 0).Activate
Next co1
'Liberamos la barra de estado
Application.StatusBar = False
'Activamos la actualizacion de la pantalla
Application.ScreenUpdating = True
End Sub
- Compartir respuesta
- Anónimo
ahora mismo