# ==Validar Inputbox==



## yra_vj (Mar 20, 2008)

Hola que tal!

Alguien podria por favor ayudarme ya que he diseñado esta macro donde transfiero un formato dependiendo del mes, mi macro funciona, pero es interrumpida si yo tecleo algo mal, yo quisiera validar la entrada del inputbox para que solo acepte texto,y quisiera que me mande msg de que teclee una vez mas y que cuando le de en boton cancelar se salga de la macro que se esta ejecutando. Alguien podria darme una idea????
Anexo mi codigo:


```
Do
hoja = UCase(InputBox("Nombre del mes a transferir?[Solo 3 letras]", "Selecciona Hoja"))
Sheets("TRABAJO").Select
Cells.Select
Range("A1").Activate
Selection.Copy
Worksheets(hoja).Activate
ActiveSheet.Range("A1").Activate
If IsEmpty(ActiveCell) Then
ActiveSheet.Paste
Range("A1").Select
Application.ScreenUpdating = True
ActiveSheet.Range("A1").Value = " REAL " & hoja
Selection.Font.Bold = True
Sheets("MENU").Select
ban = 0
Else
MsgBox "Hoja ocupada elija otra"
Sheets("MENU").Select
ban = 1
End If
Loop While ban = 1
```


----------



## Greg Truby (Mar 28, 2008)

```
#If VBA6 Then
    '// versiones antiguas de Excel no apoyan ENUM
    Enum LocalErrors
        lclErr_BadSheetName = 1     '// no queremos empezar con cero
        lclErr_SheetNotEmpty
    End Enum
#Else
    Const lclErr_BadSheetName As Long = 1         '// no queremos empezar con cero
    Const lclErr_SheetNotEmpty As Long = 2
#End If
 
Sub oof()
    Dim booPasted As Boolean, strTargSheet As String
 
    booPasted = False
 
    On Error GoTo ErrorHandler
 
    Do
InicioDelBucle:
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨
        strTargSheet = InputBox("Nombre del mes a transferir?[Solo 3 letras]", "Selecciona Hoja")
        If strTargSheet = vbNullString Then Exit Sub
        If Not fnSheetExists(strTargSheet) Then
            Err.Raise lclErr_BadSheetName + vbObjectError
        End If
        If Not fnSheetIsEmpty(strTargSheet) Then
            Err.Raise lclErr_SheetNotEmpty + vbObjectError
        End If
 
        Sheets("Trabajo").Cells.Copy Sheets(strTargSheet).Range("A1")
 
        '// otras cosillas
 
        booPasted = True
 
    Loop Until booPasted
    '// ¿más cosas?
Exit Sub
 
ErrorHandler:
'¨¨¨¨¨¨¨¨¨¨¨
    '// use vbObjectError como "cero" para sus propios errores
 
    Select Case Err.Number - vbObjectError
 
        Case lclErr_BadSheetName
 
            If vbOK = MsgBox("Hoja " & strTargSheet & " no existe." & _
                                  vbCr & vbCr & "Seleccione OK para tratar de nuevo" & _
                                  vbCr & vbCr & "O CANCEL para cancelar", vbExclamation + vbOKCancel, _
                                  "No se encuentra") Then Resume InicioDelBucle
 
        Case lclErr_SheetNotEmpty
 
            If vbOK = MsgBox("Hoja " & strTargSheet & " no está vacia." & _
                                  vbCr & vbCr & "Seleccione OK para tratar de nuevo" & _
                                  vbCr & vbCr & "O CANCEL para cancelar", vbExclamation + vbOKCancel, _
                                  "Hoja Ocupada") Then Resume InicioDelBucle
        Case Else
 
            MsgBox "Error generado." & vbCr & "Númuero: " & Err.Number & _
                   vbCr & Err.Description
 
        End Select
End Sub
 
Private Function fnSheetExists(ByVal strSheetName As String) As Boolean
    Dim wsX As Worksheet
    On Error Resume Next
    Set wsX = Worksheets(strSheetName)
    Let fnSheetExists = (Err.Number = 0)
    Err.Clear
End Function
 
Private Function fnSheetIsEmpty(ByVal strSheetName As String) As Boolean
    Dim wsX As Worksheet
    Set wsX = Worksheets(strSheetName)
    If wsX.UsedRange.Address = "$A$1" _
    And IsEmpty(wsX.Range("A1")) Then
        fnSheetIsEmpty = True
    Else
        fnSheetIsEmpty = False
    End If
End Function
```


----------



## Greg Truby (Mar 28, 2008)

yra_vj

Perdone tanta demora en responder pero ha estado demasiado ocupado en el trabajo y querría mejorar varias cosas que vi en su post y después dar comentarios... Ya estoy en casa viendo mi equipo de basquet (Kansas) jugar en el torneo de baloncesto universitario y entreteniendome en los anuncios con MrExcel. 

En vez de colocar pruebas como si una hoja existe o si una hoja está vacia dentro de la rutina principal es mejor mover estas actividades a funciones designadas para eso. Realmente la forma todavía mejor es tener un modulo separado con todas las funciones generales como esas. Así usted puede importar tal modulo a varios proyectos.

Segundo paso es como manejar resultados no deseados. La forma que brinda más control es usar errores y tener una sección dedicada a manejo de errores. Lea el archivo de ayuda sobre err.raise para una discusión sobre el uso de *vbObjectError* como "cero".

En vez de usar 1, 2, 3, ... como número de errores, se hace más fácil comprender el error si definimos constantes con nombres que nos brinda una explicación con solo ver el nombre. Con Excel 2000 (creo) y adelante se puede usar ENUM para eso. Pero para versiones más viejas ENUM no existe. Hay un _constante de compilación_ *VBA6* que se puede examinar ANTES de compilar para ver si estará. El comando #IF...#ELSE...#END IF no son un IF normal sino un IF de _compilación condicional._ (Generalmente se usa con #CONST.)

Para copiar y pegar no es necesario seleccionar la hoja. Usted verá q este código no activa ni la fuente ni la en blanco.


----------



## yra_vj (Apr 2, 2008)

Ante todo muchas gracias por la atencion al responder mi  pregunta, en verdad me orienta mucho los consejos brindados,siempre se aprende algo nuevo cada dia y en este foro es totalmente comprobable, estoy en la fase de entender el codigo para aplicarlo,pero  de verdad muchas gracias por la ayuda brindada.


----------

