2024年5月9日发(作者:)
VBA读写EXCEL文档的一般方法
与ACAD的VBA一样,MS EXCEL也提供ActiveX对象模型,在ACAD VBA开发中使用E
XCEL文档同样也要通过其ActiveX对象模型.详细介绍EXCEL的ActiveX对象模型恐怕离
ACAD太远,也没有必要。在这只说说获取EXCEL工作表指定单元格内容的方法。
与ACAD的ActiveX对象模型一样,EXCEL的ActiveX对象模型其顶层对象也是Applicatio
n对象,EXCEL。Application对象提供的Workbooks工作簿集合对象包含有全部已经启动的
EXCEL工作簿对象,我们可以使用Application对象的ActiveWorkbook方法来获取当前活动的
工作簿对象,也可以使用Workbooks(Index)方法来得到指定的工作簿对象。获取要操作的
工作簿后,需要获取工作簿中的指定工作表(worksheet)才能访问到其中的指定单元格内
容。EXCEL的单元格的确定由行和列唯一指定,例如Range("B4")表示第4行第2列。
下面的代码从EXCEL文档中读出数据并在ACAD图形的模型空间中自动根据EXCEL文档
内容绘图。行号是我加上的,真正的程序不需要它们。
1 Sub ExcelRead()
2 Dim ExcelApp As New Excel。Application
3 oks。Open "d:book1。xls", , ReadOnly
4 Dim pt1(0 To 2) As Double, pt2(0 To 2) As Double
5 Dim Rad As Double
6 Dim i As Integer
7 i = 2
8 With ExcelApp。ActiveWorkbook。Worksheets(”sheet1")
9 Do
10 Select Case 。Range("A" & i)
11 Case "直线":
12 pt1(0) = 。Range(”B” & i)
13 pt1(1) = 。Range("C" & i)
14 pt1(2) = 0
15 pt2(0) = .Range(”D" & i)
16 pt2(1) = .Range(”E" & i)
17 pt2(0) = 0
18 ThisDrawing。ModelSpace。AddLine pt1, pt2
19 Case "圆":
20 pt1(0) = 。Range("B” & i)
21 pt1(1) = .Range("C" & i)
22 pt1(2) = 0
23 Rad = .Range(”D” & i)
24 ThisDrawing。cle pt1, Rad
25 Case Else:
26 Exit Do
27 End Select
28 i = i + 1
29 Loop
30 End With
31
32 ExcelApp。Quit
33 ThisDrawing。Application。Update
34 End Sub
运行这段代码需要加载EXCEL ActiveX对象模型。在ACAD VBA编辑器中选择“工具”菜单
—〉“引用”,选择合适的Microsoft Excel Object Library。
这段代码第2行先声明并新建一个ation对象。新建EXCEL对象,也可以调用
VB库函数CreateObject():
Dim ExcelApp As ation
Set ExcelApp = CreateObject(”Microsoft Excel”)
程序第3行调用EXCEL的Application对象的Workbooks集合的Open方法,以只读方式打
开指定的EXCEL文档.第4-7行声明一些变量。i 用于表明要操作的EXCEL单元格的行号,
通常EXCEL文档第1 行是表头说明,我们从第2行开始读数据。
程序第8行告诉编译程序以下对当前活动的EXCEL文档的Sheet1工作表进行操作。
程序第9行到第29行循环读取EXCEL文档的Sheet1工作表中对于自动绘图有用的单元格内
容并在ACAD模型空间中绘图。
循环内部用Select Case语句根据EXCEL文档的第1 列内容选择不同的绘图方法。为了说明
问题,程序仅对直线和圆两种ACAD图元对象进行操作并将其它对象出现作为循环退出条
件.实际编程时可以对更多ACAD图元对象进行操作。
程序第31、32行释放不再使用的EXCEL对象,第33行刷新ACAD图形以显示自动绘制的
图形。
下面的代码由用户在ACAD图形中选择对象并将对象部分属性写入EXCEL文档。
Sub WriteExcel()
Dim ExcelApp As New ation
Dim ExcelWkbk As ok
Set ExcelWkbk = oks。Add
Dim sel As AcadSelectionSet
Dim i As Integer
i = 2
On Error Resume Next
Set sel = ("ssel”)
If Err Then
Err。Clear
Set sel = ThisDrawing。SelectionSets。Item(”ssel")
End If
On Error GoTo 0
OnScreen
Dim Ent As AcadEntity
Dim pt1 As Variant, pt2 As Variant
MsgBox ExcelWkbk。Name
With eets("sheet1")
For Each Ent In sel
Select Case UCase(Name)
Case ”ACDBLINE”:
。Range("A” & i) = "直线"
pt1 = oint
pt2 = Ent。EndPoint
.Range("B” & i) = pt1(0)
.Range("c" & i) = pt1(1)
.Range("D" & i) = pt2(0)
。Range("E” & i) = pt2(1)
i = i + 1
Case ”ACDBCIRCLE":
.Range(”A” & i) = ”圆"
pt1 = Ent。Center
.Range("B" & i) = pt1(0)
。Range("C" & i) = pt1(1)
.Range(”D” & i) =
i = i + 1
Case Else:
End Select
Next Ent
End With
ExcelApp。 ”d:book1。xls”
End Sub
VBA读写EXCEL文档的一般方法
与ACAD的VBA一样,MS EXCEL也提供ActiveX对象模型,在ACAD VBA开发中使用
EXCEL文档同样也要通过其ActiveX对象模型。详细介绍EXCEL的ActiveX对象模型恐怕离
ACAD太远,也没有必要。在这只说说获取EXCEL工作表指定单元格内容的方法。
与ACAD的ActiveX对象模型一样,EXCEL的ActiveX对象模型其顶层对象也是Application
对象,EXCEL。Application对象提供的Workbooks工作簿集合对象包含有全部已经启动的EX
CEL工作簿对象,我们可以使用Application对象的ActiveWorkbook方法来获取当前活动的工作
簿对象,也可以使用Workbooks(Index)方法来得到指定的工作簿对象.获取要操作的工作簿
后,需要获取工作簿中的指定工作表(worksheet)才能访问到其中的指定单元格内容。EXCEL
的单元格的确定由行和列唯一指定,例如Range(”B4”)表示第4行第2列。
下面的代码从EXCEL文档中读出数据并在ACAD图形的模型空间中自动根据EXCEL文档内
容绘图.行号是我加上的,真正的程序不需要它们。
1 Sub ExcelRead()
2 Dim ExcelApp As New ation
3 ExcelApp。Workbooks。Open "d:”, , ReadOnly
4 Dim pt1(0 To 2) As Double, pt2(0 To 2) As Double
5 Dim Rad As Double
6 Dim i As Integer
7 i = 2
8 With eets("sheet1")
9 Do
10 Select Case 。Range(”A” & i)
11 Case "直线”:
12 pt1(0) = .Range("B” & i)
13 pt1(1) = 。Range(”C" & i)
14 pt1(2) = 0
15 pt2(0) = .Range(”D" & i)
16 pt2(1) = 。Range(”E" & i)
17 pt2(0) = 0
18 ThisDrawing。ModelSpace。AddLine pt1, pt2
19 Case ”圆":
20 pt1(0) = .Range("B" & i)
21 pt1(1) = .Range(”C" & i)
22 pt1(2) = 0
23 Rad = 。Range(”D" & i)
24 pace。AddCircle pt1, Rad
25 Case Else:
26 Exit Do
27 End Select
28 i = i + 1
29 Loop
30 End With
31
32
33 ThisDrawing。
34 End Sub
运行这段代码需要加载EXCEL ActiveX对象模型。在ACAD VBA编辑器中选择“工具"菜
单->“引用”,选择合适的Microsoft Excel Object Library。
这段代码第2行先声明并新建一个EXCEL。Application对象.新建EXCEL对象,也可以调用V
B库函数CreateObject():
Dim ExcelApp As Excel。Application
Set ExcelApp = CreateObject("Microsoft Excel")
程序第3行调用EXCEL的Application对象的Workbooks集合的Open方法,以只读方式打开
指定的EXCEL文档。第4-7行声明一些变量。i 用于表明要操作的EXCEL单元格的行号,通
常EXCEL文档第1 行是表头说明,我们从第2行开始读数据。
程序第8行告诉编译程序以下对当前活动的EXCEL文档的Sheet1工作表进行操作。
程序第9行到第29行循环读取EXCEL文档的Sheet1工作表中对于自动绘图有用的单元格内容
并在ACAD模型空间中绘图。
循环内部用Select Case语句根据EXCEL文档的第1 列内容选择不同的绘图方法。为了说明
问题,程序仅对直线和圆两种ACAD图元对象进行操作并将其它对象出现作为循环退出条件。
实际编程时可以对更多ACAD图元对象进行操作。
程序第31、32行释放不再使用的EXCEL对象,第33行刷新ACAD图形以显示自动绘制的图
形。
下面的代码由用户在ACAD图形中选择对象并将对象部分属性写入EXCEL文档。
Sub WriteExcel()
Dim ExcelApp As New ation
Dim ExcelWkbk As ok
Set ExcelWkbk = oks。Add
Dim sel As AcadSelectionSet
Dim i As Integer
i = 2
On Error Resume Next
Set sel = (”ssel”)
If Err Then
Err。Clear
Set sel = ThisDrawing。("ssel”)
End If
On Error GoTo 0
sel。SelectOnScreen
Dim Ent As AcadEntity
Dim pt1 As Variant, pt2 As Variant
MsgBox ExcelWkbk。Name
With ExcelWkbk。Worksheets("sheet1")
For Each Ent In sel
Select Case UCase(Ent。ObjectName)
Case ”ACDBLINE”:
。Range("A" & i) = ”直线"
pt1 = oint
pt2 = Ent。EndPoint
.Range(”B” & i) = pt1(0)
.Range(”c” & i) = pt1(1)
.Range(”D” & i) = pt2(0)
.Range(”E" & i) = pt2(1)
i = i + 1
Case ”ACDBCIRCLE":
.Range("A" & i) = ”圆”
pt1 =
.Range(”B" & i) = pt1(0)
.Range("C" & i) = pt1(1)
.Range(”D” & i) =
i = i + 1
Case Else:
End Select
Next Ent
End With
”d:”
oks。Close
ExcelApp。Quit
sel。Delete
End Sub
发布评论