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

Seleccione idioma Seleccione idioma
Id. de artículo: 317113 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

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

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

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)
				

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

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.

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

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-sensitive
oAccess.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.DBEngine
Dim oDB As DAO.Database
        
sDBPassword = "Mypassword" 'database password 
oDBEngine = oAccess.DBEngine
oDB = 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 = Nothing
System.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

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

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

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 String
    
    Private 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 Sub
    
    Private 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 button
    End Sub
    
    Private 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 Select
    End Sub
    
    Private 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 oAccess
    ErrorCleanup:
        ' 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 Nothing
    ErrorHandler:
        MsgBox(Err.Number & ": " & Err.Description, _
            MsgBoxStyle.MsgBoxSetForeground, "Error Handler")
        Resume ErrorCleanup
    End Function
    
    Private 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 oAccess
    ErrorCleanup:
        ' 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 Nothing
    ErrorHandler:
        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 ErrorCleanup
    End Function
    
    Private 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 Function
    
    Private 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 Sub
    ErrorHandler:
        MsgBox(Err.Number & ": " & Err.Description, _
            MsgBoxStyle.MsgBoxSetForeground, "Error Handler")
        ' Try to quit Access due to an unexpected error:
        Resume Cleanup
    End Sub
    
    Private 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 Sub
    ErrorCleanup:
        ' 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 Sub
    ErrorHandler:
        MsgBox(Err.Number & ": " & Err.Description, _
            MsgBoxStyle.MsgBoxSetForeground, "Error Handler")
        Resume ErrorCleanup
    End Sub
    
    Private 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 Sub
    ErrorCleanup:
        ' 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 Sub
    ErrorHandler:
        MsgBox(Err.Number & ": " & Err.Description, _
            MsgBoxStyle.MsgBoxSetForeground, "Error Handler")
        Resume ErrorCleanup
    End Sub
    
    Private 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 Sub
    ErrorHandler:
        MsgBox(Err.Number & ": " & Err.Description, _
            MsgBoxStyle.MsgBoxSetForeground, "Error Handler")
        ' Try to quit Access due to an unexpected error:
        Resume Cleanup
    End Sub
    
    Private 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 Sub
    ErrorCleanup:
        ' 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 Sub
    ErrorHandler:
        MsgBox(Err.Number & ": " & Err.Description, _
            MsgBoxStyle.MsgBoxSetForeground, "Error Handler")
        Resume ErrorCleanup
    End 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.

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

Propiedades

Id. de artículo: 317113 - Última revisión: miércoles, 17 de enero de 2007 - Versión: 7.1
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft .NET Framework Class Libraries 1.0
Palabras clave: 
kbhowtomaster KB317113

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com