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 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. |
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... |
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.
![images/RI13_12.png images/RI13_12.png](https://www.eni-training.com/download/433e0ee2-4ff0-411f-878c-00a660d4002e/images/RI13_12.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
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...
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 "D:\ENI\ejemplo.txt" For Input As NumArc
Si la numeración entre...