VBA读写EXCEL文档的一般方法与ACAD的VBA一样,MSEXCEL也提供ActiveX对象模型,在ACADVBA开发中使用EXCEL文档同样也要通过其ActiveX对象模型。详细介绍EXCEL的ActiveX对象模型恐怕离ACAD太远,也没有必要。在这只说说获取EXCEL工作表指定单元格内容的方法。与ACAD的ActiveX对象模型一样,EXCEL的ActiveX对象模型其顶层对象也是Application对象,EXCEL.Application对象提供的Workbooks工作簿集合对象包含有全部已经启动的EXCEL工作簿对象,我们可以使用Application对象的ActiveWorkbook方法来获取当前活动的工作簿对象,也可以使用Workbooks(Index)方法来得到指定的工作簿对象。获取要操作的工作簿后,需要获取工作簿中的指定工作表(worksheet)才能访问到其中的指定单元格内容。EXCEL的单元格的确定由行和列唯一指定,例如Range(B4)表示第4行第2列。下面的代码从EXCEL文档中读出数据并在ACAD图形的模型空间中自动根据EXCEL文档内容绘图。行号是我加上的,真正的程序不需要它们。1SubExcelRead()2DimExcelAppAsNewExcel.Application3ExcelApp.Workbooks.Opend:\book1.xls,,ReadOnly4Dimpt1(0To2)AsDouble,pt2(0To2)AsDouble5DimRadAsDouble6DimiAsInteger7i=28WithExcelApp.ActiveWorkbook.Worksheets(sheet1)9Do10SelectCase.Range(A&i)11Case直线:12pt1(0)=.Range(B&i)13pt1(1)=.Range(C&i)14pt1(2)=015pt2(0)=.Range(D&i)16pt2(1)=.Range(E&i)17pt2(0)=018ThisDrawing.ModelSpace.AddLinept1,pt219Case圆:20pt1(0)=.Range(B&i)21pt1(1)=.Range(C&i)22pt1(2)=023Rad=.Range(D&i)24ThisDrawing.ModelSpace.AddCirclept1,Rad25CaseElse:26ExitDo27EndSelect28i=i+129Loop30EndWith31ExcelApp.Workbooks.Close32ExcelApp.Quit33ThisDrawing.Application.Update34EndSub运行这段代码需要加载EXCELActiveX对象模型。在ACADVBA编辑器中选择“工具”菜单-“引用”,选择合适的MicrosoftExcelObjectLibrary。这段代码第2行先声明并新建一个EXCEL.Application对象。新建EXCEL对象,也可以调用VB库函数CreateObject():DimExcelAppAsExcel.ApplicationSetExcelApp=CreateObject(MicrosoftExcel)程序第3行调用EXCEL的Application对象的Workbooks集合的Open方法,以只读方式打开指定的EXCEL文档。第4-7行声明一些变量。i用于表明要操作的EXCEL单元格的行号,通常EXCEL文档第1行是表头说明,我们从第2行开始读数据。程序第8行告诉编译程序以下对当前活动的EXCEL文档的Sheet1工作表进行操作。程序第9行到第29行循环读取EXCEL文档的Sheet1工作表中对于自动绘图有用的单元格内容并在ACAD模型空间中绘图。循环内部用SelectCase语句根据EXCEL文档的第1列内容选择不同的绘图方法。为了说明问题,程序仅对直线和圆两种ACAD图元对象进行操作并将其它对象出现作为循环退出条件。实际编程时可以对更多ACAD图元对象进行操作。程序第31、32行释放不再使用的EXCEL对象,第33行刷新ACAD图形以显示自动绘制的图形。下面的代码由用户在ACAD图形中选择对象并将对象部分属性写入EXCEL文档。SubWriteExcel()DimExcelAppAsNewExcel.ApplicationDimExcelWkbkAsExcel.WorkbookSetExcelWkbk=ExcelApp.Workbooks.AddDimselAsAcadSelectionSetDimiAsIntegeri=2OnErrorResumeNextSetsel=ThisDrawing.SelectionSets.Add(ssel)IfErrThenErr.ClearSetsel=ThisDrawing.SelectionSets.Item(ssel)EndIfOnErrorGoTo0sel.SelectOnScreenDimEntAsAcadEntityDimpt1AsVariant,pt2AsVariantMsgBoxExcelWkbk.NameWithExcelWkbk.Worksheets(sheet1)ForEachEntInselSelectCaseUCase(Ent.ObjectName)CaseACDBLINE:.Range(A&i)=直线pt1=Ent.StartPointpt2=Ent.EndPoint.Range(B&i)=pt1(0).Range(c&i)=pt1(1).Range(D&i)=pt2(0).Range(E&i)=pt2(1)i=i+1CaseACDBCIRCLE:.Range(A&i)=圆pt1=Ent.Center.Range(B&i)=pt1(0).Range(C&i)=pt1(1).Range(D&i)=Ent.Radiusi=i+1CaseElse:EndSelectNextEntEndWithExcelApp.ActiveWorkbook.SaveAsd:\book1.xlsExcelApp.Workbooks.CloseExcelApp.Quitsel.DeleteEndSubVBA读写EXCEL文档的一般方法与ACAD的VBA一样,MSEXCEL也提供ActiveX对象模型,在ACADVBA开发中使用EXCEL文档同样也要通过其ActiveX对象模型。详细介绍EXCEL的ActiveX对象模型恐怕离ACAD太远,也没有必要。在这只说说获取EXCEL工作表指定单元格内容的方法。与ACAD的ActiveX对象模型一样,EXCEL的ActiveX对象模型其顶层对象也是Application对象,EXCEL.Application对象提供的Workbooks工作簿集合对象包含有全部已经启动的EXCEL工作簿对象,我们可以使用Application对象的ActiveWorkbook方法来获取当前活动的工作簿对象,也可以使用Workbooks(Index)方法来得到指定的工作簿对象。获取要操作的工作簿后,需要获取工作簿中的指定工作表(worksheet)才能访问到其中的指定单元格内容。EXCEL的单元格的确定由行和列唯一指定,例如Range(B4)表示第4行第2列。下面的代码从EXCEL文档中读出数据并在ACAD图形的模型空间中自动根据EXCEL文档内容绘图。行号是我加上的,真正的程序不需要它们。1SubExcelRead()2DimExcelAppAsNewExcel.Application3ExcelApp.Workbooks.Opend:\book1.xls,,ReadOnly4Dimpt1(0To2)AsDouble,pt2(0To2)AsDouble5DimRadAsDouble6DimiAsInteger7i=28WithExcelApp.ActiveWorkbook.Worksheets(sheet1)9Do10SelectCase.Range(A&i)11Case直线:12pt1(0)=.Range(B&i)13pt1(1)=.Range(C&i)14pt1(2)=015pt2(0)=.Range(D&i)16pt2(1)=.Range(E&i)17pt2(0)=018ThisDrawing.ModelSpace.AddLinept1,pt219Case圆:20pt1(0)=.Range(B&i)21pt1(1)=.Range(C&i)22pt1(2)=023Rad=.Range(D&i)24ThisDrawing.ModelSpace.AddCirclept1,Rad25CaseElse:26ExitDo27EndSelect28i=i+129Loop30EndWith31ExcelApp.Workbooks.Close32ExcelApp.Quit33ThisDrawing.Application.Update34EndSub运行这段代码需要加载EXCELActiveX对象模型。在ACADVBA编辑器中选择“工具”菜单-“引用”,选择合适的MicrosoftExcelObjectLibrary。这段代码第2行先声明并新建一个EXCEL.Application对象。新建EXCEL对象,也可以调用VB库函数CreateObject():DimExcelAppAsExcel.ApplicationSetExcelApp=CreateObject(MicrosoftExcel)程序第3行调用EXCEL的Application对象的Workbooks集合的Open方法,以只读方式打开指定的EXCEL文档。第4-7行声明一些变量。i用于表明要操作的EXCEL单元格的行号,通常EXCEL文档第1行是表头说明,我们从第2行开始读数据。程序第8行告诉编译程序以下对当前活动的EXCEL文档的Sheet1工作表进行操作。程序第9行到第29行循环读取EXCEL文档的Sheet1工作表中对于自动绘图有用的单元格内容并在ACAD模型空间中绘图。循环内部用SelectCase语句根据EXCEL文档的第1列内容选择不同的绘图方法。为了说明问题,程序仅对直线和圆两种ACAD图元对象进行操作并将其它对象出现作为循环退出条件。实际编程时可以对更多ACAD图元对象进行操作。程序第31、32行释放不再使用的EXCEL对象,第33行刷新ACAD图形以显示自动绘制的图形。下面的代码由用户在ACAD图形中选择对象并将对象部分属性写入EXCEL文档。SubWriteExcel()DimExcelAppAsNewExcel.ApplicationDimExcelWkbkAsExcel.WorkbookSetExcelWkbk=ExcelApp.Workbooks.AddDimselAsAcadSelectionSetDimiAsIntegeri=2OnErrorResumeNextSetsel=ThisDrawing.SelectionSets.Add(ssel)IfErrThenErr.ClearSetsel=ThisDrawing.SelectionSets.Item(ssel)EndIfOnErrorGoTo0sel.SelectOnScreenDimEntAsAcadEntityDimpt1AsVariant,pt2AsVariantMsgBoxExcelWkbk.NameWithExcelWkbk.Worksheets(sheet1)ForEachEntInselSelectCaseUCase(Ent.ObjectName)CaseACDBLINE:.Range(A&i)=直线pt1=Ent.StartPointpt2=Ent.EndPoint.Range(B&i)=pt1(0).Range(c&i)=pt1(1).Range(D&i)=pt2(0).Range(E&