Saltar al contenido

AimKeys (Enviar combinacion de teclas directamente al buffer del teclado)


verzulsan

Recommended Posts

publicado

(NUEVO) AimKeys (Enviar combinacion de teclas directamente al buffer del teclado)

Mi aporte no es la API (mas info de la API al final del post), sino la función AimKeys, que no es más que un gestor de combos de teclas muy sencillo de usar. Usa la misma sintaxis que AIM Keys, All-in-One Macro Utility, el cual llevo años usando y quizás por esto me resulte coherente usar dicha sintaxis.

En la demo, cuyo código pongo debajo de este párrafo, encontrareis algunos ejemplos de uso, es bastante intuitivo pero si tenéis alguna duda puedo poner más ejemplos.

Sub AbrirNotepad()
AimKeys "<winr>r<winr><wx>(200)notepad<enter><wx>(700)"
End Sub

Sub AbrirCalculadora()
AimKeys "<winr>r<winr><wx>(200)calc<enter><wx>(700)"
End Sub

Sub DemoAyudaExcel()
MsgBox "No toques nada hasta que finalize la demo, gracias"
AbrirNotepad
AimKeys "<shift>e<shift>sto es una prueba de escritura<enter>"
AimKeys "<wx>(1300)" 'espera 1.3 segundos
AimKeys "<shift>n<shift>o toques ni el teclado ni el raton hasta que finalize la demo<np>(.)"
For i = 1 To 5
AimKeys "<wx>(500)<np>(.)" 'Espera y escribe un punto del teclado numerico
Next i
AimKeys "<enter><enter>"
AimKeys "<shift>v<shift>oy a escribir del 0 al 9 en dos notepad distintos<enter><enter><wx>(2000)"
AbrirNotepad
For i = 0 To 9
AimKeys "<alt><tab><alt><wx>(333)" & i
Next
AimKeys "<enter><enter><wx>(1000)"
AimKeys "<shift>y<shift>a por ultimo, haremos una sencilla operacion en la calculadora: 5<np>(.)3<np>(+)4<np>(.)7<wx>(2500)"
AbrirCalculadora
AimKeys "5<np>(.)3<np>(+)4<np>(.)7<enter><wx>(1000)"
AimKeys "<alt><tab><alt><wx>(400)<enter><enter><shift>fin de la demo<shift>"
End Sub[/CODE]

Un detalle importante, al igual que el AIMKeys original, la mayoría de las teclas son del tipo (Press/Release) excepto 5 teclas (shift, alt, ctrl, Windows-R y Windows-L) que actúan como interruptor, de modo que <shift><shift> corresponde a KeyDown SHIFT y KeyUp SHIFT, mientras que <enter> haría KeyDown y KeyUp.

El resto de los comandos podéis verlos comentados en el código y en la demo. Adjunto un archivo DEMO y el código de la función AimKeys.

[CODE]'El código es más extenso de lo que podría resumirse, la intencion es que el código se ejecute con _
la mayor rapidez posible, por eso intento evitar la anidación de operaciones recursivas sacando de _
los bucles las operaciones que se repiten mas de una vez.
'Ejemplo de entrada:'"<alt><tab><alt><wx>(2000) xcv <home><shift><end><shift><wx>(3000)<ctrl>v<ctrl> xcv "
Public Sub AimKeys(Cadena As String)

Dim Caracter As String 'Caracter lector de operaciones
Dim InnerOuter As Boolean '0: Leyendo inner, 1: Leyendo outer
Dim Longitud As Long 'Largo de la cadena de entrada y del array de operaciones
Dim Inner As String, Outer As String 'Almacen de comando inner y outer
Dim ResetTag As Boolean 'Cierra la palabra
Dim Comandos() As String 'Array con cadena de comandos
Dim CommandCont As Integer 'Contador de comandos
Dim StateArray(5) As Boolean 'Estado de las teclas interruptor (KeyDown/KeyUp)
Dim asciiVar As Long 'Ascii del caracter suelto
Dim Comando As String 'Almacen temporal de comandos que se ejecutaran

'Inicializacion de variables
Longitud = Len(Cadena)
CommandCont = -1


'========= Generando array de comandos =========
For i = 1 To Longitud
Caracter = Mid(Cadena, i, 1)
If Caracter = "<" Or Caracter = ">" Then
InnerOuter = Not (InnerOuter)
If Caracter = ">" Then
CommandCont = CommandCont + 1
ReDim Preserve Comandos(CommandCont) As String
Comandos(CommandCont) = Outer
Outer = ""
End If
Else
If InnerOuter Then
'Leyendo del outer (Todo lo que esté dentro de los simbolos Menor y Mayor)
Outer = Outer & Caracter
Else
'Leyendo del inner (Todo lo que este fuera de los simbolos Menor y Mayor)
If Caracter = "(" Or Caracter = ")" Then
'Accion asignada al comando anterior
i = i + 1
Caracter = Mid(Cadena, i, 1)
Do While (Caracter <> ")")
Inner = Inner & Caracter
i = i + 1
Caracter = Mid(Cadena, i, 1)
Loop
CommandCont = CommandCont + 1
ReDim Preserve Comandos(CommandCont) As String
Comandos(CommandCont) = Inner
Inner = ""
Else
'Caracter suelto que se evalua como un comando por si solo
CommandCont = CommandCont + 1
ReDim Preserve Comandos(CommandCont) As String
Comandos(CommandCont) = Caracter
End If
End If
End If
Next i


'========= Ejecutando array de comandos =========
'Creo que lo mejor es hacer un array para manejar los Tecla Abajo de los Tecla Arriba..,.
Longitud = UBound(Comandos)
For i = 0 To Longitud
Comando = UCase(Comandos(i))
'TECLAS ESTANDAR DE UN SOLO CARACTER
If Len(Comando) = 1 Then
asciiVar = Asc(Comando)
SendKey asciiVar
Else
Select Case Comando

'COMBOS ESPECIALES
Case "WX" 'Se va a ejecutar una espera de milisegundos, se salta el siguiente comando que equivale a los milisegundos de espera
i = i + 1
Comando = Comandos(i)
Call WaitMilisec(CLng(Comando))
Case "FF" 'Teclas F, desde <FF>(1) a <FF>(24)
i = i + 1
asciiVar = CLng(Comandos(i)) + 111
SendKey asciiVar
Case "NP" 'Teclas NumPad (Teclado Numerico),
i = i + 1
Comando = Comandos(i)
If IsNumeric(Comando) Then 'Teclas desde <NP>(0) a <NP>(9)
asciiVar = CLng(Comandos(i)) + 96
SendKey asciiVar
Else
Select Case Comando
Case "*" 'Tecla <NP>(*)
SendKey 106
Case "+" 'Tecla <NP>(+)
SendKey 107
Case "-" 'Tecla <NP>(-)
SendKey 109
Case "/" 'Tecla <NP>(/)
SendKey 111
Case "." 'Tecla <NP>(.)
SendKey 110
Case Else
MsgBox "No existe tal tecla en el teclado numerico"
End Select
End If

'TECLAS INTERRUPTOR (Para agregar mas, cambiar tambien la dimension de StateArray() en la declaracion)
Case "CTRL" 'Tecla Control (Modo interruptor)
If StateArray(0) Then
KeyUp (17)
Else: KeyDown (17): End If
StateArray(0) = Not (StateArray(0))
Case "ALT" 'Tecla Alt (Modo interruptor)
If StateArray(1) Then
KeyUp (164)
Else: KeyDown (164): End If
StateArray(1) = Not (StateArray(1))
Case "SHIFT" 'Tecla Mayusculas (Modo interruptor)
If StateArray(2) Then
KeyUp (16)
Else: KeyDown (16): End If
StateArray(2) = Not (StateArray(2))
Case "WINL" 'Tecla Windows (Izquierda) (Modo interruptor)
If StateArray(3) Then
KeyUp (91)
Else: KeyDown (91): End If
StateArray(3) = Not (StateArray(3))
Case "WINR" 'Tecla Windows (Derecha) (Modo interruptor)
If StateArray(4) Then
KeyUp (92)
Else: KeyDown (92): End If
StateArray(4) = Not (StateArray(4))

'TECLAS ESPECIALES (Ordenadas por las que uso mas frecuentemente, así sale antes del Select) _
Las siguientes teclas son presionadas y liberadas, no son del tipo interruptor
Case "SPACE": SendKey 32 'Tecla Espacio
Case "LEFT": SendKey 37 'Tecla Izquierda
Case "UP": SendKey 38 'Tecla Arriba
Case "RIGHT": SendKey 39 'Tecla Derecha
Case "DOWN": SendKey 40 'Tecla Abajo
Case "ENTER": SendKey 13 'Tecla Enter
Case "ESC": SendKey 27 'Tecla Escape
Case "PRTSCR": SendKey 44 'Tecla Imprimir Pantalla
Case "BACKSPACE": SendKey 8 'Tecla Retroceso
Case "TAB": SendKey 9 'Tecla Tabulador
Case "END": SendKey 35 'Tecla Fin
Case "HOME": SendKey 36 'Tecla Inicio
Case "INS": SendKey 45 'Tecla Insertar
Case "DEL": SendKey 46 'Tecla Suprimir
Case "PGUP": SendKey 33 'Tecla RePag
Case "PGDOWN": SendKey 34 'Tecla AvPag
Case "PAUSE": SendKey 19 'Tecla Pausa (Inter)
Case "CAPS": SendKey 20 'Tecla Bloque Mayusculas
Case "NUMLOCK": SendKey 144 'Tecla (Bloq Num) Activar/Desactivar Teclado Numerico
Case "SCRLOCK": SendKey 145 'Tecla (Bloq Despl) Bloquea el desplazamiento
Case "CENTER": SendKey 12 '======================
Case "APPS": SendKey 93 '====================


Case Else
MsgBox "No se ha localizado ningun caso que corresponda con la tecla"
End Select
End If
Next i
End Sub[/CODE]

Este aporte deja obsoleto a mi antiguo aporte https://www.ayudaexcel.com/foro/ideas-aportes-64/sendkeys-enviar-combinacion-teclas-directamente-al-buffer-del-teclado-8289/, que aun que aparentemente funcionaba bien, algunas teclas especiales se quedaban cogidas y no permitia realizar combos de teclas. La API que finaliza en el comentario “Fin del modulo SendKeyss” la he tomado prestada de [VB 6][tutorial] Send Key Methods - RaGEZONE forums que si os interesa el tema, disponen de 2 métodos más de manejo de teclas.

Espero que os guste, os dejo con el archivo.

Saludos.

AIMkeys_v2.xls

publicado

Que buena esta utilidad, necesitando algo como esto estaba espero se pueda utilizar con paginas web para llenar textbox, etc. Saludos

Gracias!!!! :applause::applause::applause::applause:

publicado

Como le dijo Marylin Monroe a Einstein:

"Con su cerebro y mi cuerpo hariamos cosas maravillosas",.....jajaja

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

    • 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.
    • Hola, tal cual se plantea, solamente con macros (VBA); en todo caso, hacerlo a mano o con "CTRL + ;". Saludos.
  • 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.