Buscar en Ayuda Excel:

Botones de opción

Los botones de opción se utilizan para elegir una única opción entre una serie de ellas, es decir, de un grupo de opciones sólo permitirán que se escoja una. De la misma forma que las casillas de verificación, casi siempre implican una estructura condicional para comprobar cual de ellas está activada. El botón activado tendrá su propiedad Value igual a true.

Como ejemplo de su utilización crearemos dos botones de opción que sirvan para que a la hora de copiar datos hacia la hoja, se copie sólo los valores de Nombre y Apellidos o todos como hasta ahora.

Incluya dos botones de opción y establezca las siguientes propiedades.

Botón1.

                Name, Todo.

                Caption, Todo.

Botón2.

                Name, Solo_Nombre.

                Caption, Nombre y Apellidos.

Si está activado el primer botón deberán copiarse todos los datos mientras que si está activado el segundo solo se copiarán el Nombre y los Apellidos. El procedimiento Copiar_Datos_Hojas quedará de la forma siguiente.

 

Private Sub Copiar_Datos_Hojas(r1 As Range, r2 As Range)

                Dim i As Integer

                Dim Datos As Variant

                Dim Final As Integer

                ' Si Botón Todo Activado, se copian todas las columnas

                If Todo.Value = True Then

                               Final = Num_Columnas - 1

                Else ' Sólo se copian las dos primera columnas

                               Final = 1

                End If

                ' recorrer las columnas del registro y copiar celda a celda

                For i = 0 To Final

                               ' Si la casilla Mayúsculas está activada y el tipo de datos es String

                               If Mayusculas.Value = True And TypeName(r1.Offset(0, i).Value) = "String" Then

                                               Datos = UCase(r1.Offset(0, i).Value)

                               Else

                                               Datos = r1.Offset(0, i).Value

                               End If

                               r2.Offset(0, i).Value = Datos

                Next i

End Sub

 

Y aquí terminamos el estudio de cómo se pueden utilizar los controles de formulario dentro de una hoja de cálculo. Recordarle para terminar que debe ser extremadamente cuidadoso con el código que utilice en los procedimientos de evento sobre todo si los controles se interrelacionan entre ellos.

 

Option Explicit

' Numero de columnas(campos) de las que consta cada registro

Const Num_Columnas = 6

Private Sub Copiar_Datos_Click()

                Dim i As Integer

                Dim x As Integer

' Recoger el elemento seleccionado de la lista

                i = Lista_Campos.ListIndex

                ' Si i < 0 no está seleccionado ningún elemento

                If i < 0 Then

                               MsgBox ("Debe Seleccionar un campo de la lista")

                Else

                               x = Lista_Comparacion.ListIndex

                               If x < 0 Then

                                               MsgBox ("Debe Seleccionar uno operador de Comparación")

                               Else

                                               ' llamar a proceder

                                               Call Proceder(i)

                               End If

                End If

End Sub

 

' Procedimiento Proceder

' Inicia la copia de los datos coincidentes

' Parámetros:

'               Columna = Elementos seleccionado de la lista que coincidirá

'               con la columna sobre la que se debe buscar

Private Sub Proceder(Columna As Integer)

                Dim r1 As Range, r2 As Range

                Dim encontrado As Boolean

                Dim Valor_Comparacion As Boolean

                Dim Signo As Integer

                Dim Tipo_Datos As String

                ' Si el cuadro de texto está vacío, no se busca nada

                If Len(Datos_Buscar.Value) = 0 Then

                               MsgBox ("No hay datos que buscar")

                Else

                               ' Borrar los datos actuales

                               Call borrar_datos

                               ' Activar Casilla A16 de Hoja2 y referenciarla con r2

                               ' Es la casilla donde se copiarán los datos en caso que se encuentren

                               Worksheets(2).Range("A16").Activate

                               Set r2 = ActiveCell

' Activar casilla A2 de Hoja1 y referenciarla con r1

                                Worksheets(1).Activate

                               Worksheets(1).Range("A2").Activate

' Recorrer todo el rango de datos de Hoja1

                               encontrado = False

                               Do While Not IsEmpty(ActiveCell)

' Recoger el Signo de comparación

                               Signo = Lista_Comparacion.ListIndex

                               ' recoger el tipo de datos

                               Tipo_Datos = Lista_Campos.Column(1, Columna)

                               Valor_Comparacion = Comparar(ActiveCell.Offset(0, Columna).Value, _

                               Datos_Buscar.Value, Signo, Tipo_Datos)

                              

                               If Valor_Comparacion = True Then

                                               encontrado = True

                                               ' Referenciar con r1 la celda donde están os datos

                                               Set r1 = ActiveCell

                                               ' Copiar los datos

                                               Call Copiar_Datos_Hojas(r1, r2)

                                               ' Referenciar con r2 la casilla donde se copiaran los próximos datos

                                               Set r2 = r2.Offset(1, 0)

                               End If

                ActiveCell.Offset(1, 0).Activate

                Loop

                Worksheets(2).Activate

                If encontrado Then

                               MsgBox ("Datos Copiados")

                Else

                               MsgBox ("Ninguna coincidencia")

                End If

End If

End Sub

 

' Función que compara dos valores con un operador relacional =, >, <, etc.

' La función devuelve True o False en función de la comparación.

' Parámetros.

'               Valor1 y Valor2 = Valores que se comparan

'               Signo = variable que sirve para escoger el operador relacional

'               en función de su valor, ver estructura Select Case

Private Function Comparar(Valor1 As Variant, Valor2 As Variant, Operador As Integer, Tipo As

String) As Boolean

                Dim q As Boolean

                Select Case Tipo

                               Case "N": ' Convertir a número

                                               Valor2 = Val(Valor2)

                               Case "F": ' Convertir a Fecha

                                               Valor2 = CDate(Valor2)

                End Select

                Select Case Operador

                               Case 0:

                                               q = Valor1 = Valor2

                               Case 1:

                                               q = Valor1 > Valor2

                               Case 2:

                                               q = Valor1 < Valor2

                               Case 3:

                                               q = Valor1 >= Valor2

                               Case 4:

                                               q = Valor1 <= Valor2

                End Select

                Comparar = q

End Function

 

' Procedimiento para borrar los datos de Hoja2 se llama antes de proceder a la nueva copia

Private Sub borrar_datos()

                Dim i As Integer

                Worksheets(2).Range("A16").Activate

                Do While Not IsEmpty(ActiveCell)

                               For i = 0 To Num_Columnas - 1

                                               ActiveCell.Offset(0, i).Value = ""

                               Next i

                                               ActiveCell.Offset(1, 0).Activate

                Loop

End Sub

 

' Procedimiento para copiar los datos de Hoja1 a Hoja3

' Parámetros.

' r1 = Celda Origen

' r2 = Celda Destino

Private Sub Copiar_Datos_Hojas(r1 As Range, r2 As Range)

                Dim i As Integer

                Dim Datos As Variant

                Dim Final As Integer

' Si Botón Todo Activado, se copian todas las columnas

                If Todo.Value = True Then

                               Final = Num_Columnas - 1

                Else ' Sólo se copian las dos primera columnas

                               Final = 1

                End If

                ' recorrer las columnas del registro y copiar celda a celda

                For i = 0 To Final

                               ' Si la casilla Mayúsculas está activada y el tipo de datos es String

                               If Mayusculas.Value = True And TypeName(r1.Offset(0, i).Value) = "String" Then

                                               Datos = UCase(r1.Offset(0, i).Value)

                               Else

                                               Datos = r1.Offset(0, i).Value

                               End If

                               r2.Offset(0, i).Value = Datos

                Next i

End Sub

 

Private Sub Datos_Buscar_Change()

                ' Si el numero de control está activado

                If Numero.Enabled Then

                ' No permite coger valores superiores a la propiedad Max

                               If Val(Datos_Buscar.Value) > Numero.Max Then

                                               MsgBox ("Valor demasiado grande")

                                               Datos_Buscar.Value = Numero.Max

                               Else

                                               ' No permite coger valores inferiores a la propiedad Min

                                               If Val(Datos_Buscar.Value) < Numero.Min Then

                                                               MsgBox ("Valor demasiado pequeño")

                                                               Datos_Buscar.Value = Numero.Min

                                               Else

                                                               Numero.Value = Val(Datos_Buscar.Value)

                                               End If

                               End If

                End If

End Sub

 

 

Private Sub Lista_Campos_Change()

                Dim i As Integer

                Dim Tipo_Datos As String

                i = Lista_Campos.ListIndex

               

                If i >= 0 Then

                               Tipo_Datos = Lista_Campos.Column(1, i)

                               If Tipo_Datos = "N" Then

                                               Numero.Enabled = True

                                               If Lista_Campos.Value = "Edad" Then

                                                               Numero.Min = 18

                                                               Numero.Max = 99

                                                               Numero.SmallChange = 1

                                                               Datos_Buscar.Value = 0

                                                               Numero.Value=0

                                               End If

                                              

                                               If Lista_Campos.Value = "Cantidad" Then

                                                               Numero.Min = 10000

                                                               Numero.Max = 500000

                                                               Numero.SmallChange = 1000

                                                               Datos_Buscar .Value= 0

                                                               Numero.Value=0

                                               End If

                               Else

                                               Numero.Enabled = False

                               End If

                End If

End Sub

 

 

Private Sub Numero_Change()

                Datos_Buscar.Value = Numero.Value

End Sub


Technorati Tags:
Distribuir contenido


Cursos Excel · Manual básico · Tutoriales Excel · Foro Excel · Enlaces y recursos · VBA Excel · Plantillas Excel · Nota legal · Contacta