¿Pueden ordenarse las listas desplegables cruzadas? En excel

¿Pueden ordenarse las listas desplegables cruzadas en excel?

Es decir, como se basan en listas físicas, y al estar relacionadas, sólo una puede ordenarse, ya que la otra cambiará al ordenar la primera... Es posible hacerlo de alguna, ¿manera?

Por ejemplo una, lista paises y la otra habitantes. Q si pinchas en el desplegable de la primera lista salga ordenados los paises y te busque el código, pero si pichas en la, segunda, salgan ordenados los códigos y t busque el pais

1 Respuesta

Respuesta
1

. 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

.

-

No me deja mandarte imagen. Tienes un mail?Gracias

.

En realidad, debes grabar la imagen como un archivo .png o jpg y luego subirlo aquí con el boton:

De la barra que te aparece en el cuerpo del post.

De todos modos este es mi e-mail:

Te he mandado dos mails solo mira el último. No sé qué pasa pero no me deja escribirte desde el ordenador aquí en todo expertos desde el móvil si

.

Recibidos OK, aunque fueron a la carpeta de spam.

Menos mal que avisate.

Luego miro el último y te comento.

Abrazo
Fer

.

Ya t escribí, pero como tengo tan mala cabeza, cada vez que te escribía se me olvidaba algo.

Asi q tendras 3 mails y asi todo se me olvido otra cosa.

Se puede hacer ara que si escribes en el desplegable código o descripción, solo con alguna letra ya te enseñe alguna posible opción de su listado, es decir, que si pongo, si..., me ofrezca sin visita para elegir o poder seguir escribiendo.

Perdona ser tan pesado

Dios te lo pague.

.

Buenas,

Acabo de responderte a tu mail con lo que solicitabas.

También ya había respondido a tu consulta respecto a que se autocompleten textos en las listas de validación: no lo es.

Un abrazo
Fer

.

Gracias. Ya te hice otra pregunta.

¿Soy incansable, verdad,,?

.

Ok, ya te respondí.

También soy incansable, je!

Abrazo

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas