Las interacciones con Windows
Las API de Windows
1. Definición
Una API (Application Programming Interface) es una serie de funciones de sistema del sistema operativo, que se pueden llamar a partir de VBA. Estas funciones son accesibles desde los archivos DLL que hay en los directorios de sistema.
En algunos casos, el uso de API es preferible, fundamentalmente:
-
el uso de información de sistema que no se explota de manera nativa con VBA,
-
la posible mejora del rendimiento del código. VBA no es el lenguaje más rápido, pero se pueden utilizar las API desarrolladas en otros lenguajes más rápidos, para optimizar el rendimiento,
-
la optimización de la aplicación en términos de peso. El uso de API es menos costoso que el de ActiveX.
Es frecuente que el uso de las API provoque algunas reservas entre los desarrolladores, fundamentalmente por la baja calidad de la documentación disponible, la falta de información sobre la programación interna de las API, así como porque manipular las funciones del sistema es una fuente de riesgos de inestabilidad de las aplicaciones y del sistema operativo dentro del entorno informático.
2. Declaración de una API
La llamada a las funciones API en el cuerpo del programa se hace igual que para cualquier otra función o procedimiento. Sin embargo, hay una diferencia principal durante la declaración.
a. Sintaxis general
La sintaxis general de la declaración de una API es la siguiente:
[Private o Public] Declare [PtrSafe] Function o Sub Nombre Lib
"NombreLibrería"
[Alias "NombreAlias"] [([[ByVal] variable [As type] [,[ByRef] variable
[As type]]...])] [As Type]
Instrucción |
Descripción |
Private o Public |
Permite definir el ámbito de la función, como cualquier otra función o procedimiento en VBA. |
Declare |
Declare es la palabra clave obligatoria que se usa para la llamada a un procedimiento externo al programa. |
PtrSafe |
Permite declarar un API en una máquina de 64 bits; se debe omitir en una máquina de 32 bits. |
Function o Sub |
Permite definir si el recurso externo es una función o un procedimiento, como es el caso en VBA. |
Nombre |
Representa el nombre del procedimiento que se llama. Se debe respetar la norma de nomenclatura de VBA para que el nombre sea válido. |
Lib |
Lib es la palabra clave obligatoria que indica la ubicación de la librería Nombrelibrería. |
NombreLibrería |
Representa el nombre de la librería de sistema o la ubicación del archivo DLL. Debe estar entre comillas. |
Alias |
Alias es la palabra clave que sirve para introducir el NombreAlias. Esta palabra clave permite nombrar de manera diferente el procedimiento respeto a su nombre en la DLL, así como evitar el uso de nombres reservados del lenguaje VBA (Dim, As, etc.). |
As Type |
Permite determinar el tipo del valor de retorno de la función, si devuelve alguno. |
Argumentos |
Representa los posibles argumentos (nombre y tipo de dato) que se pueden proporcionar al código para que funcione. |
b. 32 o 64 bits
A partir de la versión de Office 2010, es posible instalar una versión de 64 bits en su máquina. Aunque la mayoría de las máquinas actuales son de 64 bits, todavía hay muchas aplicaciones que se ejecutan en 32 bits.
Entre los aspectos específicos relacionados...
El objeto FileSystemObject
1. Introducción
Más allá de las funciones básicas que ofrece VBA para acceder y manipular los archivos y directorios, hay un objeto muy práctico. El objeto FileSystemObject está disponible desde la librería Microsoft Scripting Runtime.
2. Jerarquía de objeto
El siguiente esquema representa la jerarquía de los principales objetos y colecciones del tipo FileSystemObject.
3. Gestión de los discos
Es posible de recorrer la colección de los discos Drives. Un disco es un objeto Scripting.Drive.
a. Propiedades del objeto Drive
Propiedad |
Descripción |
AvailableSpace |
Representa el espacio disponible en el disco, expresado en bytes. |
DriveLetter |
Representa la letra utilizada por el sistema para acceder al disco. |
DriveType |
Representa el tipo de disco (CDRom, Fixed, RamDisk, Remote, Removable o UnknownType). |
FileSystem |
Representa el tipo de sistema del disco (NTFS, FAT). |
FreeSpace |
Representa el espacio libre en el disco, expresado en bytes. |
IsReady |
Representa un valor booleano que indica si el disco está disponible (por ejemplo, presencia de una clave USB en el puerto USB frontal). |
Path |
Representa la ruta de acceso al disco (I: por ejemplo). |
RootFolder |
Representa la carpeta raíz (I:\ por ejemplo). |
SerialNumber |
Representa el número de serie del disco. |
ShareName |
Representa el nombre compartido del disco (devolverá una cadena de caracteres vacía si el disco no está compartido). |
TotalSize |
Representa el tamaño total del disco, expresado en bytes. |
VolumeName |
Representa el nombre de la unidad del disco (ejemplo DATA). |
b. Ejemplo
A continuación, se muestra un procedimiento que lista los discos disponibles, indica para cada uno su letra, espacio disponible, tipo y sistema:
Sub Lista_de_discos()
Dim FSO As New Scripting.FileSystemObject
Dim drv As Scripting.Drive
For Each drv In FSO.Drives
If drv.IsReady Then
Debug.Print drv.DriveLetter & " " & _
drv.AvailableSpace & " " & _
drv.DriveType & " " & _
drv.FileSystem
End If
Next
End Sub
4. Gestión de directorios
Es posible recorrer la colección de los directorios Folders. Un directorio es un objeto Scripting.Folder.
a. Propiedades del objeto Folder
Propiedad |
Descripción |
DateCreated |
Fecha de creación del directorio. |
DateLastAccessed |
Fecha del último acceso al directorio. |
DateLastModified |
Fecha de la última modificación del directorio. |
Drive |
Objeto Drive correspondiente a la unidad de disco en la que se encuentra el directorio. |
Files |
Colección que agrupa los archivos de la carpeta, ver la sección Gestión de archivos. |
IsRootFolder |
Representa un valor booleano que indica si el directorio es el directorio raíz de su unidad de disco. |
Name |
Nombre del directorio.... |
Los archivos de texto
Los archivos de texto están entre los elementos más manipulados en programación, ya sea para enviar o para recibir información. Por tanto, es importante tratar su manejo en esta sección. Como recordatorio, un archivo de texto es un archivo compuesto por una o varias líneas, separadas por una combinación de caracteres de retorno de carro y cambio de línea: vbCr & vbLf e incluso vbCrLf.
1. Acceso secuencial
Históricamente, el primer medio de acceder y leer un archivo en VBA es el acceso secuencial: en primer lugar, se abre el archivo con el método Open y se le asigna un número hasta su cierre.
a. Sintaxis general
La sintaxis general de apertura de un archivo es la siguiente:
Open Ubicación For Input|Output|Append As Número
El archivo se puede abrir en modo lectura, en modo escritura o en modo adición.
Para cerrar el archivo cuando se ha terminado de usar, la sintaxis general es la siguiente:
Close Número
b. Lectura
Para abrir un archivo en modo solo lectura, la sintaxis es la siguiente:
Open Ubicación For Input As Número
La variable Número no se puede utilizar varias veces mientras esté abierto el archivo al que se ha asignado dicho número. Para no tener conflicto con la numeración, la función FreeFile devuelve un valor correcto comprendido entre 1 y 255.
Dim NumArc As Integer
NumArc = FreeFile
Open "U:\ENI\ejemplo.txt" For Input As NumArc
Si la numeración entre 1 y 255 no es suficiente, queda la posibilidad de generar un número válido entre 256 y 511, gracias a la llamada a la función FreeFile con el argumento 1:
NumArc = FreeFile(1)
Una vez abierto el archivo, el método que permite leer su contenido línea a línea se llama Line Input, con la siguiente sintaxis general:
Line Input #Numero, CadenaReceptora
En el siguiente ejemplo, se muestra...