Palabras clave: referencias, librerias
Autor: Xavi
Extraído de: Foro MVP-Access
Antecedentes
Escenario.
Se está programando en Office 2010. Se tiene marcada la referencia a la biblioteca de Excel (14.0).
Si se manda la aplicación a un cliente que disponga de una versión superior, la aplicación automáticamente adaptará la versión de la librería a la versión superior
Si se manda la aplicación a un cliente que disponga de una versión inferior, el sistema no es capaz de adaptarse y "casca"
La solución óptima pasa por NO UTILIZAR las bibliotecas y referenciar genéricamente. Pero eso es muy engorroso si hay muchas declaraciones en la base de datos.
La solución que yo utilizo se basa en utilizar un módulo dónde se declaran las variables que se utilizaran en toda la aplicación.
El código el módulo (después la explicación):
Option Compare Database
Option Explicit
' Definimos las bibliotecas a utilizar
#Const UseObjectLibrary_XLS = True
#Const UseObjectLibrary_OLK = True
#Const UseObjectLibrary_FSO = False
#Const UseObjectLibrary_MSO = False
' ################################################## EXCEL
#If UseObjectLibrary_XLS Then
Public Const blnUseObjectLibrary_XLS As Boolean = True
Public xlsApp As Excel.Application
#Else
Public Const blnUseObjectLibrary_XLS As Boolean = False
Public xlsApp As Object
Public Const xlVeryHidden = 2
Public Const xlPrintNoComments = -4142
Public Const xlLandscape = 2
Public Const xlAutomatic = -4105
Public Const xlDownThenOver = 1
Public Const xlPrintErrorsDisplayed = 0
Public Const xlDelimited = 1
Public Const xlTextQualifierDoubleQuote = 1
Public Const xlWorkbookDefault = 51
Public Const xlOpenXMLWorkbook = 51
' Validaciones de datos
Public Const xlValidateList = 3
Public Const xlValidateDecimal = 2
Public Const xlValidAlertStop = 1
Public Const xlGreaterEqual = 7
Public Const xlBetween = 1
' Bordes
Public Const xlEdgeLeft = 7
Public Const xlEdgeTop = 8
Public Const xlEdgeBottom = 9
Public Const xlEdgeRight = 10
Public Const xlContinuous = 1
Public Const xlColorIndexAutomatic = -4105
Public Const xlHairline = 1
Public Const xlMedium = -4138
Public Const xlThick = 4
Public Const xlThin = 2
#End If
' ################################################## OUTLOOK
#If UseObjectLibrary_OLK Then
Public Const blnUseObjectLibrary_OUT As Boolean = True
Public olkApp As Outlook.Application
Public olkNs As Outlook.Namespace
Public olkFolder As Outlook.Folder
Public olkItems As Outlook.Items
Public olkRestrictedItems As Outlook.Items
Public olkMailItem As Outlook.MailItem
Public olkPrp As Outlook.UserProperty
Public olkAccount As Outlook.Account
Public olkAttach As Outlook.Attachment
#Else
Public Const blnUseObjectLibrary_OUT As Boolean = False
Public olkApp As Object
Public olkNs As Variant
Public olkFolder As Object
Public olkMail As Variant
Public olkPrp As Variant
Public olkAccount As Variant
Public olkAttach As Variant
Public Const olMailItem = 0
Public Const olMSG = 3
Public Const olByValue = 1
Public Const olByReference = 4
Public Const olFormatPlain = 1
Public Const olFormatHTML = 2
#End If
' ################################################## Microsoft Scripting Runtime
#If UseObjectLibrary_FSO Then
Public fso As Scripting.FileSystemObject
Public fsoFile As File
Public fsoDrive As Drive
#Else
Public fso As Object
Public fsoFile As Object
Public fsoDrive As Object
Public Const ForReading = 1
#End If
' ################################################## Microsoft Office x.xx
' La Object Library en los FileDialog
#If UseObjectLibrary_MSO Then
Public fDialog As Office.FileDialog
#Else
Public fDialog As Object
Public Const msoFileDialogOpen = 1
Public Const msoFileDialogSaveAs = 2
Public Const msoFileDialogFilePicker = 3
Public Const msoFileDialogFolderPicker = 4
#End If
Este código está copiado durante el periodo de desarrollo.
En mis aplicaciones, generalmente, se utilizan 4 bibliotecas adicionales: Excel, Outlook, FileSystem y Office. En alguna aplicación también se utiliza Word.
Después de las opciones vemos un primer bloque dónde se definen, como directiva, unas variables que indican si se va a utilizar o no la biblioteca. En este caso vemos que las de Excel y Outlook si mientras que FSO y Office no.
Después existen los distintos bloques IF..THEN...ELSE (también como directiva) dónde se evalúa la constante anterior para realizar las declaraciones de variables adecuadas a la utilización o no de la biblioteca.
En el bloque Excel vemos que, cuando se utiliza la biblioteca, la variable xlsApp se declara como Excel.Application mientras que, si no se utiliza, se declara como Object.
También vemos que, cuando no se utiliza la biblioteca, se declaran todas las constantes que se van a ir utilizando durante la aplicación.
En el caso de Outlook se ve más clara aun la diferencia entre declarar como Object/Variant o explicitamente.
Obviamente, las declaraciones a nivel de procedimiento desaparecen.
En definitiva se trata de ir cambiando el valor de las primeras constantes.
--> al programar: marcamos las bibliotecas y ponemos las constantes de directiva a True. Ello nos proporciona acceso a todos los métodos y constantes de la biblioteca
--> al dejar de programar: desmarcamos las bibliotecas y ponemos las constantes a False.
En ese momento conviene lanzar el depurador por si hubiéramos incluido alguna nueva constante específica de la biblioteca.