Visual Basic para Aplicaciones - ordenar con rango de celdas no contiguas

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

ordenar con rango de celdas no contiguas

Publicado por Juanjo (2 intervenciones) el 07/06/2023 00:05:36
Tengo el siguiente codigo vba para una macro de excel. Pero no consigo encontrar la instruccion que me sustituya Range("D270").Select por una linea que haga referencia al final de la columna.Y es que el rango es variable de un dia para otro, y la unica solucion chapuza que vi era poner un numero alto para que coja todos los registros hasta el 270 ya que suelen ser menos registros.




Sub Macro2()
'
' Macro2 Macro
'

'
Range("B:B,F:M").Select
Range("F1").Activate
Selection.Delete Shift:=xlToLeft
Application.Goto Reference:="R1C4"
Columns("D:D").Select
Selection.Cut
Range("A1").Select
Selection.Insert Shift:=xlToRight
Application.Goto Reference:="R1C4"
Columns("D:D").Select
Selection.Insert Shift:=xlToRight
Application.Goto Reference:="R2C4"
ActiveCell.FormulaR1C1 = "=RIGHT(RC[-1],11)"
Range("D2").Select
Selection.Copy
'ActiveCell.SpecialCells(xlLastCell).Select
Range("D270").Select


'ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Select

'ActiveSheet.Range("d1", ActiveSheet.Range("d1").End(xlDown)).Select
'ActiveSheet.Range("D1", ActiveSheet.Range("D" & ActiveSheet.Rows.Count).End(xlUp)).Select
'ActiveSheet.Range("d1:" & ActiveSheet.Range("d" & ActiveSheet.Rows.Count). _
End(xlUp).Address).Select

Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
Application.Goto Reference:="R1C4"
Columns("D:D").Select
Application.CutCopyMode = False
Selection.Insert Shift:=xlToRight
Application.Goto Reference:="R2C4"
ActiveCell.FormulaR1C1 = "=MID(RC[-1],1,LEN(RC[-1])-13)"
Range("D2").Select
Selection.Copy
'Selection.End(xlDown).Select
Selection.End(xlUp).Select
ActiveCell.SpecialCells(xlLastCell).Select
Range("D270").Select
Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
Application.Goto Reference:="R1C1"
Range("A1:G27").Select
Selection.Columns.AutoFit
Application.Goto Reference:="R1C3"
Selection.EntireColumn.Hidden = True
Range("D2").Select
Application.Goto Reference:="R1C5"
Selection.EntireColumn.Hidden = True
Application.CutCopyMode = False
Application.Goto Reference:="R1C7"
Selection.ColumnWidth = 50
ActiveWorkbook.Worksheets("tablaCitaciones2").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("tablaCitaciones2").Sort.SortFields.Add2 Key:=Range _
("A2:A270"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("tablaCitaciones2").Sort.SortFields.Add2 Key:=Range _
("G2:G270"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("tablaCitaciones2").Sort.SortFields.Add2 Key:=Range _
("E2:E270"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("tablaCitaciones2").Sort
.SetRange Range("A1:G270")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Pere

ordenar con rango de celdas no contiguas

Publicado por Pere (2 intervenciones) el 08/06/2023 14:46:11
¡Hola!

Un método rápido es el siguiente:
1
2
3
4
5
6
7
8
'Creas una variable de tipo Long
Dim LastRow As Long
 
'Le das el valor de la última fila de la columna indicada, en este caso la D
LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "D").End(xlUp).Row
 
'Seleccionas la última celda de la columna D
Range("D" & LastRow).Select

Dispones de más información y métodos de selección en este link: Find last Row or Last Column
Te invito a mi Canal.

PD: Por otro lado, te aconsejo que utilices nombres para referirte a valores que usarás en celdas o bien que incorporarás. Por ejemplo, noto que utilizas mucho la celda D2. Quizá sería mejor que le pusieras un nombre descriptivo en el espacio de nombres. De esta manera, puede facilitarte futuras modificaciones y el código se iría depurando mucho más. Lo mismo con los rangos o los nombres de los subprocesos.

También sería bueno leer algunos principios de VBA, ya que veo un código muy extenso por las pocas acciones que hace, y eso puede también dificultarte la escalabilidad y la optimización. Quizá sería bueno una reestructuración del código a medio plazo y/o cuando te sientas preparado.

Suerte en tu proyectos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ordenar con rango de celdas no contiguas

Publicado por juanjo (2 intervenciones) el 19/06/2023 20:37:27
Muchísimas gracias por tu respuesta y excelentes consejos.
Por cierto, el enlace Find last row or last column no lleva a ningún post. Si que lleva a la pagina principal de tu web, pero quizás ese post le pasó algo.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Pere

ordenar con rango de celdas no contiguas

Publicado por Pere (2 intervenciones) el 23/06/2023 10:15:22
Es curioso que el enlace de Find Last Row or Last Column no funcione. Lo debenhaber cambiado.
En todo caso te paso otro enlace que te puede ser también de ayuda: https://www.wallstreetmojo.com/vba-last-row/

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar