Saltar al contenido

setfocus no lo entiendo


Recommended Posts

publicado

Hola amigos.

Sinceramente llevo tiempo intentando solucionar este  problema y me da que es cuestion de concepto que algo hago mal.

Anteriormente lo consulte, pero por razones de salud no fue hasta ahora que retomé el proyecto.

Sin ir mas lejos es:

Después de validar en un if then la condicion de vacio de un textbox y por ello retornar el foco a al textbox (txt.textbox.setfocus) en cuestión, lo devuelvo para darle color con textbox. backcolor y todo, ok perfecto. Se que llego correctamente porque lo colorea pero no aparece titilando el cursor por lo que entiendo que no "está disponible"....

¿cual puede ser el motivo?...Está enable=true,  locked=false,  no se que mas revisar....ah! es el tabindex=0 y he hecho varias combinaciones el tabindex, 1, 2.....y nada que lo consigo. 

Lógicamente al activarse el userform y pasar por la subrutina en la que esta la validación, sí se ubica correctamente pero como dije antes al validar y redirigirlo con setfocus pasa lo que comento.

Gracias de verdad por la ayuda que me puedan dar. Creo haber leído todo lo que hay sobre setfocus pero no lo relaciono con mi problema.

José

publicado

@JDG , sube tu archivo, porque lo que explicas no tiene sentido. Quizás alguna incongruencia o algo mal escrito. Además todas esas propiedades que has cambiado no tienen nada que ver con el tema del SetFocus.

publicado

Gracias por responder.

 

corto y pego el código espero se entienda. Intente explicar con anotaciones todo.

Gracias de antemano.

-----

Option Explicit
''
''' VARIABLES
''__________________________

Dim contador As Integer
Dim MyRange As Range
Dim Resp As Byte
Dim f As Integer
Dim OpMod As String
Dim Newcont As Integer

''
'''INITIALIZE
''_____________________________

Private Sub UserForm_Initialize()

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    txt_BusFecha.TabStop = False
    txt_busId.TabStop = True
    
    Call OultarTítulo(Me)

    'para que al iniciar el form lo haga con la opcion CONSULTA como predeterminada ademas del
    'titulo CONSULTA y el boton Reemplazar oculto, además de estar protegida la informacion

    InterfaceCon

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True


End Sub

''
''' BUSCAR REGISTRO
'' ______________________

Private Sub Cmd_Buscar_click()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim FILA, FINAL, I As Integer

Call OultarTítulo(Me)

'para que al iniciar el form lo haga con la opcion CONSULTA como predeterminada ademas del
'titulo CONSULTA y el boton Reemplazar oculto, además de estar protegida la informacion
    
InterfaceCon

'EMPIEZA LA BUSQUEDA

    If txt_busId = Empty Then
        MsgBox "DEBE INGRESAR EL ID DE OPERACION PARA REALIZAR LA BUSQUEDA", vbExclamation
        txt_busId.BackColor = &H8080FF 'da color al fondo del txt
        txt_busId.SetFocus
 
 
        Exit Sub 'sale de la subrutina para volver a consultar
    End If
    
    'Continúa ya que no está vacio
    If txt_busId < Chr(48) Or txt_busId > Chr(57) Then
        MsgBox "EL ID DEBE SER NUMERO", vbExclamation
        txt_busId = Empty
        txt_busId.BackColor = &H8080FF 'da color al fondo del txt
        txt_busId.SetFocus
        Exit Sub 'sale de la subrutina para volver a consultar
     End If
        'Continúa ya que es número
        
        
        'OBTENER LA FILA DE LA CELDA QUE CONTIENE EL ID
       FILA = 4
                Do While Hoja06.Cells(FILA, 4) <> Empty  '
                    FILA = FILA + 1
         Loop
        
        FINAL = FILA - 1 'el while loop nos daría la primera  fila vacia, le restamos una para obtene la ultima llena
                
                For I = 4 To FINAL     'avanza por toda las llevas
                    If txt_busId.Text = Hoja06.Cells(I, 2) Then
                    
                        txt_BusFecha.Text = Hoja06.Cells(I, 4)
                        
                        txt_BusDescripcion.Text = Hoja06.Cells(I, 5)
                        txt_BusNaturaleza.Text = Hoja06.Cells(I, 6)
                        'hacer roja el campo de Naturaleza cuando sea un Débito
                            If Me.txt_BusNaturaleza = "Débito" Then
                                    Me.txt_BusNaturaleza.ForeColor = vbRed
                                    Me.txt_BusImporte.ForeColor = vbRed
                                    Else
                                        Me.txt_BusNaturaleza.ForeColor = vbBlack
                                        Me.txt_BusImporte.ForeColor = vbBlack
                            End If
                            
                        'Da formato al campo BusImporte
                        Txt_BusOperacion.Text = Hoja06.Cells(I, 7)
                        Txt_BusFondo.Text = Hoja06.Cells(I, ?
                        txt_BusImporte.Value = Hoja06.Cells(I, 9)
                        txt_BusImporte.Value = Format(Me.txt_BusImporte.Value, "#,##0.00")
                    
                        'CONFIRMACION DE EXTRACCION EN BUSQUEDA
                        'se crea un mensaje que se cierra automaticamente
                        CreateObject("wscript.shell").Popup "¡DATOS EXTRAIDOS CON ÉXITO!...", 1, "Mensaje"
                  
                        'Sale de la subrutina al ya haber extraido los campos
                        txt_busId.SetFocus
                        Exit Sub
                        
                        End If
                Next I
       
                    txt_BusFecha = Empty
                    txt_BusDescripcion = Empty
                    txt_BusNaturaleza = Empty
                    Txt_BusOperacion = Empty
                    Txt_BusFondo = Empty
                    txt_BusImporte = Empty

                 MsgBox "NO SE ENCONTRO EL DATO"
                 txt_busId = Empty
                 txt_busId.SetFocus

End Sub

'BOTON ULTIMO REGISTRO

Private Sub cmd_UltRegistro_Click()
    
    Dim RegistroAnterior As Integer
    Dim UltId As String
    Dim UltFecha As String
    Dim UltDescripcion As String
    Dim UltNaturaleza As String
    Dim UltOperacion As String
    Dim UltFondo As String
    Dim UltImporte As String
    Dim MyRange As Range
    Dim contador As Integer
    Dim Filabuscada As Integer
    Dim busco As Object
    
    Dim FILA As Integer
    Dim FINAL As Integer
    
    
    ' Calcula el ultimo numero utilizado en la BDD
    
    Set MyRange = Worksheets("BDD").Range("B4:B3003")
    contador = Application.WorksheetFunction.Max(MyRange)
    UltId = contador
    
    
    Set busco = Sheets("BDD").Range("b4:b3003").Find(UltId)
    Filabuscada = busco.Row
    
    
    UltFecha = Hoja06.Cells(Filabuscada, 4).Value
    UltDescripcion = Hoja06.Cells(Filabuscada, 5).Value
    UltNaturaleza = Hoja06.Cells(Filabuscada, 6).Value
    UltOperacion = Hoja06.Cells(Filabuscada, 7).Value
    UltFondo = Hoja06.Cells(Filabuscada, 8).Value
    UltImporte = Hoja06.Cells(Filabuscada, 9).Value
    
    
    MsgBox "ULTIMO ID        :  " + UltId _
    & Chr(13) + "FECHA              :  " + UltFecha _
    & Chr(13) + "DESCRIPCION  :  " + UltDescripcion _
    & Chr(13) + "NATURALEZA    :  " + UltNaturaleza _
    & Chr(13) + "OPERACION     :  " + UltOperacion _
    & Chr(13) + "FONDO            :  " + UltFondo _
    & Chr(13) + "IMPORTE          :  " + UltImporte, 0, "                   ULTIMO REGISTRO"
    
End Sub


''
'''  CONFIGURACIONES
''  ________________

''segun la opcion seleccionada en el optionbutton oculta
''o muestra el boton de reemplezar y cambia el titulo al userform potegiendo los campos en caso de ser consuta
'

Private Sub bt_opModNo_change()
    
    If BT_OpModSI = True Then
        InterfaceMod
        
    Else
       
        InterfaceCon
        
        
        
    End If
End Sub

''
'''  MASCARAS
'' ___________

'para colocar los guiones en las fechas automaticamente

Private Sub txt_BusFecha_change()
    'seleccionamos de acuerdo a la longitud de los datos que vamos ingresando
    Select Case Len(txt_BusFecha.Value)
    Case 2
        'si el textbox tiene 2 caracteres
        txt_BusFecha.Value = txt_BusFecha.Value & " "
    Case 5
        'si el textbox tiene 5 caracteres
        txt_BusFecha.Value = txt_BusFecha.Value & " "
    End Select
End Sub


''
''' BOTON LIMPIAR FORMULARIO
''  _______________________

Private Sub cmdLimpiarfrmBusqueda_Click()
    
    LimpiarfrmBusqueda
    
    txt_busId.SetFocus
    
    
End Sub

''
''' BOTON CERRAR FORMULARIO
''  _______________________

Private Sub cmdCerrarFrmBusqueda_Click()
    LimpiarfrmBusqueda
    Unload Me
End Sub


''
''' BOTON REEMPLAZAR
''  _______________________


Private Sub CMD_REEMPLAZAR_Click()
    
    Dim FILA, FINAL, I, MENSAJE As Integer
    
    FILA = 4
    
    'VALIDACION DE TODOS LOS CAMPOS COMPLETOS
    If txt_busId = Empty Or txt_BusFecha = Empty Or txt_BusDescripcion = Empty Or txt_BusNaturaleza = Empty Or Txt_BusOperacion = Empty Or Txt_BusFondo = Empty Or txt_BusImporte = Empty Then
        MsgBox "ES NECESARIO LLENAR TODOS LOS CAMPOS DEL FORMULARIO", vbExclamation
        txt_busId.SetFocus
        Exit Sub
    Else
        'MENSAJE PARA ELEGIR SI O NO PROCESAR LA MODIFICACION DE DATOS
        MENSAJE = MsgBox("¿ESTAS SEGURO DE MODIFICAR LOS DATOS?", vbQuestion + vbYesNo)
        If MENSAJE = vbYes Then
            'CODIGO QUE EN CUENTRA LA ULTIMA FILA OCUPADA Y SE DESPLAZA UNA FILA HACIA ABAJO ENCONTRANDO LA PRIMER FILA DESOCUPADA DESCENDIENTEMENTE
            Do While Hoja06.Cells(FILA, 2) <> Empty
                FILA = FILA + 1
            Loop
            FINAL = FILA - 1
            'CICLO QUE UBICA EL NUMERO DE txt_busId PARA PODER MODIFICAR ESA FILA
            For FILA = 4 To FINAL
                If Me.txt_busId.Text = Hoja06.Cells(FILA, 2).Value Then  'cuando es igual lo ha encontrado y continua
                    'pasa los nuevos valores a la BDD
                    Hoja06.Cells(FILA, 4).Text = Me.txt_BusFecha.Text
                    Hoja06.Cells(FILA, 5).Value = Me.txt_BusDescripcion.Text
                    Hoja06.Cells(FILA, 6).Value = Me.txt_BusNaturaleza.Text
                    Hoja06.Cells(FILA, 7).Value = Me.Txt_BusOperacion.Text
                    Hoja06.Cells(FILA, 8).Value = Me.Txt_BusFondo.Text
                    Hoja06.Cells(FILA, 9).Value = Me.txt_BusImporte.Value
                    'VACIAR LOS CAMPOS
                    txt_busId.Text = Empty
                    txt_BusFecha.Text = Empty
                    txt_BusDescripcion.Text = Empty
                    txt_BusNaturaleza.Text = Empty
                    Txt_BusOperacion.Text = Empty
                    Txt_BusFondo.Text = Empty
                    txt_BusImporte.Value = Empty
                    Exit For 'y sale del for
                End If
            Next
            MsgBox "¡DATOS MODIFICADOS CON EXITO!"
        Else
            MsgBox "INGRESO DE NUEVOS DATOS CANCELADO", vbExclamation
            Exit Sub
        End If
    End If
End Sub

 

 

publicado
Hace 10 horas, Haplox dijo:

@JDG ¿Pero de verdad crees que se puede mirar TODO ESE CÓDIGO y encontrar un fallo? Sube tu archivo para poder depurar

Ese e el userform que me da problemas

 

publicado
En 24/5/2020 at 20:50 , Antoni dijo:

Sube tu archivo con el Userform. ¿No entiendes que es imposible hacer nada sin él? ?

Gracias Antoni, pero con  tanto pensar me recordé de un comentario que una vez lei: "no puedes enviar nada a donde ya está"....

Lo que he hecho es enviarlo a otro textbox primero y luego si al que es con set focus. 

Se que es una chapuza pero me funcionó. 

Claro siempre me quedará la duda de donde es que esta el problema.

Un saludo.

 

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Hola nuevamente. Por eso la importancia de lo que mencionas tú como "ruta relativa". Tal cual comentas, y aún sin llegar a algunos detalles importantes para ayudarte, en realidad tal cual te comenté le día miércoles, pues sí podías hacer como comentabas, era cosa de obtener los Id de Windows (como tú los llamas) y la ruta de OneDrive en casa usuario y eso sí se puede obtener con VBA y luego pasarlo a PQ, pero medio que te cerraste en que "PQ no puede trabajar con rutas relativas", cosa cierta pero siempre hay formas. Si SAP puede o no guardar en OneDrive o SharePoint, pues si está mapeado en la PC ¡claro que se puede! Pero bueno, creo que si te es útil tu propia propuesta ¡avanza con eso!
    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
    • Hola nuevamente, mi duda sigue siendo la ruta, o rutas, finales que quedan, esas que llamas "relativas"; igual por si acaso pon 3 o 4 de esas, tal cual son y/o se ven en el explorador de cada PC y, de ser posible, en cualquier otro "lado" en que las veas.
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.