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