Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

CÓMO: Automatizar Microsoft Access desde Visual Basic .NET

Resumen
En este artículo se proporcionan ejemplos paso a paso que muestran cómo automatizar Microsoft Access desde Visual Basic .NET. Los temas y el código de ejemplo le enseñarán cómo:
  • Abrir una base de datos en Access
  • Imprimir u obtener una vista previa de un informe de Access
  • Mostrar y editar un formulario de Access
  • Evitar los cuadros de diálogo cuando abra una base de datos protegida mediante contraseña o cuando esté activada la seguridad a nivel de usuario
  • Automatizar los archivos en tiempo de ejecución de Access
Volver al principio

Automatización frente a ADO.NET

Los programadores pueden utilizar dos tecnologías diferentes para trabajar con una base de datos de Microsoft Access desde Visual Basic .NET: la automatización y los objetos de datos ActiveX de Microsoft (ADO.NET).

ADO.NET será la tecnología indicada para trabajar con objetos de datos, como, por ejemplo, tablas y consultas de una base de datos de Access. La automatización únicamente deberá utilizarse en caso de que se requieran funciones específicas de Microsoft Access, tales como imprimir u obtener una vista previa de un informe, mostrar un formulario o llamar a macros.

En este artículo se explica el procedimiento para automatizar Access, pero no se dice nada sobre ADO.NET. Para obtener información sobre ADO.NET, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
301075 HOW TO: Connect to a Database and Run a Command Using ADO.NET and Visual Basic .NET
301216 HOW TO: Populate a DataSet Object from a Database Using Visual Basic .NET
301248 HOW TO: Update a Database from a DataSet Object Using Visual Basic .NET
La automatización es una tecnología COM que permite que aplicaciones escritas en lenguajes como Visual Basic .NET puedan controlar otras aplicaciones mediante programación. Cuando se automatiza una aplicación de Microsoft Office, lo que en realidad se hace es ejecutar una instancia de ella en la memoria y, a continuación, llamar a su modelo de objetos para que realice las distintas tareas. Con Access y otras aplicaciones de Microsoft Office, prácticamente todas las acciones ejecutables manualmente desde la interfaz de usuario pueden ser realizadas también mediante programación utilizando la automatización.

Access expone esta función de programación por medio de un modelo de objetos. El modelo de objetos es una colección de clases y métodos que actúan como homólogos de los componentes lógicos de Access. Para tener acceso al modelo de objetos desde Visual Basic .NET, puede establecer una referencia del proyecto en la biblioteca de tipos, proceso que se describe en el ejemplo paso a paso de este artículo. Para obtener más información sobre este proceso o sobre la documentación del modelo de objetos para Office, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
222101 HOWTO: Find and Use Office Object Model Documentation
Volver al principio

Tareas comunes de automatización

Abrir una base de datos en Access

En la automatización de Microsoft Access, antes de poder realizar tareas útiles, como, por ejemplo, imprimir informes, será necesario abrir una base de datos. Para abrir una base de datos en la instancia de Access que esté automatizando, utilice el método OpenCurrentDatabase u OpenAccessProject del objeto Application. Sólo podrá tener abierta en Access una base de datos a la vez. Para trabajar con una base de datos distinta, puede utilizar el método CloseCurrentDatabase antes de abrirla.

También puede utilizar la función GetObject (<ruta a la base de datos>) para abrir una base de datos en una instancia de Access. Si la base de datos ya estuviera abierta en una instancia de Access, GetObject devolverá el objeto Application de esa instancia. De lo contrario, GetObject abrirá la base de datos en una instancia de Access que se esté ejecutando. Si no hubiera ninguna ejecutándose, GetObject iniciará una nueva instancia de Access y abrirá la base de datos especificada.

Cuando se utiliza la función GetObject para abrir una base de datos, no puede controlarse la instancia de Access en que se abrirá. OpenCurrentDatabase es el método ideal para abrir una base de datos porque permite especificar la instancia de Access que se desea automatizar. También permite proporcionar argumentos opcionales para controlar cómo se abre la base de datos, por ejemplo:
Dim oAccess As Access.Application' Start a new instance of Access for Automation:oAccess = New Access.ApplicationClass()' Open a database in exclusive mode:oAccess.OpenCurrentDatabase(filepath:="c:\mydb.mdb", Exclusive:=True)				
Volver al principio

Imprimir u obtener una vista previa de un informe de Access

Para imprimir u obtener la vista previa de un informe de Access, deberá llamar al método OpenReport del objeto DoCmd. Al llamar a OpenReport, uno de los argumentos determinará si el informe ha de mostrarse como vista previa en la pantalla o si ha de enviarse a la impresora:
' Preview a report named Sales:oAccess.DoCmd.OpenReport(ReportName:="Sales", _   View:=Access.AcView.acViewPreview)' Print a report named Sales:oAccess.DoCmd.OpenReport(ReportName:="Sales", _   View:=Access.AcView.acViewNormal)				
Observe que el argumento View es el que determina si el informe ha de mostrarse en Access o enviarse a la impresora. El método OpenReport tiene otros argumentos útiles, como, por ejemplo, WhereCondition. WhereCondition permite limitar el conjunto de registros del informe mediante una cláusula WHERE de SQL válida (sin la palabra WHERE).

Si lo que desea es obtener la vista previa del informe, asegúrese de establecer la propiedad Visible del objeto Application para que Access aparezca en la pantalla. De esta forma, el usuario podrá ver el informe en la ventana de Access.

Existe otra forma de imprimir informes u otros objetos de una base de datos: utilizar el método PrintOut del objeto DoCmd. En este ejemplo, se selecciona el informe Employees en la ventana Base de datos y, a continuación, se llama a PrintOut para imprimirlo. El método PrintOut permite proporcionar los argumentos correspondientes al cuadro de diálogo Imprimir de Access, como, por ejemplo: PrintRange, PageFrom, PageTo, PrintQuality, Copies o CollateCopies:
' Select the Employees report in the Database window: oAccess.DoCmd.SelectObject(ObjectType:=Access.AcObjectType.acReport, _    ObjectName:="Employees", InDatabaseWindow:=True)' Print 2 copies of the selected object: oAccess.DoCmd.PrintOut(PrintRange:=Access.AcPrintRange.acPrintAll, _    Copies:=2, CollateCopies:=False)				
En algunos casos, tal vez resulte conveniente utilizar ambos métodos (OpenReport y PrintOut) para imprimir un informe. Supongamos que desea imprimir varias copias del informe Employees, pero sólo para un empleado concreto. En el siguiente ejemplo, primero se utiliza OpenReport para abrir el informe en modo de vista previa, con el argumento WhereCondition para limitar los registros al empleado en cuestión. Tras ello, se utiliza PrintOut para imprimir varias copias del objeto activo:
' Open the report in preview mode using a WhereCondition: oAccess.DoCmd.OpenReport(ReportName:="Employees", _    View:=Access.AcView.acViewPreview, _    WhereCondition:="[EmployeeID]=1")' Print 2 copies of the active object: oAccess.DoCmd.PrintOut(PrintRange:=Access.AcPrintRange.acPrintAll, _    Copies:=2, CollateCopies:=False)' Close the report preview window: oAccess.DoCmd.Close(ObjectType:=Access.AcObjectType.acReport, _    ObjectName:="Employees")				
Access 2002 introduce el objeto Printer, que permite personalizar la configuración de la impresora de forma más sencilla que en versiones anteriores. Para obtener un ejemplo del uso del objeto Printer de Access para imprimir un informe, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
284286 ACC2002: How to Reset Changes to the Application.Printer Object
Volver al principio

Mostrar y editar un formulario de Access

Visual Basic .NET ofrece funciones muy potentes para formularios. Habrá casos, sin embargo, en que los usuarios deban ver formularios desarrollados en Access. También puede ocurrir que, en la base de datos de Access, exista un formulario que proporcione criterios para una búsqueda o un informe y que, por tanto, deba abrirse para poder imprimir u obtener la vista previa del informe. Para abrir y mostrar un formulario de Access, llame al método OpenForm del objeto DoCmd:
' Show a form named Employees:oAccess.DoCmd.OpenForm(FormName:="Employees", _   View:=Access.AcFormView.acNormal)				
Tras ello, podrá editar los controles del formulario.

Volver al principio

Cuadros de diálogo de seguridad de Access

En la automatización de Access, podría ocurrir que, al intentar abrir una base de datos, se solicite un nombre de usuario, una contraseña o ambos valores. Si el usuario introdujera algún valor equivocado, se producirá un error en el código. En ocasiones, tal vez prefiera evitar estos cuadros de diálogo y, en su lugar, proporcionar el nombre de usuario y la contraseña mediante programación para que el código de automatización se ejecute sin interrupciones.

En Microsoft Access existen dos tipos de seguridad: bases de datos protegidas mediante contraseña y seguridad a nivel de usuario mediante un archivo de grupos de trabajo (System.mdw). Al intentar abrir una base de datos protegida mediante contraseña, se recibe un cuadro de diálogo en el que se solicita la introducción de la contraseña. La seguridad a nivel de usuario actúa de forma diferente: cuando se encuentra activa, Access muestra un cuadro de diálogo de inicio de sesión que solicita tanto un nombre de usuario como una contraseña para poder abrir bases de datos en Access. Para obtener más información sobre la seguridad en Access y el archivo de información de grupos de trabajo, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

305542 ACC2002: The Role of the Workgroup Information File in Security
Volver al principio

Evitar los cuadros de diálogo de contraseña en las bases de datos

A la hora de abrir una base de datos protegida con contraseña, podrá evitar el cuadro de diálogo proporcionando la contraseña al método OpenCurrentDatabase:
' Open a password-protected database in shared mode:' Note: The bstrPassword argument is case-sensitiveoAccess.OpenCurrentDatabase(filepath:="c:\mydb.mdb", _   Exclusive:=False, bstrPassword:="MyPassword")				
El argumento bstrPassword, agregado al método OpenCurrentDatabase a partir de Access 2002, no está disponible Access 2000. Si desea evitar el cuadro de diálogo de contraseña al automatizar Access 2000 para abrir bases de datos protegidas, deberá utilizar primero el método OpenDatabase del objeto DBEngine y proporcionar la contraseña con el argumento Connect. A continuación, utilice OpenCurrentDatabase para abrir la base de datos en Access.

En el siguiente ejemplo, oAccess se ha establecido previamente en una instancia de Access y sDBPath es la ruta de la base de datos protegida mediante contraseña que se ha de abrir. El código le proporciona la contraseña a la base de datos, de modo que logra evitarse el cuadro de diálogo:
Dim sDBPassword as String        Dim oDBEngine As DAO.DBEngineDim oDB As DAO.Database        sDBPassword = "Mypassword" 'database password oDBEngine = oAccess.DBEngineoDB = oDBEngine.OpenDatabase(Name:=sDBPath, _   Options:=False, _   ReadOnly:=False, _   Connect:=";PWD=" & sDBPassword)oAccess.OpenCurrentDatabase(filepath:=sDBPath, _   Exclusive:=False)oDB.Close()System.Runtime.InteropServices.Marshal.ReleaseComObject(oDB)oDB = NothingSystem.Runtime.InteropServices.Marshal.ReleaseComObject(oDBEngine)oDBEngine = Nothing				
oDB.Close no cierra realmente la base de datos en Access, sino que tan sólo cierra la conexión DAO a la base de datos, realizada por medio del objeto DBEngine. Esta conexión deja de ser necesaria en cuanto se utiliza el método OpenCurrentDatabase. Observe el código que libera los objetos oDB y oDBEngine. Estos objetos deberán utilizarse para que Access pueda cerrarse correctamente una vez se haya completado el código.

Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
235422 ACC2000: How to Open a Password-Protected DB Through Automation
Volver al principio

Evitar el cuadro de diálogo de inicio de sesión de la seguridad de Access

Cuando la seguridad a nivel de usuario se encuentre activa en Access, un cuadro de diálogo de inicio de sesión solicitará a los usuarios que introduzcan tanto un nombre de usuario como una contraseña. Con el modelo de objetos de Access no es posible especificar nombres de usuario o contraseñas. Por tanto, si desea evitar el cuadro de diálogo de inicio de sesión al automatizar Access, primero deberá iniciar el archivo Msaccess.exe y proporcionar los modificadores de la línea de comandos /user y /pwd para especificar el nombre de usuario y la contraseña. Tras ello, podrá utilizar GetObject para recuperar el objeto Application de la instancia de Access que se esté ejecutando y, así, seguir con la automatización. Para obtener un ejemplo de este procedimiento, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
192919 HOWTO: Automate a Secured Access Database Using Visual Basic
Para obtener más información sobre cómo iniciar Access con modificadores de la línea de comandos, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
209207 How to Use Command-Line Switches in Microsoft Access
Volver al principio

Automatizar los archivos en tiempo de ejecución de Access

Microsoft Office Developer Edition incluye las Microsoft Office Developer Tools (MOD). Las MOD permiten a los programadores de Access crear aplicaciones de Access y distribuirlas a usuarios que no tengan la versión comercial del programa. Cuando éstos las instalen en un equipo sin la versión comercial, se instalarán además los archivos en tiempo de ejecución de Access. Estos archivos quedarán instalados y registrados de igual forma que la versión comercial. El ejecutable también se denominará Msaccess.exe. Los archivos en tiempo de ejecución permiten ejecutar aplicaciones de Access en equipos cliente, pero no así desarrollar nuevas aplicaciones o modificar el diseño de aplicaciones ya existentes.

Los archivos en tiempo de ejecución de Access deberán iniciarse con una base de datos. Debido a este requisito, si desea automatizarlos, deberá iniciar Msaccess.exe y especificar la base de datos que se ha de abrir. Sólo después de utilizar GetObject para recuperar el objeto Application, podrá seguir automatizando los archivos en tiempo de ejecución de Access. Si intentara automatizarlos con la palabra clave New o con CreateObject, recibirá un mensaje de error como el siguiente al inicializar la instancia:
-2147023186 No se ha encontrado el identificador único universal (UUID) de objeto.
Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
295179 ACC2002: Can't Use OLE Automation with Access Runtime
Volver al principio

Crear el proyecto de ejemplo completo de Visual Basic .NET

Antes de utilizar el siguiente ejemplo paso a paso, compruebe que tiene instalada la base de datos de ejemplo Neptuno.
NOTA
De manera predeterminada, Access 2002 instalará las bases de datos de ejemplo en la siguiente ubicación: C:\Archivos de programa\Microsoft Office\Office10\Ejemplos. Con Access 2002, podrá comprobar que la base de datos de ejemplo Neptuno se encuentra instalada. En el menú Ayuda, seleccione Bases de datos de ejemplo y, a continuación, haga clic en Base de datos de ejemplo Neptuno.
  1. Cierre cualquier instancia de Access que se esté ejecutando.
  2. Inicie Microsoft Visual Studio .NET. En el menú Archivo, haga clic en Nuevo y, después, en Proyecto. Seleccione Aplicación para Windows en los tipos de proyectos de Visual Basic. De forma predeterminada, se crea Form1.
  3. Agregue una referencia a la Biblioteca de objetos de Microsoft Access. Para ello, siga estos pasos:
    1. En el menú Proyecto, haga clic en Agregar referencia.
    2. En la ficha COM, busque Biblioteca de objetos de Microsoft Access 10.0 y, a continuación, haga clic en Seleccionar.NOTA
      Si aún no lo ha hecho, le recomendamos que descargue e instale Microsoft Office XP Primary Interop Assemblies (PIA). Para obtener información adicional acerca de Office XP PIA, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
      328912 INFO: Microsoft Office XP PIAs Are Available for Download
    3. Haga clic en Aceptar en el cuadro de diálogo Agregar referencia para aceptar sus selecciones. Si recibe un mensaje para generar contenedores para las bibliotecas seleccionadas, haga clic en .

      NOTA
      Si, haciendo referencia a la Biblioteca de objetos de Access 10.0, recibiera mensajes de error al intentar agregar las referencias, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
      317157 PRB: Errors When Referencing the Access 10.0 Type Library
  4. En el menú Ver, seleccione Cuadro de herramientas para mostrar el cuadro de herramientas.
  5. Agregue cinco controles de botón de opción y un control de botón a Form1.
  6. Seleccione todos los controles de botón de opción y, a continuación, establezca la propiedad Size en 150,24.
  7. En el menú Ver, haga clic en Código.
  8. Inserte el siguiente código en la clase Form:
    Private m_sAction As StringPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _    Handles MyBase.Load    RadioButton1.Text = "Print report"    RadioButton2.Text = "Preview report"     RadioButton3.Text = "Show form"     RadioButton4.Text = "Print report (Security)"     RadioButton5.Text = "Preview report (Runtime)"     Button1.Text = "Go!"End SubPrivate Sub RadioButtons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _    Handles RadioButton1.Click, RadioButton2.Click, RadioButton3.Click, RadioButton4.Click, RadioButton5.Click    m_sAction = sender.Text 'Store the text for the selected radio buttonEnd SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _    Handles Button1.Click    ' Calls the associated procedure to automate Access, based    ' on the selected radio button on the form.    Select Case m_sAction        Case "Print report" : Print_Report()        Case "Preview report" : Preview_Report()        Case "Show form" : Show_Form()        Case "Print report (Security)" : Print_Report_Security()        Case "Preview report (Runtime)" : Preview_Report_Runtime()    End SelectEnd SubPrivate Function ShellGetDB(ByVal sDBPath As String, _    Optional ByVal sCmdLine As String = vbNullString, _    Optional ByVal enuWindowStyle As Microsoft.VisualBasic.AppWinStyle _        = AppWinStyle.MinimizedFocus, _    Optional ByVal iSleepTime As Integer = 1000) As Access.Application    'Launches a new instance of Access with a database (sDBPath)    'using the Shell function then returns the Application object    'via calling: GetObject(sDBPath). Returns the Application    'object of the new instance of Access, assuming that sDBPath    'is not already opened in another instance of Access. To ensure    'the Application object of the new instance is returned, make    'sure sDBPath is not already opened in another instance of Access.    '    'Example:    'Dim oAccess As Access.Application    'oAccess = ShellGetDB("c:\mydb.mdb")    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oAccess As Access.Application    Dim sAccPath As String 'path to msaccess.exe    ' Obtain the path to msaccess.exe:    sAccPath = GetOfficeAppPath("Access.Application", "msaccess.exe")    If sAccPath = "" Then        MsgBox("Can't determine path to msaccess.exe", _            MsgBoxStyle.MsgBoxSetForeground)        Return Nothing    End If    ' Make sure specified database (sDBPath) exists:    If Not System.IO.File.Exists(sDBPath) Then        MsgBox("Can't find the file '" & sDBPath & "'", _            MsgBoxStyle.MsgBoxSetForeground)        Return Nothing    End If    ' Start a new instance of Access using sDBPath and sCmdLine:    If sCmdLine = vbNullString Then        sCmdLine = Chr(34) & sDBPath & Chr(34)    Else        sCmdLine = Chr(34) & sDBPath & Chr(34) & " " & sCmdLine    End If    Shell(Pathname:=sAccPath & " " & sCmdLine, _        Style:=enuWindowStyle)    'Note: It is advised that the Style argument of the Shell    'function be used to give focus to Access.    ' Move focus back to this form. This ensures that Access    ' registers itself in the ROT, allowing GetObject to find it:    AppActivate(Title:=Me.Text)    ' Pause to allow database to open:    System.Threading.Thread.Sleep(iSleepTime)    ' Obtain Application object of the instance of Access    ' that has the database open:    oAccess = GetObject(sDBPath)    Return oAccessErrorCleanup:    ' Try to quit Access due to an unexpected error:    On Error Resume Next    oAccess.Quit(Option:=Access.AcQuitOption.acQuitSaveNone)    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Return NothingErrorHandler:    MsgBox(Err.Number & ": " & Err.Description, _        MsgBoxStyle.MsgBoxSetForeground, "Error Handler")    Resume ErrorCleanupEnd FunctionPrivate Function ShellGetApp(Optional ByVal sCmdLine As String = vbNullString, _    Optional ByVal enuWindowStyle As Microsoft.VisualBasic.AppWinStyle _        = AppWinStyle.MinimizedFocus) As Access.Application    'Launches a new instance of Access using the Shell function    'then returns the Application object via calling:    'GetObject(,"Access.Application"). If an instance of    'Access is already running before calling this procedure,    'the function may return the Application object of a    'previously running instance of Access. If this is not    'desired, then make sure Access is not running before    'calling this function, or use the ShellGetDB()    'function instead. Approach based on Q308409.    '    'Examples:    'Dim oAccess As Access.Application    'oAccess = ShellGetApp()    '    '-or-    '    'Dim oAccess As Access.Application    'Dim sUser As String    'Dim sPwd As String    'sUser = "Admin"    'sPwd = ""    'oAccess = ShellGetApp("/user " & sUser & "/pwd " & sPwd)    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oAccess As Access.Application    Dim sAccPath As String 'path to msaccess.exe    Dim iSection As Integer = 0    Dim iTries As Integer = 0    ' Obtain the path to msaccess.exe:    sAccPath = GetOfficeAppPath("Access.Application", "msaccess.exe")    If sAccPath = "" Then        MsgBox("Can't determine path to msaccess.exe", _            MsgBoxStyle.MsgBoxSetForeground)        Return Nothing    End If    ' Start a new instance of Access using sCmdLine:    If sCmdLine = vbNullString Then        sCmdLine = sAccPath    Else        sCmdLine = sAccPath & " " & sCmdLine    End If    Shell(Pathname:=sCmdLine, Style:=enuWindowStyle)    'Note: It is advised that the Style argument of the Shell    'function be used to give focus to Access.    ' Move focus back to this form. This ensures that Access    ' registers itself in the ROT, allowing GetObject to find it:    AppActivate(Title:=Me.Text)    ' Attempt to use GetObject to reference a running    ' instance of Access:    iSection = 1 'attempting GetObject...    oAccess = GetObject(, "Access.Application")    iSection = 0 'resume normal error handling    Return oAccessErrorCleanup:    ' Try to quit Access due to an unexpected error:    On Error Resume Next    oAccess.Quit(Option:=Access.AcQuitOption.acQuitSaveNone)    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Return NothingErrorHandler:    If iSection = 1 Then 'GetObject may have failed because the        'Shell function is asynchronous; enough time has not elapsed        'for GetObject to find the running Office application. Wait        '1/2 seconds and retry the GetObject. If you try 20 times        'and GetObject still fails, assume some other reason        'for GetObject failing and exit the procedure.        iTries = iTries + 1        If iTries < 20 Then            System.Threading.Thread.Sleep(500) 'wait 1/2 seconds            AppActivate(Title:=Me.Text)            Resume 'resume code at the GetObject line        Else            MsgBox("GetObject failed. Process ended.", _                MsgBoxStyle.MsgBoxSetForeground)        End If    Else 'iSection = 0 so use normal error handling:        MsgBox(Err.Number & ": " & Err.Description, _            MsgBoxStyle.MsgBoxSetForeground, "Error Handler")    End If    Resume ErrorCleanupEnd FunctionPrivate Function GetOfficeAppPath(ByVal sProgId As String, ByVal sEXE As String) As String    'Returns path of the Office application. e.g.    'GetOfficeAppPath("Access.Application", "msaccess.exe") returns    'full path to Microsoft Access. Approach based on Q240794.    'Returns empty string if path not found in registry.    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oReg As Microsoft.Win32.RegistryKey = _        Microsoft.Win32.Registry.LocalMachine    Dim oKey As Microsoft.Win32.RegistryKey    Dim sCLSID As String    Dim sPath As String    Dim iPos As Integer    ' First, get the clsid from the progid from the registry key    ' HKEY_LOCAL_MACHINE\Software\Classes\<PROGID>\CLSID:    oKey = oReg.OpenSubKey("Software\Classes\" & sProgId & "\CLSID")    sCLSID = oKey.GetValue("")    oKey.Close()    ' Now that we have the CLSID, locate the server path at    ' HKEY_LOCAL_MACHINE\Software\Classes\CLSID\     ' {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx}\LocalServer32:    oKey = oReg.OpenSubKey("Software\Classes\CLSID\" & sCLSID & "\LocalServer32")    sPath = oKey.GetValue("")    oKey.Close()    ' Remove any characters beyond the exe name:    iPos = InStr(1, sPath, sEXE, CompareMethod.Text)    sPath = Microsoft.VisualBasic.Left(sPath, iPos + Len(sEXE) - 1)    Return Trim(sPath)ErrorHandler:    Return ""End FunctionPrivate Sub Print_Report()    'Prints the "Summary of Sales by Year" report in Northwind.mdb.    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oAccess As Access.Application    Dim sDBPath As String 'path to Northwind.mdb    Dim sReport As String 'name of report to print    sReport = "Summary of Sales by Year"    ' Start a new instance of Access for Automation:    oAccess = New Access.ApplicationClass()    ' Determine the path to Northwind.mdb:    sDBPath = oAccess.SysCmd(Action:=Access.AcSysCmdAction.acSysCmdAccessDir)    sDBPath = sDBPath & "Samples\Northwind.mdb"    ' Open Northwind.mdb in shared mode:    oAccess.OpenCurrentDatabase(filepath:=sDBPath, Exclusive:=False)    ' Select the report name in the database window and give focus    ' to the database window:    oAccess.DoCmd.SelectObject(ObjectType:=Access.AcObjectType.acReport, _        ObjectName:=sReport, InDatabaseWindow:=True)    ' Print the report:    oAccess.DoCmd.OpenReport(ReportName:=sReport, _        View:=Access.AcView.acViewNormal)Cleanup:    ' Quit Access and release object:    On Error Resume Next    oAccess.Quit(Option:=Access.AcQuitOption.acQuitSaveNone)    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorHandler:    MsgBox(Err.Number & ": " & Err.Description, _        MsgBoxStyle.MsgBoxSetForeground, "Error Handler")    ' Try to quit Access due to an unexpected error:    Resume CleanupEnd SubPrivate Sub Preview_Report()    'Previews the "Summary of Sales by Year" report in Northwind.mdb.    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oAccess As Access.Application    Dim oForm As Access.Form    Dim sDBPath As String 'path to Northwind.mdb    Dim sReport As String 'name of report to preview    sReport = "Summary of Sales by Year"    ' Start a new instance of Access for Automation:    oAccess = New Access.ApplicationClass()    ' Make sure Access is visible:    If Not oAccess.Visible Then oAccess.Visible = True    ' Determine the path to Northwind.mdb:    sDBPath = oAccess.SysCmd(Action:=Access.AcSysCmdAction.acSysCmdAccessDir)    sDBPath = sDBPath & "Samples\Northwind.mdb"    ' Open Northwind.mdb in shared mode:    oAccess.OpenCurrentDatabase(filepath:=sDBPath, Exclusive:=False)    ' Close any forms that Northwind may have opened:    For Each oForm In oAccess.Forms        oAccess.DoCmd.Close(ObjectType:=Access.AcObjectType.acForm, _            ObjectName:=oForm.Name, _            Save:=Access.AcCloseSave.acSaveNo)    Next    If Not oForm Is Nothing Then        System.Runtime.InteropServices.Marshal.ReleaseComObject(oForm)    End If    oForm = Nothing    ' Select the report name in the database window and give focus    ' to the database window:    oAccess.DoCmd.SelectObject(ObjectType:=Access.AcObjectType.acReport, _        ObjectName:=sReport, InDatabaseWindow:=True)    ' Maximize the Access window:    oAccess.RunCommand(Command:=Access.AcCommand.acCmdAppMaximize)    ' Preview the report:    oAccess.DoCmd.OpenReport(ReportName:=sReport, _        View:=Access.AcView.acViewPreview)    ' Maximize the report window:    oAccess.DoCmd.Maximize()    ' Hide Access menu bar:    oAccess.CommandBars("Menu Bar").Enabled = False    ' Hide Report's Print Preview menu bar:    oAccess.CommandBars("Print Preview").Enabled = False    ' Hide Report's right-click popup menu:    oAccess.CommandBars("Print Preview Popup").Enabled = False    ' Release Application object and allow Access to be closed by user:    If Not oAccess.UserControl Then oAccess.UserControl = True    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorCleanup:    ' Try to quit Access due to an unexpected error:    On Error Resume Next    System.Runtime.InteropServices.Marshal.ReleaseComObject(oForm)    oForm = Nothing    oAccess.Quit(Option:=Access.AcQuitOption.acQuitSaveNone)    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorHandler:    MsgBox(Err.Number & ": " & Err.Description, _        MsgBoxStyle.MsgBoxSetForeground, "Error Handler")    Resume ErrorCleanupEnd SubPrivate Sub Show_Form()    'Shows the "Customer Labels Dialog" form in Northwind.mdb    'and manipulates controls on the form.    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oAccess As Access.Application    Dim oForm As Access.Form    Dim oCtls As Access.Controls    Dim oCtl As Access.Control    Dim sDBPath As String 'path to Northwind.mdb    Dim sForm As String 'name of form to show    sForm = "Customer Labels Dialog"    ' Start a new instance of Access for Automation:    oAccess = New Access.ApplicationClass()    ' Make sure Access is visible:    If Not oAccess.Visible Then oAccess.Visible = True    ' Determine the path to Northwind.mdb:    sDBPath = oAccess.SysCmd(Action:=Access.AcSysCmdAction.acSysCmdAccessDir)    sDBPath = sDBPath & "Samples\Northwind.mdb"    ' Open Northwind.mdb in shared mode:    oAccess.OpenCurrentDatabase(filepath:=sDBPath, Exclusive:=False)    ' Close any forms that Northwind may have opened:    For Each oForm In oAccess.Forms        oAccess.DoCmd.Close(ObjectType:=Access.AcObjectType.acForm, _            ObjectName:=oForm.Name, _            Save:=Access.AcCloseSave.acSaveNo)    Next    If Not oForm Is Nothing Then        System.Runtime.InteropServices.Marshal.ReleaseComObject(oForm)    End If    oForm = Nothing    ' Select the form name in the database window and give focus    ' to the database window:    oAccess.DoCmd.SelectObject(ObjectType:=Access.AcObjectType.acForm, _        ObjectName:=sForm, InDatabaseWindow:=True)    ' Show the form:    oAccess.DoCmd.OpenForm(FormName:=sForm, _        View:=Access.AcFormView.acNormal)    ' Use Controls collection to edit the form:    oForm = oAccess.Forms(sForm)    oCtls = oForm.Controls    ' Set PrintLabelsFor option group to Specific Country:    oCtl = oCtls.Item("PrintLabelsFor")    oCtl.Value = 2 'second option in option group    System.Runtime.InteropServices.Marshal.ReleaseComObject(oCtl)    oCtl = Nothing    ' Put USA in the SelectCountry combo box:    oCtl = oCtls.Item("SelectCountry")    oCtl.Enabled = True    oCtl.SetFocus()    oCtl.Value = "USA"    System.Runtime.InteropServices.Marshal.ReleaseComObject(oCtl)    oCtl = Nothing    ' Hide the Database Window:    oAccess.DoCmd.SelectObject(ObjectType:=Access.AcObjectType.acForm, _        ObjectName:=sForm, InDatabaseWindow:=True)    oAccess.RunCommand(Command:=Access.AcCommand.acCmdWindowHide)    ' Set focus back to the form:    oForm.SetFocus()    ' Release Controls and Form objects:    System.Runtime.InteropServices.Marshal.ReleaseComObject(oCtls)    oCtls = Nothing    System.Runtime.InteropServices.Marshal.ReleaseComObject(oForm)    oForm = Nothing    ' Release Application object and allow Access to be closed by user:    If Not oAccess.UserControl Then oAccess.UserControl = True    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorCleanup:    ' Try to quit Access due to an unexpected error:    On Error Resume Next    System.Runtime.InteropServices.Marshal.ReleaseComObject(oCtl)    oCtl = Nothing    System.Runtime.InteropServices.Marshal.ReleaseComObject(oCtls)    oCtls = Nothing    System.Runtime.InteropServices.Marshal.ReleaseComObject(oForm)    oForm = Nothing    oAccess.Quit(Option:=Access.AcQuitOption.acQuitSaveNone)    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorHandler:    MsgBox(Err.Number & ": " & Err.Description, _        MsgBoxStyle.MsgBoxSetForeground, "Error Handler")    Resume ErrorCleanupEnd SubPrivate Sub Print_Report_Security()    'Shows how to automate Access when user-level    'security is enabled and you wish to avoid the Logon    'dialog asking for user name and password. In this     'example we're assuming default security so we simply    'pass the Admin user with a blank password to print the     '"Summary of Sales by Year" report in Northwind.mdb.    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oAccess As Access.Application    Dim sDBPath As String 'path to Northwind.mdb    Dim sUser As String 'user name for Access security    Dim sPwd As String 'user password for Access security    Dim sReport As String 'name of report to print    sReport = "Summary of Sales by Year"    ' Determine the path to Northwind.mdb:    sDBPath = GetOfficeAppPath("Access.Application", "msaccess.exe")    If sDBPath = "" Then        MsgBox("Can't determine path to msaccess.exe", _            MsgBoxStyle.MsgBoxSetForeground)        Exit Sub    End If    sDBPath = Microsoft.VisualBasic.Left(sDBPath, _        Len(sDBPath) - Len("msaccess.exe")) & "Samples\Northwind.mdb"    If Not System.IO.File.Exists(sDBPath) Then        MsgBox("Can't find the file '" & sDBPath & "'", _            MsgBoxStyle.MsgBoxSetForeground)        Exit Sub    End If    ' Specify the user name and password for the Access workgroup    ' information file, which is used to implement Access user-level security.    ' The file by default is named System.mdw and can be specified    ' using the /wrkgrp command-line switch. This example assumes    ' default security and therefore does not specify a workgroup    ' information file and uses Admin with no password:    sUser = "Admin"    sPwd = ""    ' Start a new instance of Access with user name and password:    oAccess = ShellGetDB(sDBPath, "/user " & sUser & " /pwd " & sPwd)    'or    'oAccess = ShellGetApp(Chr(34) & sDBPath & Chr(34) & " /user " & sUser & " /pwd " & sPwd)    ' Select the report name in the database window and give focus    ' to the database window:    oAccess.DoCmd.SelectObject(ObjectType:=Access.AcObjectType.acReport, _        ObjectName:=sReport, InDatabaseWindow:=True)    ' Print the report:    oAccess.DoCmd.OpenReport(ReportName:=sReport, _        View:=Access.AcView.acViewNormal)Cleanup:    ' Quit Access and release object:    On Error Resume Next    oAccess.Quit(Option:=Access.AcQuitOption.acQuitSaveNone)    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorHandler:    MsgBox(Err.Number & ": " & Err.Description, _        MsgBoxStyle.MsgBoxSetForeground, "Error Handler")    ' Try to quit Access due to an unexpected error:    Resume CleanupEnd SubPrivate Sub Preview_Report_Runtime()    'Shows how to automate the Access Runtime to preview    'the "Summary of Sales by Year" report in Northwind.mdb.    ' Enable an error handler for this procedure:    On Error GoTo ErrorHandler    Dim oAccess As Access.Application    Dim oForm As Access.Form    Dim sDBPath As String 'path to Northwind.mdb    Dim sReport As String 'name of report to preview    sReport = "Summary of Sales by Year"    ' Determine the path to Northwind.mdb:    sDBPath = GetOfficeAppPath("Access.Application", "msaccess.exe")    If sDBPath = "" Then        MsgBox("Can't determine path to msaccess.exe", _            MsgBoxStyle.MsgBoxSetForeground)        Exit Sub    End If    sDBPath = Microsoft.VisualBasic.Left(sDBPath, _        Len(sDBPath) - Len("msaccess.exe")) & "Samples\Northwind.mdb"    If Not System.IO.File.Exists(sDBPath) Then        MsgBox("Can't find the file '" & sDBPath & "'", _            MsgBoxStyle.MsgBoxSetForeground)        Exit Sub    End If    ' Start a new instance of Access. If the retail    ' version of Access is not installed, and only the    ' Access Runtime is installed, launches a new instance    ' of the Access Runtime (/runtime switch is optional):    oAccess = ShellGetDB(sDBPath, "/runtime")    'or    'oAccess = ShellGetApp(Chr(34) & sDBPath & Chr(34) & " /runtime")    ' Make sure Access is visible:    If Not oAccess.Visible Then oAccess.Visible = True    ' Close any forms that Northwind may have opened:    For Each oForm In oAccess.Forms        oAccess.DoCmd.Close(ObjectType:=Access.AcObjectType.acForm, _            ObjectName:=oForm.Name, _            Save:=Access.AcCloseSave.acSaveNo)    Next    If Not oForm Is Nothing Then        System.Runtime.InteropServices.Marshal.ReleaseComObject(oForm)    End If    oForm = Nothing    ' Select the report name in the database window and give focus    ' to the database window:    oAccess.DoCmd.SelectObject(ObjectType:=Access.AcObjectType.acReport, _        ObjectName:=sReport, InDatabaseWindow:=True)    ' Maximize the Access window:    oAccess.RunCommand(Command:=Access.AcCommand.acCmdAppMaximize)    ' Preview the report:    oAccess.DoCmd.OpenReport(ReportName:=sReport, _        View:=Access.AcView.acViewPreview)    ' Maximize the report window:    oAccess.DoCmd.Maximize()    ' Hide Access menu bar:    oAccess.CommandBars("Menu Bar").Enabled = False    ' Release Application object and allow Access to be closed by user:    If Not oAccess.UserControl Then oAccess.UserControl = True    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorCleanup:    ' Try to quit Access due to an unexpected error:    On Error Resume Next    System.Runtime.InteropServices.Marshal.ReleaseComObject(oForm)    oForm = Nothing    oAccess.Quit(Option:=Access.AcQuitOption.acQuitSaveNone)    System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess)    oAccess = Nothing    Exit SubErrorHandler:    MsgBox(Err.Number & ": " & Err.Description, _        MsgBoxStyle.MsgBoxSetForeground, "Error Handler")    Resume ErrorCleanupEnd Sub					
  9. Agregue el siguiente código al principio de Form1.vb:
    Imports Microsoft.Office.Interop					
  10. Presione F5 para generar y ejecutar el programa.
  11. Haga clic en Print report y, a continuación, en Go!. El procedimiento Print_Report imprimirá un informe de la base de datos Neptuno.
  12. Haga clic en Preview report y, a continuación, en Go!. El procedimiento Preview_Report ofrecerá una vista previa de un informe de la base de datos Neptuno. Cierre la instancia de Access cuando desee continuar.
  13. Haga clic en Show form y, a continuación, en Go!. El procedimiento Show_Form mostrará el formulario Cuadro de diálogo Etiquetas de cliente de la base de datos Neptuno. También establecerá el grupo de opciones del formulario en "País específico" y seleccionará "EE.UU." en la lista. Cierre la instancia de Access cuando desee continuar.
  14. Haga clic en Print report (Security) y, a continuación, en Go!. El procedimiento Print_Report_Security le mostrará cómo automatizar Access y cómo evitar el cuadro de diálogo de inicio de sesión cuando se encuentre activada la seguridad a nivel de usuario. En el ejemplo, se presupone que el inicio de sesión es el predeterminado, por lo que se pasará el usuario Admin con una contraseña en blanco. Tras ello, el código imprimirá un informe de la base de datos Neptuno.
  15. Haga clic en Preview report (Runtime) y, a continuación, en Go!. El procedimiento Preview_Report_Runtime le mostrará cómo automatizar los archivos en tiempo de ejecución de Access para obtener la vista previa de un informe de la base de datos Neptuno. Si se encuentra instalada la versión comercial de Access, el procedimiento funcionará correctamente. Cierre la instancia de Access cuando desee continuar.
Volver al principio

REFERENCIAS

Para obtener más información, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
Microsoft Office Development with Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
317157 PRB: Errors When Referencing the Access 10.0 Type Library
317109 PRB: Office Application Does Not Shut Down After Automation
308409 PRB: RunTime Error 429 Using GetObject For Office App
244695 BUG: Error 2046 Calling OpenForm or OpenReport Automating Access
304661 HOWTO: Use Visual Basic .NET for Binding for Office Automation Servers
302281 HOWTO: Use VB.Net to Obtain the Window Handle for Office Server
306682 HOWTO: Run Office Macros Using Automation From Visual Basic .NET
Volver al principio
msacc9.olb msacc.olb tiempo de ejecución 429 no se puede crear el componente ActiveX acc2000 acc2002
Propiedades

Id. de artículo: 317113 - Última revisión: 01/17/2007 08:46:17 - Revisión: 7.1

  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft .NET Framework Class Libraries 1.0
  • kbhowtomaster KB317113
Comentarios