ORDENAR E INSERTAR FILAS EN BLANCO EN UN RANGO

01/12/2009 - 01:40 por FERNANDOMH | Informe spam
Hola a todos, les agradecería que me ayudaran con lo siguiente:

Tengo una hoja con datos de artículos en las columnas de la b a la z, en la
columna "B" tengo la clave de los articulos formada por 5 números, y en las
demás su descripción y otros datos más.

Los artículos se repiten en varias filas y varían algunos datos solo de las
útimas columnas.

Las filas no estan ordenas, es decir puede primero estar el artículo con
clave 45674 y luego el 23456.

Lo que quiero hacer es primero que me ordene los artículos en forma
consecutiva por número de artículo y luego que me pueda insertar 4 filas en
blanco cada que cambie la clave del artículo.

Esto desearía que se lograra mediante una macro. (no tengo mucho
conocimiento en macros)

Por su ayuda, de antemano muchas gracias.

Preguntas similare

Leer las respuestas

#6 Benito Merino
03/12/2009 - 07:57 | Informe spam
On 3 dic, 03:55, "Héctor Miguel"
wrote:
hola, Fernando !

> Efectivamente, existen celdas combinadas en las filas 1,2 y 3, La fila 4 esta vacia.
> Ojala que esto no haga mas dificil la solucion.
> ... se me ocurre... determinar la "region actual"... antes manualmente ... ?

prueba con una macro +/- como la siguiente:

Sub Cuatro_entre()
  Dim Celda As Range
  Application.ScreenUpdating = False
  With [b5].CurrentRegion
    .Sort Key1:=[b5], Order1:=xlAscending, Header:=xlNo
    .Offset(-1).Resize(1, 1) = "Clave"
    .Offset(-1).Resize(.Rows.Count + 1, 1).AdvancedFilter _
      Action:=xlFilterCopy, CopyToRange:=[aj1], Unique:=True
    .Offset(-1).Resize(1, 1).ClearContents
  End With
  For Each Celda In Range([aj3], [aj65536].End(xlUp).Offset(-1))
    [b:b].Cells.Find(Celda, [b5]).Resize(4).EntireRow.Insert
  Next
  Columns("aj").ClearContents
  Debug.Print ActiveSheet.UsedRange.Address
End Sub

saludos,
hector.



Hola Héctor.

La verdad es que es una suerte poder aprender siempre de tu forma de
programar tan completa.

He replicado tu macro en una hoja de cálculo y funciona muy bien. Sin
embargo, si el número de items a ordenar es bastante amplio,
al insertar las filas en blanco, es posible (en mi caso ha sucedido)
que el rango utilizado en la columna aj se vaya ampliando (con celdas
vacías), y entonces
los resultados de la macro no son los esperados. Quizás fuese mejor
que el rango aj estuviese en otra hoja o bien que se ordenase tras
cada inserción.

Saludos y disculpas por la intromisión.

Benito
Barcelona
Respuesta Responder a este mensaje
#7 Héctor Miguel
03/12/2009 - 08:49 | Informe spam
hola, Benito !

... si el numero de items a ordenar es bastante amplio, al insertar las filas en blanco, es posible
(en mi caso ha sucedido) que el rango utilizado en la columna aj se vaya ampliando (con celdas vacías)
y entonces los resultados de la macro no son los esperados.
Quizas fuese mejor que el rango aj estuviese en otra hoja o bien que se ordenase tras cada insercion...



tienes razon, las pruebas las corri sobre un listado (bastante) "recortado" y no anticipe esa posibilidad :-((
como la columna (AJ) es utilizada solo como "puente" (temporal) se puede meter a una variable de matriz (p.e.)

Sub Cuatro_entre()
Dim Celda As Range, n As Integer, Matriz
Application.ScreenUpdating = False
With [b5].CurrentRegion
.Sort Key1:=[b5], Order1:=xlAscending, Header:=xlNo
.Offset(-1).Resize(1, 1) = "Clave"
.Offset(-1).Resize(.Rows.Count + 1, 1).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=[aj1], Unique:=True
.Offset(-1).Resize(1, 1).ClearContents
End With
Matriz = Application.Transpose( _
Range([aj3], [aj65536].End(xlUp).Offset(-1)).Value)
Columns("aj").ClearContents
For n = LBound(Matriz) To UBound(Matriz)
[b:b].Cells.Find(Matriz(n), [b5]).Resize(4).EntireRow.Insert
Next
Debug.Print ActiveSheet.UsedRange.Address
End Sub

saludos,
hector.

p.d. te agradezco la observacion (y los comentarios, obviamente) :D
Respuesta Responder a este mensaje
#8 FERNANDOMH
03/12/2009 - 16:49 | Informe spam
"Héctor Miguel" escribió:

hola, Benito !

> ... si el numero de items a ordenar es bastante amplio, al insertar las filas en blanco, es posible
> (en mi caso ha sucedido) que el rango utilizado en la columna aj se vaya ampliando (con celdas vacías)
> y entonces los resultados de la macro no son los esperados.
> Quizas fuese mejor que el rango aj estuviese en otra hoja o bien que se ordenase tras cada insercion...

tienes razon, las pruebas las corri sobre un listado (bastante) "recortado" y no anticipe esa posibilidad :-((
como la columna (AJ) es utilizada solo como "puente" (temporal) se puede meter a una variable de matriz (p.e.)

Sub Cuatro_entre()
Dim Celda As Range, n As Integer, Matriz
Application.ScreenUpdating = False
With [b5].CurrentRegion
.Sort Key1:=[b5], Order1:=xlAscending, Header:=xlNo
.Offset(-1).Resize(1, 1) = "Clave"
.Offset(-1).Resize(.Rows.Count + 1, 1).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=[aj1], Unique:=True
.Offset(-1).Resize(1, 1).ClearContents
End With
Matriz = Application.Transpose( _
Range([aj3], [aj65536].End(xlUp).Offset(-1)).Value)
Columns("aj").ClearContents
For n = LBound(Matriz) To UBound(Matriz)
[b:b].Cells.Find(Matriz(n), [b5]).Resize(4).EntireRow.Insert
Next
Debug.Print ActiveSheet.UsedRange.Address
End Sub

saludos,
hector.

p.d. te agradezco la observacion (y los comentarios, obviamente) :D


.
Hola Hector Miguel y Benito Merino.



Apliqué la macro que me indicaron y me sirvió a la perfección, muchas
gracias por su apoyo, es bueno saber que podemos contar con personas como
ustedes que tienen mucho conocimiento en el tema y sobre todo que quieren
compartir sus conocimientos, saludos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida