excel_vba_编程教程(完整版)-第84部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
db。TableDefs。Append tbl
' Close the database
db。Close
Set db = Nothing
MsgBox 〃There is a new database on your hard disk。 〃 & vbCrLf _
& 〃This database file contains a table 〃 & strDb & vbCrLf _
& 〃named 〃 & strTbl & 〃。〃 & vbCrLf _
& 〃Before you activate this database; close the Excel application。〃
Exit_CreateDb_DAO:
Exit Sub
Error_CreateDb_DAO:
If Err。Number = 3204 Then
' Delete the database file if it already exists
Kill 〃C:Exceldump。mdb〃
Resume
Else
MsgBox Err。Number & 〃: 〃 & Err。Description
Resume Exit_CreateDb_DAO
End If
End Sub
297
… 页面 314…
图15…7 Excel VBA过程创建的Access数据库表
9。打开 Access 窗体
你可以从Excel里打开Access窗体。你也可以创建新窗体。下述例子使用自动控制链接到
Access。一旦链接建立后,就使用 OpenCurrentDatabase方法来打开例子Northwind数据库。
接着,使用DoCmd对象的OpenForm方法打开Customers窗体。该窗 体被打开为普通视图
(acNormal)。如果要将窗体在设计视图里打开的话,那么可以使用acDesign常数代替。DoCmd
对象的 Restore方法确保该窗体显示在屏幕上而不是最小化。Access应用软件对象
(objAccess)的Visible属性必须设置为True,以确 保窗体可见。注意,Access应用软件的
对象变量(objAccess)在模块上面声明。为了让该过程运行正确,你必须建立对Access对象库
的引用。图15…8显示了被打开的Customers窗体。
‘ declare at the top of the module
Dim objAccess As Access。Application
Sub DisplayAccessForm()
Dim strDb As String
Dim strFrm As String
strDb = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
strFrm = 〃Customers〃
Set objAccess = New Access。Application
With objAccess
。OpenCurrentDatabase(strDb)
。DoCmd。OpenForm strFrm; acNormal
。DoCmd。Restore
。Visible = True
End With
End Sub
298
… 页面 315…
图15…8 可以用Excel VBA过程打开的Access窗体
如果你还想在编程中再进一步的话,那么从Excel VBA过程里创建一个全新的Access窗体,如下
所示:
‘ declare at the top of the module
Dim obAccess As Access。Application (译者:原文为myAccess)
Sub CreateAccessForm()
Dim myForm As Form
Dim myDb As String
Dim myCtrl As Control
Dim strFrmName As String
On Error GoTo Error_CreateForm
myDb = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
strFrmName = 〃frmCustomForm〃
Set obAccess = New Access。Application
obAccess。OpenCurrentDatabase myDb
Set myForm = obAccess。CreateForm
myForm。Caption = 〃Form created by Excel〃
myForm。RecordSource = 〃Employees〃
obAccess。DoCmd。Save ; strFrmName
' Create a label and text box on the form
Set myCtrl = CreateControl(FormName:=strFrmName; _
ControlType:=acLabel; _
Left:=1000; Top:=1000)
myCtrl。Caption = 〃Last Name:〃
myCtrl。SizeToFit
Set myCtrl = CreateControl(FormName:=strFrmName; _
ControlType:=acTextBox; _
Parent:=〃〃; _
299
… 页面 316…
ColumnName:=〃LastName〃; _
Left:=2200; Top:=1000)
With obAccess
With 。DoCmd
。Save ; strFrmName
。Close acForm; strFrmName
End With
。CloseCurrentDatabase
。Quit
End With
Set obAccess = Nothing
MsgBox 〃In the Northwind database there is now 〃 & vbCrLf _
& 〃a new form named 〃 & strFrmName & 〃。〃 & vbCrLf _
& 〃Close Excel prior to opening the Northwind 〃 & vbCrLf _
& 〃database to view this form。〃
ErrorHandler:
Exit Sub
Error_CreateForm:
MsgBox Err & 〃 :〃 & Err。Description
Resume ErrorHandler
End Sub
图15…9 Access窗体可以由Excel VBA过程创建(参见上面的
CreateAccessForm过程代码)
10。打开 Access 报表
你可以从Excel里打开Access报表。下述过程示范了如何直接从
Excel里显示已经存在的Access报表。
‘ declare at the top of the module
Dim objAccess As Access。Application
Sub DisplayAccessReport()
Dim strDb As String
Dim strRpt As String
strDb = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
strRpt = 〃Products by Category〃
Set objAccess = New Access。Application
With objAccess
。OpenCurrentDatabase (strDb)
。DoCmd。OpenReport strRpt; acViewPreview
。DoCmd。Maximize
。Visible = True
End With
End Sub 下面的过程更通用,因为它允许你在任意Access数据库里显示任意Access报表。注意,
该过程需要两个字符串参数:Access数 据库名称和报表名称。
Sub DisplayAccessReport2(strDb As String; strRpt As String)
Set objAccess = New Access。Application
With objAccess
。OpenCurrentDatabase (strDb)
。DoCmd。OpenReport strRpt; acViewPreview
。DoCmd。Maximize
。Visible = True
End With
End Sub
你可以从立即窗口或者从如下所示的一个子过程里运行DisplayAccessReport2:
□ 从立即窗口
运行
300
… 页面 317…
DisplayAcce
ssReport2过
程 在立即窗
口里在一行
输入下述语
句:
Call DisplayAccessReport2(〃C:Program FilesMicrosoft
OfficeOfficeSamplesNorthwind。mdb〃; 〃Sales Totals by
Amount〃)
□
从一个子过程运行DisplayAccessReport2过程:
' Enter the following procedure in the Code window
Sub ShowReport()
Dim strDb As String
Dim strRpt As String
strDb = InputBox(〃Enter the name of the database (full path): 〃)
strRpt = InputBox(〃Enter the name of the report:〃)
Call DisplayAccessReport2(strDb; strRpt)
End Sub
图15…10 Access报表可以在Excel VBA过程里打开
11。运行 Access 查询
接下来的两个程序例子将示范如何从Excel VBA过程里运行Access查询。在Access用户界面最
常用的查询类型是选择查询 和参 数查询。两个示例程序都使用Range对象的
CopyFromRecordset方法将查询到的数据放置到Excel工作表。和数据库的链接是通 过ADO建立
的。
ADOX对象库(参见本章前面的图15…4)让你访问数据库结构,安全和储存在数据库里面的过程。
该库中最上面的对象是Catalog 对象,代表整个数据库。该对象包含一些数据库成员,例如,
301
… 页面 318…
表,字段,索引,视图和储存的过程。使用Catalog对象的Create 方法,你可以创建一个新的
数据库,例如:
Dim cat As ADOX。Catalog
Set cat = New ADOX。Catalog
cat。Create 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _
〃Data Source=C:ExcelDump2。mdb;〃 上面的例子示范如何使用ActiveX数据对象创建新
的数据库。回想一下,在本章前面你使用DAO创建了一个叫做NewDB_DA的新 数据库。 示例过程
RunAccessQuery,首先创建一个可以指向该Catalog对象的对象变量cat。接着,Catalog对象
的属性 ActiveConnection定义对数据库创建链接的方法:
Set cat = New ADOX。Catalog
cat。ActiveConnection = 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _
〃Data Source=〃 & dbPath
ADODB对象库里的mand对象(参见本章前面的图15…3)明确你为了从数据源获取数据而想
要执行的命令。我们的过程尝 试访问数据库某特定查询。
Set cmd = cat。Views(strQryName)mand Views集合,ADOX对象库的一部分,包含某特定
目录的所有View对象。视图是筛选后的一组记录,或者由其它表或者视图创建 的虚拟表。获
得对数据库里需要的查询的访问后,你就可以按下述方式运行查询:
Set rst = cmd。Execute mand对象的Execute方法允许你激活某个特定的查询,SQL语句,
或者储存的过程。然后,返回的一组记录会通过Set关键 字被赋予对象变量Recordset。创建
该组记录后,这些记录就会通过使用方法CopyFromRecordset放置到Excel工作表中。
12。运行选择查询
Sub RunAccessQuery(strQryName As String)
' prior to running this procedure you must set up
' references to the required object libraries
Dim cat As ADOX。Catalog
Dim cmd As ADODBmand
Dim rst As ADODB。Recordset
Dim i As Integer
Dim dbPath As String
dbPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
Set cat = New ADOX。Catalog
cat。ActiveConnection = _
〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _
〃Data Source=〃 & dbPath
Set cmd = cat。Views(strQryName)mand
Set rst = cmd。Execute
Sheets(2)。Select
For i = 0 To rst。Fieldsunt … 1
Cells(1; i + 1)。Value = rst。Fields(i)。Name
Next
With ActiveSheet
。Range(〃A2〃)pyFromRecordset rst
。Ra