Ayuda con Macro

08/03/2005 - 23:37 por Andres Ovalle | Informe spam
Buenos dias,

Necesito de su colaboración para arreglar un Excel que tiene unos pequeños
problemas.

Resulta que el Excel tiene muchos registros que fueron creados de la
siguiente forma:

Columna A |Columna B |Columna C |Columna D |
1| Estudio1 | Valor 1 | Estudio 2| Valor 2 |
2| 1 | 1.000 | 60 | 10.000 |
3| 33 | 60.000 | 99 | 15.000 |

Los datos de la Columna A y la Columna B forman registros, al igual la
coumna C y la D, y asi hasta la ultima columna permitida por el Excel.

Lo que quiero hacer es meter los registros de C y D debajo de A y B
respectivamente, y asi con todas las columnas.

He creado una pequeña macro, pero resulta que siempre esta posicionandose en
celdas especificas, por ejemplo:

Yo quiero posicionarme inmediatamente despues de la ultima fila escrita en
la columna A y B, para pegar los datos que he traido de C y D, pero cuando
ejecuto la macro esta se va directamente a la celda A20 (o Cualquier otra con
una dirección en particular), pero deseo que la macro se posicione
exactamente en la ultima y no en una en especial...

En el ejercicio que hice, el siguiente es el codigo de la macro... la cual
funciona casi de maravilla, de no ser por que siempre se posiciona en la una
celda es particular...

Sub Macro4()
'
' Macro4 Macro
' Macro grabada el 08/03/2005 por andlop
'
' Acceso directo: CTRL+w
'
Range(Selection, Selection.End(xlDown)).Select
Range("C1:D25").Select
Selection.Cut
Selection.End(xlToLeft).Select
Selection.End(xlDown).Select
Range("A14").Select
ActiveSheet.Paste
Range("C14").Select
Selection.End(xlUp).Select
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
Selection.Delete Shift:=xlToLeft
Range("C1").Select
End Sub

Alguna ayudita???
 

Leer las respuestas

#1 Héctor Miguel
09/03/2005 - 05:26 | Informe spam
hola, Andres !

... muchos registros que fueron creados de la siguiente forma:
... A y... B forman registros, al igual... C y D, y asi hasta la ultima columna
... meter los registros de C y D debajo de A y B... y asi con todas las columnas
... una pequeña macro, pero... siempre esta posicionandose en celdas especificas [...]



[me parece que] ha sido una buena idea 'iniciar' con la grabadora de macros ;)
[ahora es necesario] 'tienes que' aprender a 'depurar' el codigo que genera la grabadora [p.e.]
-> las referencias a rangos en la notacion 'A1' [como Range("C1:D25")] 'quedan fijas'
[la macro hara SIEMPRE una referencia a dichas celdas]
-> para hacer 'flexibles' las referencias a rangos en macros, es preferible usar 'variables'
o puedes 'pedir' a la grabadora que utilice referencias 'relativas'
[aunque tampoco son muy 'claras', al menos, en un principio]

te paso una macro [y al final 'tratare' de explicartela, asi como 'comentar' el codigo de 'tu grabadora']
si cualquier duda... ¿comentas?
saludos,
hector.
en un modulo de codigo 'normal' ==Sub JuntarCadaDos()
Application.ScreenUpdating = False
Dim Col As Byte, Fila As Long
Fila = 2
For Col = 3 To 255 Step 2
If IsEmpty(Cells(Fila, Col)) Then Exit For
Range(Cells(Fila, Col), Cells(Fila, Col).End(xlDown).Resize(, 2)).Cut _
[a65536].End(xlUp).Offset(1)
Next
Range([c1], [iv1].End(xlToLeft)).Clear
End Sub

'intento' de explicacion :))
1.- las variables declaradas al inicio [Col y Fila] son para 'avanzar' por rangos de celdas 'construidos al vuelo'
2.- establecer como la fila 'inicial' la fila ->2<- es para el caso [supongo] que la fila uno tenga 'titulos' -?-
3.- el bucle For Col = 3 to 255 Setp 2
es para avanzar por columnas [de 2 en 2] iniciando en la columna 3 ['C'] y hasta la 255 ['IU']
4.- si dicha [nueva] celda inicial [C2, E2, G2, I2, etc.] NO esta 'vacia'...
el codigo 'extiende' el rango [como si lo seleccionara] a dos columnas y hasta la ultima fila con datos
5.- acto seguido... hace un 'cut' [edicion/cortar o ctrl+x] ->para pegarlo directamente<-...
en la siguiente 'fila libre' [al final de la columna 'A'], simulando que hicieras 'por teclado/raton' lo siguiente:
ir a la celda 'A65536'... pulsar ctrl+flecha_arriba... y finalmente, 'bajar' una celda [a la siguiente 'fila libre']
6.- utilizo otras formas de notacion para referencias a rangos [p.e.]
a) Cells(Fila_n, Columna_n)
b) [a65536] <= esta ultima 'equivale' a Range("A65536") => SIN el 'Range' y SIN las comillas dobles

los pasos que seguiste al grabar la macro...
Sub Macro4()
Range(Selection, Selection.End(xlDown)).Select


-> aqui tenias una seleccion y la extendiste hacia abajo con ctrl+flecha_abajo

Range("C1:D25").Select


-> despues [como que] 'te arrepentiste' y seleccionases con el raton el rango 'C1:D25'

Selection.Cut <= hiciste un 'cut' [edicion/cortar o... ctrl+x]
Selection.End(xlToLeft).Select <= pulsaste ctrl+flecha_izquierda
Selection.End(xlDown).Select <= pulsaste ctrl+flecha_abajo


-> las acciones anteriores 'te dejaron' en 'A13' [que en ese momento era 'la ultima celda ocupada']

Range("A14").Select <= 'bajaste' a la siguiente 'fila libre' [raton/teclado]
ActiveSheet.Paste <= hiciste 'el pegado' [edicion/pegar o... ctrl+v]
Range("C14").Select <= seleccionaste 'C14'
Selection.End(xlUp).Select <= pulsaste ctrl+flecha_arriba
Columns("C:C").Select <= seleccionaste toda la columna 'C'
Selection.Delete Shift:=xlToLeft <= eliminas toda la columna [la que 'era' 'D'... 'paso' a ser 'C']
Selection.Delete Shift:=xlToLeft <= eliminas [nuevamente] toda la columna ['antes D']
Range("C1").Select <= seleccionas 'C1' [probablemente pulsaste flecha_arriba] y...
End Sub <= ¡ fin !!! :))

Preguntas similares