第三章利用Excel的VBA,通过CADdxf文件格式,把Excel数据表与AutoCAD,LT图内的数据连接起来[br] 2009/04/29本人发表了”
利用Excel的VBA,通过CADdxf文件格式,把Excel数据表与AutoCAD,LT图内的数据连接起来.”的系统构思说明文章. 现在再就软件包的代码编制进行说明. 第三章 2. dxf文件的读写以及ProcessFile.dxf的生成 (本文仅仅给出关键语句) ü Sub ExcelSendtoCAD()
ü Mypass = ActiveWorkbook.Path ’(Excel文件所在位置检出. 建议:
D:\AutoDrawing) ü Kill (Mypass & "\" & "ProcessFile.dxf") ’(删除上次的
ProcessFile.dxf, ProcessFile) ProcessFile.dxf是程序私用的自生成文件.它用来承载dxf传来的,经过逐句推敲的所有字符串.当整个程序结束以后,它就是一页CADdxf图.然后用AutoCAD打开它,根据图纸目录,别名保存为*.dwg文件, ProcessFile.dxf的使命就结束了.它应该随即被删除.因为相关的语句[Open Mypass & "\" & "ProcessFile.dxf" For Append As #2],只有在当前位置不存在ProcessFile.dxf时,才自动新建一个ProcessFile.dxf,而如果前次的ProcessFile.dxf没有来得及删除,它就会被打开使用,这样就发生了前后两张图混杂的糟糕文件.那么为什么不在前次程序结束时删除它呢?这是因为程序的后半部分是启动AutoCAD,而它又必须在CAD用过以后才允许删除,而windows focus 一旦转给了AutoCAD,就很难再回到VBA解决删除它.所以删除它就放在了下次的开头.好在kill()这个命令有容错功能,即使删除对象不存在也没事. ü 略(CADdxf图纸目录逐次装入)(Put 001.dxf,002.dxf,…100.dxf in UserForm1.TextBox1 at every time) ü Open UserForm1.TextBox1.Value For Input As #1 'read ***.dxf file with txt(读操作文件的准备) ü Open Mypass & "\" & "ProcessFile.dxf" For Append As #2 'Write every letter of ***.dxf into ProcessFile.dxf and edit the attributes while reading/writing (写操作文件的准备) ü Do Until TextWord1 = "EOF" ‘外层,监视dxf的终了行 Ø Do Until TextWord1 = "ATTRIB"‘内层1, 监视dxf的属性变量入口 ² Line Input #1, TextWord1‘#1是***.dxf,读到什么 ² Print #2, TextWord1‘#2是ProcessFile.dxf,就写进什么 ² If TextWord1 = "EOF" Then GoTo Line1‘遇到结束行就转到dxf访问终了处理 ² If TextWord1 = "SEQEND" Then‘遇到No.1模块结束行, 次外层内清零处理,寻找No.2模块"ATTRIB" Ø Loop‘内层1返回, 监视dxf的属性变量入口 Ø Do Until TextWord1 = "AcDbText"‘内层2, 监视属性题字信息入口行 ² Line Input #1, TextWord1‘读到什么 ² Print #2, TextWord1‘就写进什么 Ø Loop‘‘内层2返回, 监视属性题字信息入口行 Ø Do Until LineCounter = 9‘内层3,十行计数层 ² LineCounter = LineCounter + 1‘行数加1 ² Line Input #1, TextWord1‘读到什么 ² Print #2, TextWord1‘就写进什么 Ø Loop‘内层3返回, 十行计数层 Ø Line Input #1, TextWord1‘ ‘此时读出的TextWord1,就是属性值,如果是首次读到,就是第一个属性值ID. 拿着这个ID,到Excel文件读写sheet的对应页里,寻找相应的ID行,并把光标移到该格子上.随后的属性值,都在这一行的相应列上.为什么要校对ID行呢?因为dxf文件是按句柄的大小排序的,最先遇到的模块,不一定是No.1模块.如果dxf文件的模块ID有重号,那它们就会读到sheet同一行的属性值. 如果dxf属性模块ID是0,或者在读写sheet里不存在,程序就会出错,需要出错处理.这部分内容本文省略了. 接下来的程序是dxf属性值检出带动Excel读写sheet光标移动的操作. 如前所述, dxf模块定义了59个变量(本文的例),它对应于读写sheet的59列.实际上在某一张图里,大部分属性值是空白,之所以这样是因为59个变量对应了全部CAD图,这张图用不到的变量,那张图会用到.所以如何处理此时的TextWord1,需要做些约定.请参考如下语句,理解这样的逻辑安排; 1. Excel读写sheetà dxf图的数据传送操作时: Ø If TextWord1 <> "
" and TextWord1 <> ActiveCell.value then Ø TextWord1 = ActiveCell.value Ø ActiveCell.Offset (0, 1).select‘右移格操作 Ø End if ‘如果dxf图的属性值不空白,而且不如Excel读写sheet新,则TextWord1被改写,用如下语句传送给ProcessFile.dxf Ø Print #2, TextWord1‘写进ProcessFile.dxf 2. dxf图àExcel读写sheet的数据传送操作时: Ø If TextWord1 <> "
" and TextWord1 <> ActiveCell.value then ActiveCell.value = TextWord1 ‘如果dxf图的属性值不空白,而且比Excel读写sheet更新,则读写sheet格被改写.根本不需要ProcessFile.dxf. ü Loop‘外层返回,监视dxf的终了行 ü Close #1‘关闭#1
这两条语句很重要,如果没被执行,下次操作就会死掉. ü Close #2‘关闭#2 在系统测试时,中途人为终止;或连续作图操作时,中途AutoCAD死掉等情况下,它们很可能没有被执行. ü Call OpenCADProcessFile ü End sub 以上是对dxf文件读写处理程序的重点叙述,实际代码是配合Excel侧的关连操作,周密地实现以上逻辑.包括步进计数,多元函数一括读写等技巧.Excel与AutoDAD之间数据交换的操作,以ProcessFile.dxf完整被作出为止,实际上已经实现目的了.接下来的操作是启动CAD,打开ProcessFile.dxf,用别名保存为CADdwg就好了. 另外,对于dxf图àExcel的操作, dxf图的新信息直接写到Excel读写sheet上,根本不需要ProcessFile.dxf.随后的操作是把读写sheet的内容,再回存到统一数据库sheet里,这纯粹是一个Excel内部各个sheet间的操作,难度不大,本文省略了. |