. 24.01.17 #VBA listas de Validación Cruzadas Autoordenables
Buenas tardes,
Estuve haciendo varias pruebas para resolver esto que solicitaste.
La solución agrega a aquella para hacer las búsquedas cruzadas de acuerdo a dónde se seleccione el dato.
Para ello necesitarás crear un nombre de rango más que comprenda toda la base a ordenar.
Algo así como esto:
Entonces tendrás tres rangos, y asumiré que tienes esta tabla en una hoja llamada "base":
1.- LCod (rango en celeste) con los códigos de cada país
2.- LDescr. (Rango en verde) con los nombres de cada uno de ellos.
Estos dos, respectivamente, serán los que uses para construir la lista de validación en las celdas donde haces la selección.
3.- LBase Comprende los dos anteriores más los datos poblacionales o los que tuvieres.
Luego, en la hoja donde se hace la selección reemplaza el procedimiento anterior por esto:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'---- Variables modificables ----
'=== Aquí modifica estos datos de acuerdo a tu proyecto:
HojaTabla = "base"
ColSeleCod = "C" 'columna donde se selecciona el código del país
ColSeleDescr = "D" 'columna donde se selecciona el nombre del país
RangoCod = "LCod" 'rango de lista de Codigos
RangoDes = "LDescr" 'rango de lista de Descripciones
RangoBase = "LBase" 'Rango de la base a ordenar
'---- fin Variables
'
'---- inicio de rutina:
'
Application.ScreenUpdating = False
ColSeleCod = Range(ColSeleCod & "1").Column
ColSeleDescr = Range(ColSeleDescr & "1").Column
If Target.Column = ColSeleCod And Target.Rows.Count = 1 Then
With ActiveWorkbook.Worksheets(HojaTabla).Sort
.SortFields.Clear
.SortFields.Add Key:=ActiveWorkbook.Worksheets(HojaTabla).Range(RangoCod), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange ActiveWorkbook.Worksheets(HojaTabla).Range(RangoBase)
.Header = xlGuess
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ElseIf Target.Column = ColSeleDescr And Target.Rows.Count = 1 Then
With ActiveWorkbook.Worksheets(HojaTabla).Sort
.SortFields.Clear
.SortFields.Add Key:=ActiveWorkbook.Worksheets(HojaTabla).Range(RangoDes), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange ActiveWorkbook.Worksheets(HojaTabla).Range(RangoBase)
.Header = xlGuess
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== Aquí modifica estos datos de acuerdo a tu proyecto:
HojaTabla = "base"
ColSeleCod = "C" 'columna donde se selecciona el código del país
ColSeleDescr = "D" 'columna donde se selecciona el nombre del país
RangoCod = "LCod" 'rango de lista de Codigos
RangoDes = "LDescr" 'rango de lista de Descripciones
RangoBase = "LBase" 'Rango de la base a ordenar
'---- fin Variables
'
'---- inicio de rutina:
'
ColSeleCod = Range(ColSeleCod & "1").Column
ColSeleDescr = Range(ColSeleDescr & "1").Column
If Target.Column = ColSeleCod And Not IsEmpty(Target) And Target.Rows.Count = 1 Then
On Error Resume Next
Encontrado = Sheets(HojaTabla).Range(RangoCod).Find(What:=Target.Value, LookAt:=xlWhole).Address
If Err.Number = 0 And Len(Encontrado) > 0 Then
Application.EnableEvents = False
Target.Offset(0, 1).Value = Sheets(HojaTabla).Range(Encontrado).Offset(0, 1).Value
Application.EnableEvents = True
End If
ElseIf Target.Column = ColSeleDescr And Not IsEmpty(Target) And Target.Rows.Count = 1 Then
On Error Resume Next
Encontrado = Sheets(HojaTabla).Range(RangoDes).Find(What:=Target.Value, LookAt:=xlWhole).Address
If Err.Number = 0 And Len(Encontrado) > 0 Then
Application.EnableEvents = False
Target.Offset(0, -1).Value = Sheets(HojaTabla).Range(Encontrado).Offset(0, -1).Value
Application.EnableEvents = True
End If
End If
End Sub
Notarás que ahora hay dos eventos:
1.- El que te había pasado que, al cambiar de país o de código, se cambia la columna opuesta.
2.- Uno nuevo que según qué celda selecciones, reordena la tabla de la hoja "Base" y te muestra la lista de validación ordenada alfabéticamente.
Nota que las variables están indicadas en ambas rutinas para independizarlas. Si tienes que modifica alguna para adaptarla a tu proyecto, recuerda hacerlo en ambas.
Hasta donde probé, funciona como se espera.
Espero que tambien lo haga para ti.
Un abrazo
Fer
.
-