==Validar Inputbox==

yra_vj

New Member
Joined
Mar 29, 2007
Messages
18
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:

Code:
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
 
Last edited by a moderator:

Excel Facts

Show numbers in thousands?
Use a custom number format of #,##0,K. Each comma after the final 0 will divide the displayed number by another thousand
Code:
#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
 
Last edited:
Upvote 0
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.
 
Last edited:
Upvote 0
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.
 
Upvote 0

Forum statistics

Threads
1,223,978
Messages
6,175,755
Members
452,667
Latest member
vanessavalentino83

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top