Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

copiar a otra hoja y ordenar la lista con la misma macro

32 views
Skip to first unread message

Sergio

unread,
Jan 13, 2007, 9:16:02 AM1/13/07
to
Hola un saludo a todos!
a continuacion expongo mi consulta, por si alguien se anima a hecharme
una mano:

Para los entendidos en esto de las macros (yo no), se podran dar cuenta
que el siguiente codigo copia el contenido de las celdas "B15", "B16",
"B17", "B18" de la hoja "REGISTRO" (que son datos de nombre, domicilio
r.f.c. y curp de proveedores) y los pega en la hoja "LISTA" en la
ultima fila, a manera de base de datos (el código lo copie de otra
consulta de algun foro, el único merito mió es adaptarlo a mis
necesidades, lo
del MsgBox no venia en el código original)

Sub COPIAR_PROVEEDOR()
' COPIAR_PROVEEDOR Macro
' Macro grabada el 28/12/2006 por oem
Dim rng As Range, i As Long, Rangos
Rangos = Array("B15", "B16", "B17", "B18")
With Sheets("LISTA")
Set rng = .Cells(.Rows.Count, "A").End(xlUp)
For i = LBound(Rangos) To UBound(Rangos)
rng.Offset(1, i).Value _
= Sheets("REGISTRO").Range(Rangos(i)).Value
Next i
End With
MsgBox Prompt:="O.K., oprime Aceptar para continuar"
End Sub

Ahora, lo que yo quisiera es que después de haber ingresado al
proveedor, la lista de proveedores (en la hoja "LISTA", por
supuesto) se ordenara por orden alfabético por la columna A (la lista
tiene encabezado en la primera fila), si no fuera mucho pedir, me
podrian indicar que codigo agregarle para realizar esa acción?

De antemano se los agradezco

Sergio Dávalos.

Vinchenzo vinç

unread,
Jan 14, 2007, 1:17:29 PM1/14/07
to

Hola Sergio,
si te parece bien, además de darte el pez, te enseñaré a pescarlo:

Estando en la hoja "LISTA", inicias la grabación de una macro, menú:
> Herramientas
> Macro
> Grabar nueva macro

Selecciona toda la columna A. Ahora dirígete al menú:
> Datos
> Ordenar

Indicas si deberá ser 'Ascendente' o 'Descendente', y seleccionas 'Sí' en "La lista tiene fila de encabezamiento.

Finalizas la grabación:
> Herramientas
> Macro
> Detener grabación

Abre el módulo en el que se ha grabado la macro, y verás código similar a:

'****************
Columns("A:D").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, etc...
'****************

Para que cada vez que se ejecute la macro no se muestre en pantalla cómo se selecciona la columna, sino que sea ordenada directamente, y para que siempre se realice sobre el rango de tu hoja "LISTA" sin importar cuál es la activa, dejas el código similar al siguiente:

'=======================
Sheets("LISTA").Columns("A:D").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, etc...
'=======================


--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.excel
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Vinchenzo vinç

unread,
Jan 14, 2007, 1:23:04 PM1/14/07
to
"Vinchenzo vinç" <vbvin...@BORRARhotmail.com> escribió en el mensaje news:%232biFhA...@TK2MSFTNGP03.phx.gbl...

> ...
> Selecciona toda la columna A...

Quería decir: el rango "A:D".

Sergio

unread,
Jan 15, 2007, 9:48:57 PM1/15/07
to

Vinchenzo vinç ha escrito:

Que tal Vin!
Gracias por responder a mi solicitud de ayuda, realice el procedimiento
tal y como lo describes y si, funciona por si solo, pero serias tan
amable de decirme donde lo coloco en el codigo que mencione, lo intente
colocandolo despues de End With, pero me sale "se ha producido el error
´1004´ en tiempo de ejecucion, la referencia d eordenacion no es
valida, etc.", y es que eso de pescar nunca se me ha dado.
de antemano gracias
te saluda
Sergio Davalos

Vinchenzo vinç

unread,
Jan 16, 2007, 9:23:03 AM1/16/07
to
"Sergio" <@.com.mx> escribió en el mensaje news:1168915736.9...@l53g2000cwa.googlegroups.com...

> ...donde lo coloco en el codigo que mencione, lo intente


> colocandolo despues de End With, pero me sale "se ha producido el error
> ´1004´ en tiempo de ejecucion, la referencia d eordenacion no es

> valida, etc."...

Hola Sergio,
en principio el código puede ir perfectamente después de 'End With', pero ya que el 'With' se establece para la hoja de destino, estaría más indicado ponerlo dentro.

Digamos que el código que nos mostraste al inicio del hilo, podría quedarte de la siguiente forma (te destaco el emplazamiento)

'*****************


Sub COPIAR_PROVEEDOR()
' COPIAR_PROVEEDOR Macro
' Macro grabada el 28/12/2006 por oem
Dim rng As Range, i As Long, Rangos
Rangos = Array("B15", "B16", "B17", "B18")
With Sheets("LISTA")
Set rng = .Cells(.Rows.Count, "A").End(xlUp)
For i = LBound(Rangos) To UBound(Rangos)
rng.Offset(1, i).Value _
= Sheets("REGISTRO").Range(Rangos(i)).Value
Next i

''''''''''''''''''''''''''''''''''''''''''''''''''
.Columns("A:D").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
''''''''''''''''''''''''''''''''''''''''''''''''''


End With
MsgBox Prompt:="O.K., oprime Aceptar para continuar"
End Sub

'*****************

En verdad no veo lógico ese error, pues una forma para que se produzca dicho error sería que se indicase el rango "A:D" para ordenar, y que uno de los campos de ordenación estuviese fuera de ese rango, por ejemplo «.Sort Key1:=Range("E2")»...

Prueba la solución de arriba, y si no funciona lo comentamos.

--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:

http://groups.google.com/group/microsoft.public.es.vba

Sergio

unread,
Jan 17, 2007, 3:06:23 PM1/17/07
to

Que tal Vin!

Probe colocando el codigo donde dijiste y no funciona, me sale el mismo
mensaje:


> > ´1004´ en tiempo de ejecucion, la referencia de ordenacion no es
> > valida, etc."...

tambien lo coloque en otros sitios y nada.

Que podra estar fallando?

Saludos

Sergio.

Ivan

unread,
Jan 17, 2007, 4:57:04 PM1/17/07
to
hola chicos, disculpad que me meta, pero se me han ocurrido un par de
posibilidades.

Sergio,

1º) cuando dices 'la 1ª fila tiene encabezados' ¿te refieres a la
1ª fila de la hoja ( es lo que se entiende desde aqui ) o a la 1ª
fila de 'tu' lista? si es lo segundo debes cambiar en el argumento Key1
el 'a2' por la 1ª (pej) celda de la columna A despues de la de titulos
-> pej titulos en fila 5 --> Key1:=.range("a6")

2º) si la macro no la llamas desde la hoja activa (y de todas formas
no esta de mas ponerlo) te conviene poner un punto delante de Range,
tambien en Key1 (de nuevo -> Key1:=.range("a2") ), para que se
considere sin dudas una celda de la hoja 'Listas' al incluirla dentro
del bloque With (con lo peq. que se ven los puntos en google quizas
este ya puesto, pero me parece que no)

no se si andara por ahi el error, pero, como dice Vinchenzo, lo normal
es que funcionara

un saludo a ambos
Ivan

Ivan

unread,
Jan 17, 2007, 6:12:32 PM1/17/07
to
hola de nuevo, otra 'cosilla'

en mi mensaje anterior, para el primer caso, tambien habria que cambiar
el rango de ordenacion (aunque esto no provocariaa el error, te
descabalaria el orden de la lista) pej. para el mismo supuesto (Titulos
en la fila 5 y lista de la columna A a la D) podria ser algo parecido a
esto -> (doy por hecho que la columna A es la mas larga(o igual), o sea
que si hay datos en otra en ella tambien)

With sheets("FILA")
.......
.......

.range("A6:D" & .range("a65536").end(xlup).row).sort
key1:=.range("a6"), ...resto de argumentos

....
end with

NOTA: -> .range("a65536").end(xlup).row -> devuelve el nº de la ultima
fila de la columna A, digamos que, subiendo desde el final de la hoja.
Tambien podrias usar -> .range("a5").End(xldown).row -> para
buscarla desde la 1ª fila de la lista yendo hacia abajo, que en teotia
seria mas rapido o mejor, pero a mi particularmente me gusta mas xlup
(no me suele dar disgustos). Puedes consultar la propiedad end en la
ayuda.

de todas formas, Sergio, (y solo te lo digo por si lo desconoces, sin
ninguna ironia ni nada por el estilo) cuando estes en el editor de VBA,
posiciona el cursor sobre 'sort' y dale a F1. La ayuda para este caso
(y para muchos otros) es bastante clara y, 'ayuda' lo suyo, aunque
cueste un poco acostumbrarse a ella. Creo que, si te esta gustando esto
de las macros, te lo hara mucho mas facil.

un saludo y hasta pronto
Ivan


Ivan ha escrito:

Sergio

unread,
Jan 19, 2007, 5:09:17 PM1/19/07
to

Que tal Ivan, te agradezco tu intervención, tenias razon en lo del
punto antes del Range, lo de tu codigo:

> With sheets("FILA")
> .......
> .......
>
> .range("A6:D" & .range("a65536").end(xlup).row).sort
> key1:=.range("a6"), ...resto de argumentos
>
> ....
> end with

no lo utilice por falta de tiempo

El codigo al que le añadi el punto que le faltaba, funciona en parte
(no da mensaje de error)
ORDENA solo el dato de la columna A (nombre proveedor), sin embargo las
celdas de las columnas B, C y D permanecen vacias (no copia los datos
en esas celdas), ya que sustituye los datos de las columnas B, C y D de
la ultima fila.

Cuantos puntos mas me haran falta?

te saluda, Sergio.

Ivan

unread,
Jan 19, 2007, 6:48:31 PM1/19/07
to
hola Sergio, lo primero dos ¿pequeñas? enmiendas a mis dos mensajes
anteriores:->

en el 1º ---> donde puse esto " 2º) si la macro no la llamas desde la
hoja activa " debia poner esto ---> Si la hija LISTA no es la hoja
activa

en el 2º ---> para el ej./supuesto dado, donde pone --->">
.range("A6:D" ...." debia poner ---> > .range("A5:D"


de todas formas, y dado que no comentas el nº de fila de la fila de
titulos, supongo que esta debe ser la primera de la hoja, o sea la 1.
Si es asi, no acabo de ver por que no te funciona (si es que el codigo
ya te funcionaba).

de todas formas, si los rangos con los que trabajas son siempre esos ->
extraes los datos de B15, b16, b17 y b18 de la hoja 'registro', y los
pegas en la 1º fila libre de la hoja 'lista', y si en esta hoja
quieres (o no te importa) que se ordenen TODOS los datos que pueda
haber (excepto los titulos, jejeje..), podria valerte este codigo
(repito:=>para el supuesto de los titulos en la fila nº1 de la hoja)

Sub COPIAR_PROVEEDOR2()
Dim i As Byte, fila As Long
With Worksheets("LISTA")
fila = .[a65536].End(xlUp).Row + 1
For i = 0 To 3
.Range("a" & fila).Offset(, i) = _
Worksheets("REGISTRO").Range("b" & 15 + i)
Next i
.UsedRange.Sort key1:=.[a2], order1:=xlAscending, header:=xlYes


End With
MsgBox Prompt:="O.K., oprime Aceptar para continuar"
End Sub

mira a ver si te hace el apaño, y, si analizas todas las variantes de
sort de este hilo (yo lo haria, y con F1 cerca) creo que no te seria
dificil adaptarlo a tu caso concreto

en cualquier caso, espero te ayude

un saludo
Ivan

Sergio

unread,
Jan 23, 2007, 7:26:01 PM1/23/07
to

Que tal Ivan! Te agradezco tu interes.

Probé tu código y quedó perfecto, me quedo con él.

te envio un saludo.

Sergio Dávalos.

0 new messages