Access

Control deslizante basado en formularios y VBA: modernización de la interfaz

Bueno, el 96% de las personas indicaron que desean aprender más sobre la creación de controles deslizantes.

Entonces, en esta publicación, comienzo a cubrir el tema presentando el control deslizante «más simple» (tal vez no del todo, pero lo que pensarías que sería el más simple) construido completamente usando un par de controles de etiqueta y un botón de comando.

Publicaré algunos artículos más en los próximos días que cubrirán otras posibilidades:

  • Control deslizante de rango múltiple
  • Control deslizante del navegador web heredado
  • Control deslizante del navegador web moderno

Un control deslizante basado en VBA y formulario (de usuario)

La configuración básica

El código

Option Compare Database
Option Explicit

' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : 
' Purpose   : Form/VBA based slider control for numeric entry
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - 
' Req'd Refs: None required
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         unknown
' 2         2024-06-23              Totoal revamp of the entire code base
'                                   Added coloring
'                                   Added option to hide caption
'---------------------------------------------------------------------------------------
Private iSliderMinValue       As Integer
Private iSliderMaxValue       As Integer
Private iSliderTotalRangeValue As Integer
Private Const bOmitSliderCaption As Boolean = False 'Display counter in Slider after selection is made
Private Const bApplyColor As Boolean = True 'Apply Custom coloring


Private Sub cmd_SliderBtn_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        Call CmdBtn_Update(X, Me.lbl_Slider, Me.lbl_SliderProgress, Me.cmd_SliderBtn)
    End If
End Sub

Private Sub cmd_SliderBtn_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        Me.SomeValue = Me.lbl_Slider.Caption
        Call CmdBtn_Update(X, Me.lbl_Slider, Me.lbl_SliderProgress, Me.cmd_SliderBtn, bOmitSliderCaption)
    End If
End Sub

Private Sub Form_Load()
    iSliderMinValue = -50
    iSliderMaxValue = 100
    iSliderTotalRangeValue = iSliderMaxValue - iSliderMinValue
    
    Me.lbl_SliderProgress.Left = Me.lbl_Slider.Left
    Me.lbl_SliderProgress.Top = Me.lbl_Slider.Top + (Me.lbl_Slider.Height - Me.lbl_SliderProgress.Height) / 2
    Me.cmd_SliderBtn.Top = Me.lbl_Slider.Top
    
    If IsNull(Me.SomeValue) Then Me.SomeValue = 0 ' Some value in the range, ***** You may not want this! *****
    Me.SomeValue_AfterUpdate
    If bApplyColor Then Call ApplyProgressColor
End Sub

Private Sub lbl_Slider_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        Call SliderProgress_Update(X, Me.lbl_Slider, Me.lbl_SliderProgress, Me.cmd_SliderBtn)
    End If
End Sub

Private Sub lbl_Slider_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        Call SliderProgress_Update(X, Me.lbl_Slider, Me.lbl_SliderProgress, Me.cmd_SliderBtn)
    End If
End Sub

Private Sub lbl_Slider_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        Me.SomeValue = Me.lbl_Slider.Caption
        Call SliderProgress_Update(X, Me.lbl_Slider, Me.lbl_SliderProgress, Me.cmd_SliderBtn, bOmitSliderCaption)
    End If
End Sub

Public Sub SomeValue_AfterUpdate()
    Me.lbl_SliderProgress.Width = ((Me.SomeValue - iSliderMinValue) / iSliderTotalRangeValue) * Me.lbl_Slider.Width
    If bOmitSliderCaption Then
        Me.lbl_Slider.Caption = ""
    Else
        Me.lbl_Slider.Caption = Me.SomeValue
    End If
    Me.cmd_SliderBtn.Left = Me.lbl_SliderProgress.Left + Me.lbl_SliderProgress.Width
End Sub






Private Sub SliderProgress_Update(X As Single, _
                      oSlider As Access.Label, _
                      oSliderProgress As Access.Label, _
                      oSliderBtn As Access.CommandButton, _
                      Optional bOmitCaption As Boolean = False)
    If X > oSlider.Width Then X = oSlider.Width
    If X  Access arithmetic hack!!!
    End If
    
    oSliderBtn.Left = Me.lbl_SliderProgress.Left + Me.lbl_SliderProgress.Width
    
   If bApplyColor Then Call ApplyProgressColor
End Sub

Private Sub CmdBtn_Update(X As Single, _
                             oSlider As Access.Label, _
                             oSliderProgress As Access.Label, _
                             oSliderBtn As Access.CommandButton, _
                             Optional bOmitCaption As Boolean = False)
    Dim lSliderValue          As Long

    X = oSliderBtn.Left + X
    If X > oSlider.Left + oSlider.Width - (oSliderBtn.Width / 2) Then X = oSlider.Left + oSlider.Width - (oSliderBtn.Width / 2)
    If X  Access arithmetic hack!!!
    
    If bOmitCaption Then
        oSlider.Caption = ""
    Else
        oSlider.Caption = lSliderValue
    End If

    If bApplyColor Then Call ApplyProgressColor
End Sub

Private Sub ApplyProgressColor()
    'For Fun!
    Dim lBottomThird          As Long
    Dim lUpperThird           As Long

    lBottomThird = iSliderMinValue + iSliderTotalRangeValue / 3
    lUpperThird = iSliderMaxValue - iSliderTotalRangeValue / 3
    Select Case CLng(Me.lbl_Slider.Caption)
        Case iSliderMinValue To lBottomThird
            Me.lbl_SliderProgress.BackColor = RGB(230, 0, 38) 'Red
        Case lUpperThird To iSliderMaxValue
            Me.lbl_SliderProgress.BackColor = RGB(34, 204, 0) 'green
        Case Else
            Me.lbl_SliderProgress.BackColor = RGB(255, 170, 0) 'Yellow
    End Select
End Sub

Con esta versión, puede hacer clic en el botón de comando y ajustar el control deslizante, o también puede hacer clic en cualquier parte del control deslizante para ajustar el valor. También puede ingresar el valor en el cuadro de texto y el control deslizante se ajustará automáticamente para representar el nuevo valor.

Base de datos de demostración

Siéntase libre de descargar una copia 100% desbloqueada de una base de datos de muestra que he reunido utilizando el enlace que se proporciona a continuación:

Descargar “Control deslizante: etiquetas y botones de comando”

SliderControl_VBA.zip – Descargado 139 veces – 32,87 KB

Aviso sobre contenido/descargas/demostraciones

Descargo de responsabilidad/Notas:

Si no tiene Microsoft Access, simplemente descargue e instale la versión de ejecución disponible gratuitamente (esto permite ejecutar bases de datos de MS Access, pero no modificar su diseño):

Tiempo de ejecución de Microsoft Access 2010
Tiempo de ejecución de Microsoft Access 2013
Tiempo de ejecución de Microsoft Access 2016
Tiempo de ejecución de Microsoft 365 Access

Todos los ejemplos de código, ejemplos de descarga, enlaces, … en este sitio se proporcionan ‘COMO ES‘.

En ningún caso Devhut.net o CARDA Consultants Inc. serán responsables ante el cliente/usuario final o cualquier tercero por cualquier daño, incluyendo cualquier pérdida de ganancias, pérdida de ahorros u otros daños incidentales, consecuentes o especiales que surjan del funcionamiento o la imposibilidad de operar el software que CARDA Consultants Inc. ha proporcionado, incluso si CARDA Consultants Inc. ha sido advertido de la posibilidad de tales daños.

Una última palabra

Por último, dado que esto utiliza controles estándar y VBA, tenga en cuenta que también se puede implementar en UserForms. Por lo tanto, se puede implementar en Excel, Word, etc. ¡Esto no se limita a Access!

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba