VBA: cómo crear un cuadro combinado en cascada en un formulario de usuario
VBA: cómo crear un cuadro combinado en cascada en un formulario de usuario
Introducción
En este artículo, aprenderá cómo llenar un cuadro combinado en cascada usando el método Indirecto.Prerrequisitos
- 1 cuaderno de ejercicios
- 1 formulario de usuario
- 3 combobox.
También puede descargar un libro de muestra aquí: //cjoint.com/14au/DHhootCLYVh.htm
Gestionar nombres bajo Excel
Para definir nombres en un libro de Excel, puede:- Excel 2007 o versión anterior: Insertar> Nombres> Definir .
- A partir de Excel 2010: Fórmulas de cinta> Definir un nombre.
El código para el combobox.
Queremos que suceda lo siguiente:- Al cargar el formulario de usuario, se llenará el ComboBox1.
- Los otros cuadros combinados se rellenarán en función de los valores del primero.
Llenando la primera lista
Para llenar un cuadro combinado con el contenido de un rango con nombre del libro de trabajo, la sintaxis es:- ComboBox1.List = Application.Transpose (Range ("monNom"))
Para borrar el ComboBox:
- Combobox1.Clear
Lo que nos da el código para completar la primera lista desplegable en la carga del UserForm:
Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub
Llenando la 2da lista
Cuando se selecciona un valor en la primera lista desplegable, se corresponderá (el texto que se muestra en el ComboBox) a un nombre de libro de trabajo.Para mostrar el contenido de las celdas del rango nombrado, usaremos el evento Change:
Private Sub ComboBox1_Change () 'Combobox département Evite el error generado cuando un usuario borra el contenido de ComboBox1 Si ComboBox1.Value = "" Luego salga de Sub ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange)) End Sub
Para el tercer cuadro combinado:
Private Sub ComboBox2_Change () 'Combobox communes Si ComboBox2.Value = "" Entonces salga de Sub ComboBox3.Clear ComboBox3.List = Application.Transpose (Range (NomRange)) End Sub
Errores comunes
Rango sin nombre
El nombre ingresado en el ComboBox no coincidirá con ningún nombre de libro de trabajo. Esto sucede cuando el nombre no ha sido definido. Para evitar este problema, crearemos una pequeña función para recorrer todos los nombres del libro de trabajo:Función NomDefini (Nom As String) Como Boolean Dim Noms Como nombre NomDefini = Falso para cada Noms en ThisWorkbook.Names Si Noms.Name = Nom Entonces NomDefini = Verdadero: Función de salida Siguiente Noms Función de fin
Error de entrada
Como notará en el archivo de muestra, la definición de nombres no tiene en cuenta los caracteres especiales o los espacios. En algunas situaciones, puede que necesite editar las variables:Aquí hay un ejemplo:
Función CaracSpec (Nom As String) como cadena CaracSpec = Replace (Nom, "", "_") CaracSpec = Replace (CaracSpec, "-", "_") End Function
El codigo completado
Option Explicit Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change () 'Combobox département If ComboBox1.Value = "Then Exit Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange como cadena NomRange = CaracSpec (ComboBox1.Value) Si NomDefini (NomRange) Entonces ComboBox2.List = Application.Transpose (Range (NomRange)) Else ComboBox2.AddItem "" Auc " Comandos finales Comb ComboBox2_Change () 'Combobox si ComboBox2.Value = "" Finalizar Sub ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox2.Value) If NomDefini (NomRange) Then ComboBox3.List = (Rango (NomRange)) Else ComboBox3.AddItem "" "Aucune rue" "" End If End Sub Función NomDefini (Nom As String) Como Boolean Dim Noms Como nombre NomDefini = Falso para cada Noms en este libro de trabajo. Nom Then NomDefini = True: Salir Función Next Noms End Function Función Carac Spec (Nom As String) como String CaracSpec = Replace (Nom, "", "_") CaracSpec = Replace (CaracSpec, "-", "_") Función final
Enlace de descarga
Descargue la hoja de muestra en este enlace: //cjoint.com/?DHhootCLYVhVBA: cómo crear un cuadro combinado en cascada en un formulario de usuario
Introducción
En este artículo, aprenderá cómo llenar un cuadro combinado en cascada usando el método Indirecto.Prerrequisitos
- 1 cuaderno de ejercicios
- 1 formulario de usuario
- 3 combobox.
También puede descargar un libro de muestra aquí: //cjoint.com/14au/DHhootCLYVh.htm
Gestionar nombres bajo Excel
Para definir nombres en un libro de Excel, puede:- Excel 2007 o versión anterior: Insertar> Nombres> Definir.
- A partir de Excel 2010: Fórmulas de la cinta de opciones> Definir un nombre.
El código para el combobox.
Queremos que suceda lo siguiente:- Al cargar el formulario de usuario, se llenará el ComboBox1.
- Los otros cuadros combinados se rellenarán en función de los valores del primero.
Llenando la primera lista
Para llenar un cuadro combinado con el contenido de un rango con nombre del libro de trabajo, la sintaxis es:- ComboBox1.List = Application.Transpose (Range ("monNom"))
Para borrar el ComboBox:
- Combobox1.Clear
Lo que nos da el código para completar la primera lista desplegable en la carga del UserForm:
Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub
Llenando la 2da lista
Cuando se selecciona un valor en la primera lista desplegable, este (el texto que se muestra en el ComboBox) corresponde a un nombre de libro de trabajo.Para mostrar el contenido de las celdas del rango nombrado, usaremos el evento Change:
Private Sub ComboBox1_Change () 'Combobox département Evite el error generado cuando un usuario borra el contenido de ComboBox1 Si ComboBox1.Value = "" Luego salga de Sub ComboBox2.Clear ComboBox3.Clear ComboBox2.List = Application.Transpose (Range (NomRange)) End Sub
Para el tercer cuadro combinado:
Private Sub ComboBox2_Change () 'Combobox communes Si ComboBox2.Value = "" Entonces salga de Sub ComboBox3.Clear ComboBox3.List = Application.Transpose (Range (NomRange)) End Sub
Errores comunes
Rango sin nombre
El nombre ingresado en el ComboBox no coincide con ningún nombre de libro de trabajo porque aún no se ha definido. Para evitar este problema, crearemos una pequeña función. SusEl rol es recorrer todos los nombres del libro de trabajo:
Función NomDefini (Nom As String) Como Boolean Dim Noms Como nombre NomDefini = Falso para cada Noms en ThisWorkbook.Names Si Noms.Name = Nom Entonces NomDefini = Verdadero: Función de salida Siguiente Noms Función de fin
Error de entrada
Como notará en el archivo de muestra, la definición de nombres no tiene en cuenta los caracteres especiales o los espacios. En algunas situaciones, puede que necesite editar la variable:Aquí hay un ejemplo:
Función CaracSpec (Nom As String) como cadena CaracSpec = Replace (Nom, "", "_") CaracSpec = Replace (CaracSpec, "-", "_") End Function
El codigo completado
Option Explicit Private Sub UserForm_Initialize () ComboBox1.Clear ComboBox1.List = Application.Transpose (Range ("Dep")) ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change () 'Combobox département If ComboBox1.Value = "Then Exit Sub ComboBox2.Clear ComboBox3.Clear Dim NomRange como cadena NomRange = CaracSpec (ComboBox1.Value) Si NomDefini (NomRange) Entonces ComboBox2.List = Application.Transpose (Range (NomRange)) Else ComboBox2.AddItem "" Auc " Comandos finales Comb ComboBox2_Change () 'Combobox si ComboBox2.Value = "" Finalizar Sub ComboBox3.Clear Dim NomRange As String NomRange = CaracSpec (ComboBox2.Value) If NomDefini (NomRange) Then ComboBox3.List = (Rango (NomRange)) Else ComboBox3.AddItem "" "Aucune rue" "" End If End Sub Función NomDefini (Nom As String) Como Boolean Dim Noms Como nombre NomDefini = Falso para cada Noms en este libro de trabajo. Nom Then NomDefini = True: Salir Función Next Noms End Function Función Carac Spec (Nom As String) como String CaracSpec = Replace (Nom, "", "_") CaracSpec = Replace (CaracSpec, "-", "_") Función final