Un tema bastante complejo, muy útil y bastante peligroso de usar, si no sabemos bien lo que queremos hacer.
API=Application Programming Interface - Interfaz de Programación de Aplicaciones. Así nomás no dice mucho, vamos a ampliar conceptos para conocer esta poderosísima herramienta, obviamente, disponible en VBA y sus macros.
Podemos decir que una API es un conjunto de rutinas ("código", a secas) que provee una biblioteca, una aplicación o un sistema operativo y que definen la forma de interactuar con los servicios que estos prestan. ¿Mas facil y menos coloquial? Desde VBA es factible hacer uso de todas las funciones del Sistema Operativo, desde expulsar el CD, hasta apagar la pc o borrar entradas del Registro de Windows.
¿Se entiende ahora lo de "complejo, muy útil y bastante peligroso"?
[+/-] Ver el resto / Ocultar
Desde ya que comenzaremos esta tarea con ejemplos simples y que no supongan riesgo alguno, menos aún si somos novatos en la materia. Imaginen que "manejando un poco bien" es tema, podremos insertar código que dañe la maquina de cualquiera o plantarles un hermoso virus. O quizás, sin llegar tan lejos y mal intencionados, podríamos causar un buen desastre en la pc, sin quererlo. Es un tema para manejar con cautela.
Analicemos lo siguiente: así como nosotros escribimos funciones en VBA para que Excel haga o no tal cosa, de la misma forma trabaja nuestro sistema operativo: con funciones. Bien, adivinaron, esas funciones del SO son las tan mentadas API's. Abrir una ventana, cerrar un directorio, borrar una carpeta, acceder al registro de windows, apagar o reiniciar el sistema, obtener claves, listar todas las unidades lógicas de la pc, etc, etc, etc.... todas estas acciones son API's que utiliza Windows. Y podemos hacer uso de ellas en nuestros proyectos.
Casi todas las API's de Windows se encuentran "almacenadas" en Librerías de Enlace Dinámicas... o simplemente los comunes archivos con extensión ".dll" que tantas veces hemos visto recorriendo el directorio. Estas dll contienen las funciones, las cuales pueden accederse desde otros programas; en nuestro caso, Excel.
Es mas, desde VB 6.0, por citar un programa que he utilizado mucho, diseñé mis propas dll (archivo / nuevo / proyecto / dll), las cuales guardé en algún lugar del disco y luego eran utilizadas por distintos programas de mi autoría, modularizando mi trabajo y evitándome repetir código inútilmente.
Aquí hablo exclusivamente de un Sistema Operativo, pero a mas de uno le resultará familiar, por ejemplo, las API's de Google, o sea el conjunto de librerías y funciones que nos brinda esta empresa para interactuar con sus servicios: incorporar google maps en nuestra pagina web, geolocalización, etc, etc.
Las API's de Windows se dividen en las siguientes categorías:
- Depuración y manejo de errores
- E/S de dispositivos
- Varias DLL, procesos e hilos
- Comunicación entre procesos
- Manejo de la memoria
- Monitoreo del desempeño
- Manejo de energía
- Almacenamiento
- Información del sistema
- GDI (interfaz para dispositivos gráficos) de Windows (tales como impresoras)
- Interfaz de usuario de Windows
¿ven que no exagero al afirmar que tenemos a nuestros pies a la computadora?
Dejaremos ya la teoría y nos adentraremos, un poco, en la práctica.
Como toda función, debemos respetar su sintaxis. Quizás al comienzo una API les parezca proto-chino básico... pero todo es cuestión de práctica y con el tiempo uno se acostrumbra a esa "rareza".
Ya sabemos que toda función retorna un valor. Veamos ahora una API muy muy sencilla, que nos dice si el usuario actual está o no definido como Administrador:
Private Declare Function IsNTAdmin Lib "advpack.dll" (ByVal dwReserved As Long, ByRef lpdwReserved As Long) As Long
Por partes, y sin desesperarnos:
a) Declaramos la función: Private Declare Function
b) Nombre de la función: IsNTAdmin
c) Donde se encuentra la función: Lib "advpack.dll"
d) Argumentos: ByVal dwReserved As Long, ByRef lpdwReserved As Long
e) Tipo de valor que retornará: As Long
"Desmembrado" de esta forma, nos será mas sencillo analizar lo que a primera vista nos pareció un jeroglífico. Con mas o menos cosas, así se declara una API, para luego hacer uso de ella.
Tengo un Proyecto en el cual ciertas opciones sólo pueden ser accedidas por usuarios Administradores, como por ejemplo borrar hojas, renombrar libros, etc, etc. ¿Como hago sin las API's para saber que usuario es o no Administrador? Imposible. Les dejo el código que utiliza la API arriba descripta:
Otra API interesante, y peligrosa si somos dañinos, es saber cual es la carpeta en donde se encuentra instalado nuestro Sistema Operativo. Desde allí tenderemos acceso a todos los programas, dll, directorios, etc, etc... y manejarlos. Todos tenemos "metidos" practicamente en la cabeza que C:\ es la unidad por defecto, lo que es un error, ya que nuestros usuarios pudieron haber instalado su SO en cualquier disco. Bueno, con esta API averiguaremos donde:
Tengo un Proyecto en el cual ciertas opciones sólo pueden ser accedidas por usuarios Administradores, como por ejemplo borrar hojas, renombrar libros, etc, etc. ¿Como hago sin las API's para saber que usuario es o no Administrador? Imposible. Les dejo el código que utiliza la API arriba descripta:
'noten que la API se declara fuera de la funcion o procedimiento en el cual la utilizaremos: Private Declare Function IsNTAdmin Lib "advpack.dll" ( _ ByVal dwReserved As Long, _ ByRef lpdwReserved As Long) As Long 'aqui está el Sub que llama a la API Private Sub EsAdministrador() 'defino una variable de uso interno: Dim EsAdmin As Boolean 'Recordemos que esta API nos devuelve un valor Long (entero largo), que será 1 (verdadero) 'ó 0 (falso). Con la función intrínseca de VBA CBool, me garantizo convertir ese 1 ó 0 en un 'valor booleano EsAdmin = CBool(IsNTAdmin(ByVal 0&, ByVal 0&)) 'dependiendo del resultado, aviso con un mensaje: If EsAdmin = True Then MsgBox "Ud es Administrador", vbInformation Else MsgBox "Ud no es Administrador", vbInformation End If End Sub
Otra API interesante, y peligrosa si somos dañinos, es saber cual es la carpeta en donde se encuentra instalado nuestro Sistema Operativo. Desde allí tenderemos acceso a todos los programas, dll, directorios, etc, etc... y manejarlos. Todos tenemos "metidos" practicamente en la cabeza que C:\ es la unidad por defecto, lo que es un error, ya que nuestros usuarios pudieron haber instalado su SO en cualquier disco. Bueno, con esta API averiguaremos donde:
'NO SE MAREEN CON EL NOMBRE NI ARGUMENTOS DE LAS APIS.... 'ESTUDIENLOS COMO LO EXPLIQUÉ MAS ARRIBA, PASO A PASO 'Y VERÁN QUE SON FUNCIONES COMUNES Y CORRIENTES, MAS 'ALLA DE LA SINTAXIS COMPLEJA QUE PRESENTAN: 'Función Api para obtener el directorio de windows 'Aquí verán que incorporamos el concepto de "alias". por el 'momento no le den importancia, tomenlo como un dato mas. Private Declare Function GetWindowsDirectory _ Lib "kernel32" _ Alias "GetWindowsDirectoryA" ( _ ByVal lpBuffer As String, _ ByVal nSize As Long) As Long 'Función Api para obtener el directorio de sistema ( system / system32 ) Private Declare Function GetSystemDirectory _ Lib "kernel32" _ Alias "GetSystemDirectoryA" ( _ ByVal lpBuffer As String, _ ByVal nSize As Long) As Long Private Sub Form_Load() Dim Buffer As String * 256 Dim Ret As Long ' Muestra el path del directorio de sistema Ret = GetSystemDirectory(Buffer, Len(Buffer)) MsgBox "El directorio de sistema : " & Left$(Buffer, Ret), vbInformation ' Muestra el path del directorio de Windows Ret = GetWindowsDirectory(Buffer, Len(Buffer)) MsgBox "El directorio de windows : " & Left$(Buffer, Ret), vbInformation End SubEn mi caso, los resultados son:
como les mencioné mas arriba... no siempre todo está en C:\
¿Les dejo un ejemplo para "fanfarronear" un poco con Excel? ¿Que tal si abrimos y cerramos nuestra lectora de cd/dvd mientras trabajamos, obviamente, mientras otro está mirando?
Con un poco de bondad.... ahora sé donde se alojan las dll del sistema, para hacer uso de ellas o de cualquier programa instalado, en mi caso, en el directorio F:\
Con un poco de maldad.... puedo borrar cualquier archivo de vital importancia para el correcto funcionamiento del Sistema Operativo. Si, si.. ya sé, si el archivo está en uso no puedo borrarlo..... pero con una API mato el proceso y lo borro.... ¿se entiende? ;)
Por cosas como estas debemos tener extrema precaución al abrir un archivo com Macros, observando en todo momento que provenga de una fuente muy confiable, dado que ubicando código maligno, por ejemplo, en el evento de apertura del libro (Private Sub Workbook_Open()), sería una macro automática y se ejecutaría apenas terminemos de presionar el botón "habilitar macros". Ojo.
¿Les dejo un ejemplo para "fanfarronear" un poco con Excel? ¿Que tal si abrimos y cerramos nuestra lectora de cd/dvd mientras trabajamos, obviamente, mientras otro está mirando?
Es una sola API, con distintos argumentos:
Declare Sub mciSendStringA Lib "winmm.dll" (ByVal lpstrCommand As String, _ ByVal lpstrReturnString As Any, ByVal uReturnLength As Long, _ ByVal hwndCallback As Long) Sub OpenCDTray() mciSendStringA "Set CDAudio Door Open", 0&, 0, 0 End Sub Sub CloseCDTray() mciSendStringA "Set CDAudio Door Closed", 0&, 0, 0 End Sub
Luego de esto, colocamos dos Autoformas en una hoja de cálculos y a cada una le asignamos su respectiva macro:
Como programador quiero avisarles algo: este post es extremadamente introductorio y está muy lejos de utilizar el lenguaje formal. Intenté reproducir en estas líneas un acercamiento fácil y sencillo al mundo de las API's, el cual iremos analizando mas profundamente en futuros post.
Cualquier duda... avisan.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
hola! cual es el codigo para apagar la pc., guardando el actual trabajo de excel?
ResponderEliminarFijate que en la web hay miles de ejemplos para apagar la Pc con una Api, debería levantar una entrada al respecto....que por ahora te la debo.
ResponderEliminarAntes de ejecutar esa Api, debes poner:
Activeworkbook.Save
Y listo, quedara el libro guardado antes del apagado.
Cambiando un solo argumento de la Api podrás hacer que se reinicie.