lunes, 7 de mayo de 2018

VBA: Forzar siempre Mayúsculas

En algún foro en el que participo preguntaba un usuario por la manera de obligar al usuario de escribir siempre en mayúsculas.

Iremos un paso más allá, y aprenderemos una forma de forzar las minúsculas o a escribir en modo 'Nombre Propio'.


Una manera sería mediante eventos de hoja, en concreto un evento que detecte que se ha escrito algo en alguna celda. El evento buscado será el Worksheet_Change.
Nuestra macro detectaré el cambio en la celda y, evitando sen una fórmula o función lo que hayamos escrito, procederá al cambio buscado.

En diferentes alternativas usaremos las funciones de VB:
UCASE para mayúsculas
LCASE para minúsculas
podríamos usar la función de hoja de cálculo
Worksheetfunction.PROPER para forma de Nombre Propio

o bien emplear la función de VB
StrConv(string, conversion, [LCID])
siendo el parámetro conversion, entre otras posibilidades:
vbUpperCase - 1 - Convierte la cadena a caracteres en mayúscula.
vbLowerCase - 2 - Convierte la cadena a caracteres en minúscula.
vbProperCase - 3 - Convierte la primera letra de cada palabra de la cadena en mayúscula.


Vemos las opciones comentadas...

En la ventana de código de la hoja incluimos el siguiente evento _Change:

Private Sub Worksheet_Change(ByVal Target As Range)
'Convierte a mayúscula/minúscula cualquier celda de la hoja
'tras aceptar
''''''''''''''''''''''''''''''''''''''''''''

'controlamos no haya más de una celda seleccionada
'o que la celda no tenga fórmulas
If Target.Cells.Count > 1 Or Target.HasFormula Then Exit Sub
On Error Resume Next

Application.EnableEvents = False    'deshabilitamos momentáneamente los eventos de la hoja
'convertimos a mayúsculas la celda cambiada
'empleando las funciones de VBA UCASE o LCASE
Target.Value = VBA.UCase(Target.Value)      'LCase(Target.value) para minúsculas
Application.EnableEvents = True     'y los volvemos a habilitar
On Error GoTo 0
End Sub



Una alternativa más 'profesional', también en la ventana de código de la hoja:

Private Sub Worksheet_Change(ByVal Target As Range)
'Convierte a mayúscula la primera letra de cada palabra
'para cualquier celda de la hoja tras Aceptar
''''''''''''''''''''''''''''''''''''''''''''
'controlamos no haya más de una celda seleccionada
'o que la celda no tenga fórmulas
If Target.Cells.Count > 1 Or Target.HasFormula Then Exit Sub

On Error Resume Next
Application.EnableEvents = False    'deshabilitamos momentáneamente los eventos de la hoja
'empleamos la función
'StrConv(string, conversion, [LCID])
'siendo conversion:
'vbUpperCase - 1 - Convierte la cadena a caracteres en mayúscula.
'vbLowerCase - 2 - Convierte la cadena a caracteres en minúscula.
'vbProperCase - 3 - Convierte la primera letra de cada palabra de la cadena en mayúscula.
Target.Value = VBA.StrConv(Target.Value, vbProperCase)
Application.EnableEvents = True      'y los volvemos a habilitar
On Error GoTo 0
End Sub



Otra posibilidad algo más compleja por sus repercusiones sería emplear una API de Windows SetKeyboardState:

Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long

Sub BloqueoMayuscula()
'OJO!! solo afecta a Excel.. nunca a otras aplicaciones!!
'por tanto cambairá los indicadores luminosos de NUM LOCK, CAPS LOCK o SCROLL LOCK del teclado.

Dim Resultado As Long
'matriz para el estado de las teclas virtuales existentes
Dim EstadoTeclas(0 To 255) As Byte

'Algunas teclas sobre las que trabajar
'Shift = &H10   
'Ctrl = &H11    
'Alt = &H12    
'CapsLock = &H14
'NumLock = &H90
'ScrollLock = &H91

'trabajamos sobre la mayúscula
EstadoTeclas(&H14) = 1 '1 - activa, 0 - desactiva

Resultado = SetKeyboardState(EstadoTeclas(0))

End Sub


Esta macro la podemos asociar al evento Open del Workbook o cualquiera otro mediante el que controlemos la acción deseada...

No hay comentarios:

Publicar un comentario