iCAx开思网

标题: 求助把运行宏的结果输出到txt文件里的宏代码 [打印本页]

作者: dreamsboy    时间: 2016-7-31 00:56
标题: 求助把运行宏的结果输出到txt文件里的宏代码
今天研究了半天的宏文件,其实就是因为工作中每套图纸都要出图纸目录,图纸一多,出图纸目录也麻烦,于时突然想起用宏文件来批量打开工作图文件抓取属性然后输出成txt文件,(当然,输出成excel文档也行)。对宏,我算四分之三个文盲,完全没学过的东西,只能在网上搜些代码来慢慢的按自己的想法去改、去试验。搞了半天,现在竟然才做到打开工程图,提取图纸幅面大小和每个零件的图纸的张数。现在有问题只能求助各位大神了:第一:打开一张工程图后,抓取图纸里某个视图(其实抓取任何一个视图)的关联的零部件的属性,这个代码怎样写?第二:运行宏以后,得到的结果比如说 代号、名称、图幅、张数 怎么导出成txt文件?这个宏代码又应该怎样写?半夜三更了,实在是理不清了,没办法了只能求助了,求大神们有空闲了多多指点指点。谢谢。


作者: qiminger    时间: 2016-7-31 08:04
如果文件名是以代号+间隔符+名称命名,
代号和名称就从文件名中提取
写出到文件代码在网上搜一下“VB写出文本到txt代码”
自己参照一下,宏(VBA)语言是从VB衍生出来的,很多代码通用。
作者: dreamsboy    时间: 2016-7-31 12:23
qiminger 发表于 2016-7-31 08:04
如果文件名是以代号+间隔符+名称命名,
代号和名称就从文件名中提取
写出到文件代码在网上搜一下“VB写出 ...

谢谢老兄指点了。我也考虑过这样去提取,不过觉得还是从某一视图关联的零部件属性里提取更可靠点。
另外一个就是那个代码的问题,不是我不找VB代码,而是实在找不到了。昨天晚上悲催死了,搞到两三点,刚搞定提取图幅和单工程图里图纸张数这两个参数提取到EXCEL里面的时候,把文件改了下名字,搞错了,把后缀给去掉了,然后一不小心就VB编辑了一下,内容全部自动清空了。郁闷得要死了。唉。

作者: 莱虫    时间: 2016-7-31 18:03
本帖最后由 莱虫 于 2016-7-31 18:26 编辑

按楼主要求编写了一下,不是到是否想要的。
附件是Excel文件,注意“代号”栏往右可继续加上模型的属性名称(配置指定),如“说明”、“重量”等等。

(附件有版本限制,已删,请到7楼下载更新版本)
作者: dreamsboy    时间: 2016-7-31 18:08
莱虫 发表于 2016-7-31 18:03
按楼主要求编写了一下,不是到是否想要的。
附件是Excel文件,注意“代号”栏往右可继续加上模型的属性名 ...

谢谢高人。马上下载学习。

作者: dreamsboy    时间: 2016-7-31 18:20
莱虫 发表于 2016-7-31 18:03
按楼主要求编写了一下,不是到是否想要的。
附件是Excel文件,注意“代号”栏往右可继续加上模型的属性名 ...

高人,我下载了。这个竟然是脱离SW单独运行的EXCEL文件,这种方式令我惊喜万分。本来我以为能搞个在SW里运行的宏就不错了。谢谢。
不过,我运行时,出现错误,提示“错误438,对象不支持该属性或方法” 。逐句调试了一下,发现是运行第二句代码 (“swApp.cVisible = True”)时出现这个提示的。我的SW版本是2012,EXCEL版本更老,还是2003版的,不知道是不是版本太老了,不能运行新的宏代码?恳请高人继续指点,让我脱离苦海,为了这个东西,我已经搞了两天了,还是迷迷糊糊的不得其法而入。

作者: 莱虫    时间: 2016-7-31 18:23
dreamsboy 发表于 2016-7-31 18:08
谢谢高人。马上下载学习。

刚才疏忽了版本的问题,附件只局限SW2014运行,请下载这个已修改的附件。

作者: dreamsboy    时间: 2016-7-31 18:35
莱虫 发表于 2016-7-31 18:03
按楼主要求编写了一下,不是到是否想要的。
附件是Excel文件,注意“代号”栏往右可继续加上模型的属性名 ...

高人,我把运行库都加载了一下,现在提示 ”错误429:ActiveX 部件不能创建对象“了。

作者: dreamsboy    时间: 2016-7-31 18:46
莱虫 发表于 2016-7-31 18:23
刚才疏忽了版本的问题,附件只局限SW2014运行,请下载这个已修改的附件。

谢谢莱大。
我下载了这个新的文件后,运行后,可以输出了。不过在输出完成,最后会报一个“类型不匹配”的错。

另外,不知道是不是可以加一个“开始执行”的按钮,因为有可能工程图不在一个文件夹下不能一次就选取完毕,有一个按钮的话,可以分多次选取完后再执行。
再者,这个表格,读取文件时它也还是会自动启动SW并且在SW中打开一次文件才能获取属性值吗?我以为是和闷大他们以前发的那个批量改属性值的EXCEL表格一样的可以脱离SW读取属性呢,那个速度超快。

再次谢谢菜大,还请继续指点。

作者: dreamsboy    时间: 2016-7-31 18:55
莱虫 发表于 2016-7-31 18:23
刚才疏忽了版本的问题,附件只局限SW2014运行,请下载这个已修改的附件。

莱大,我运行这个文件后,选中两张工程图,只识别出了一张的属性然后就报错了,现在的情况是:报错后,打开的第一张图没有关闭,然后也没打开第二张工程图。
作者: dreamsboy    时间: 2016-7-31 19:02
莱虫 发表于 2016-7-31 18:23
刚才疏忽了版本的问题,附件只局限SW2014运行,请下载这个已修改的附件。

不好意思莱大,因为我在各种各样的测试,所以断断续续的在回复您。
我找到问题所在了。因为我点选的两张工程图中,第一张的第二页图纸是空白的没有插入模型的,所以报错。我把空白的那页图纸上插入了模型后,现在运行不报错了。
谢谢莱大。
我再继续测试看看。

作者: 莱虫    时间: 2016-8-1 14:18
dreamsboy 发表于 2016-7-31 18:46
谢谢莱大。
我下载了这个新的文件后,运行后,可以输出了。不过在输出完成,最后会报一个“类型不匹配” ...

不好意思,俺能力所限,做不出脱离SW单独运行的EXCEL文件。

加一个“开始执行”按钮是可以的,烦请再试用一下,看看还有什么,一次过改进吧。

作者: dreamsboy    时间: 2016-8-1 22:24
莱虫 发表于 2016-8-1 14:18
不好意思,俺能力所限,做不出脱离SW单独运行的EXCEL文件。

加一个“开始执行”按钮是可以的,烦请再 ...

莱大你好。
我的想法是,增加开始执行按钮、清除选择按钮,这两个我可以慢慢的学习慢慢的学着自己加也没关系。现在最主要的问题是,因为我们一个项目中的零部件的“代号”除了前一部分是相同的,后面有一部分是不一样的,而且部件的代号后半部分是  ".0x",零的最后部分是“-X",就是装配点最后段是 “点+数字零+顺序号”,零件最后段是"横杠+顺序号“,长度是长短不一的,现在获取得到的属性是长短、尾部都不一的,这样这些文件在文件夹里排列顺序就是".xx"和”-x"分别扎堆了,EXCEL处理这些文件时是依次打开的,所以获取的到表格里的数据也不是按顺序号排列的。这种情况不大好表述,举个例子来说,比如说,最终的结果有可能是在这个EXCEL表格中“代号”那列中排列的依次是如图所示的,我想有没有办法让获取到的整个表格的内容最后按照代号这一栏的结果按升序排列?当然,这是个人的想法,但自己现在还没一点解决这个问题的思路。这个有可能要求得太完美了,还请莱大别反感我的奢求太多。
表达不清,请莱大看下图片及附件的EXCEL表格中的示例。
谢谢。
[attach]1237489[/attach]
[attach]1237490[/attach]

[attach]1237490[/attach]


作者: 莱虫    时间: 2016-8-2 00:52
dreamsboy 发表于 2016-8-1 22:24
莱大你好。
我的想法是,增加开始执行按钮、清除选择按钮,这两个我可以慢慢的学习慢慢的学着自己加也没 ...

这是excel如何排序的范畴了。
如果当初定义代号时没考虑方便排序,遇到问题的时候倒也是一件苦恼的事情。

建议加多一栏位,利用excel函数,把难以合理排序的“代号”化为可按想法排序的的“数字”,再以这新增栏位排序,应该可以解决的。
初步构思是先撇除固定部分,假设代号存在三层级,
第一层级的数字乘以一万(2变成20000,03变成30000),
第二层级的数字乘以一百(2变成200,03变成300),
第三层级的数字乘以一(2变成2,03变成3),
然后总加起来,既可用于排序。


作者: gt.adan    时间: 2016-8-2 01:12
莱虫 发表于 2016-8-2 00:52
这是excel如何排序的范畴了。
如果当初定义代号时没考虑方便排序,遇到问题的时候倒也是一件苦恼的事情 ...

跳脫傳統的思維就能有新方法,謝謝萊大分享!

作者: dreamsboy    时间: 2016-8-2 01:14
莱虫 发表于 2016-8-2 00:52
这是excel如何排序的范畴了。
如果当初定义代号时没考虑方便排序,遇到问题的时候倒也是一件苦恼的事情 ...

莱大好。
莱大果然是智者,这个思路真的让我钦佩。我想了一下午没思路,莱大这一会就把排 序的总的思路问题解决了。剩下来的问题可能就是怎么解决判断代号总共有几层了。不过这些代码,要我去慢慢试出来,不知要何年马月了。起点太低,现在只能慢慢的修改一些比较小功能的宏,在慢慢的学习,希望提高点水平。恳请莱大慢慢试验我的那几个想法,继续指点我。谢谢莱大了。


作者: dreamsboy    时间: 2016-8-2 01:53
gt.adan 发表于 2016-8-2 01:12
跳脫傳統的思維就能有新方法,謝謝萊大分享!

才看到丹大来回帖了呀。谢谢丹大半夜没休息还来捧场了。

作者: dreamsboy    时间: 2016-8-2 03:02
莱虫 发表于 2016-8-2 00:52
这是excel如何排序的范畴了。
如果当初定义代号时没考虑方便排序,遇到问题的时候倒也是一件苦恼的事情 ...

莱大,刚想起来,因为在代号中,在尾段的纯数字前面,一般都有些英文的隔断符,比如我们公司的就是在正式的图号前有 JX 两个英文字母,大部分公司应该都会有特定的隔断用的英文字符段吧。这样的话可不可以在输出前,先要求在EXCEL表格的顶行的某个显眼的位置输入隔断用的字符段(比如我就只输入“JX”两个字符),然后宏文件会根据这个输入的字符段判断并截取“代号”属性中隔断用字符段后面的部分,然后再把截取到的部分按照莱大你的思路进行处理,用宏判断截取到的部分总共有几层。这里我估计要等获取到EXCEL表格中选取的所有的工程图的"代号“属性后,判断选择出层次最多的那一个数值,比如说,如果层次最多的那一个数值是五层,那么这一个数值的第一层(获取到的数值中的第一段)就把数值乘100000(最长的数据有几层,就乘1后面5个0。或者简单粗暴的,直接不管获取得到的是几层,设置只要是第一层就给它乘1后面带十个八个0的,省去判断层次和0的位数之间的关系。一般乘十个八个0的应该够了,应该不会有哪个公司和个人会把代号深化到那么多层吧。)。包含五层的数值,乘好及各层数值相加后,剩下的就是截取到的层次只有一层的数值,也得乘以五层的数值的第一层的数字乘的倍数,这样比较代号只有一层的和五层的最终数值结果时才能对了。

表述能力有点差。附件表格列出了大概的一点思路,请莱大参考以了解一下我的思路,请莱大再指点、启发。谢谢莱大。
[attach]1237491[/attach]

[attach]1237491[/attach]



作者: 莱虫    时间: 2016-8-2 13:03
dreamsboy 发表于 2016-8-2 03:02
莱大,刚想起来,因为在代号中,在尾段的纯数字前面,一般都有些英文的隔断符,比如我们公司的就是在正式 ...

先温馨提示一下,并非针对dreamsboy,而是广大的网友。
当表达较为复杂的意思时,建议适当地分段和点列形式说明,一来方便阅读者,二来更可方便自己整理思路。

回说excel的问题。
1. 要解决在单元格输入".03"变成"0.03",方法有二,一:在前端加上" ' "(单引号)字符,二:单元格设定为文字格式。
2. 利用隔断符倒是一个方法,但不太直观,倒不如使用整个项目号,如例子中的"GXCC-WGC-JX"。
3. 理解得没错,是的,加多一些"0"是为了划分层级,并可避免顺序超越个位,但相信这顺序不会到达百位(即是说单一子装配不会包含超过99件的不同部件),因此每层级两个
"0"已经非常足够。
4. 例子的装配层级只有三层,估计不太足够,编写的函数最好能应付一到五个层级。

试算表可算是工程人员必不可少的工具,甚至可说是专营的利器,
有必要花一两天时间认证学好,有朝一日当上管理阶层甚至老板,也可掌握人士和财务数据,无须每一小节也假手于人。



作者: dreamsboy    时间: 2016-8-2 13:18
莱虫 发表于 2016-8-2 13:03
先温馨提示一下,并非针对dreamsboy,而是广大的网友。
当表达较为复杂的意思时,建议适当地分段和点列 ...

莱大您好。
莱大训导得是,之前我有考虑把单元格中的数字设置成文本格式,但考虑设置成文本格式后,会不会影响数学计算。
刚试验了下,确实单元格内文本格式的内容也可以做混合运算。之前没去试一下,我错了。
谢谢莱大指点。

作者: 莱虫    时间: 2016-8-2 15:49
假设在A1单元格输入项目号

第一层的函数写法建议如下:
按A1单元内容的长度加二起读取代号两字节再乘以十的八次方。

第二层的函数写法建议如下:
当代短于项目号长度加四(相当于不含第二及以上的层级),给予0;
否则按A1单元内容的长度加五起读取代号两字节再乘以十的六次方。

第三层的函数写法建议如下:
当代短于项目号长度加七(相当于不含第三及以上的层级),给予0;
否则按A1单元内容的长度加八起读取代号两字节再乘以十的四次方。

第四层的函数写法建议如下:
当代短于项目号长度加十(相当于不含第四及以上的层级),给予0;
否则按A1单元内容的长度加十一起读取代号两字节再乘以十的二次方。

第五层的函数写法建议如下:
当代短于项目号长度加十三(相当于不含第五及以上的层级),给予0;
否则按A1单元内容的长度加十四起读取代号两字节再乘以十的零次方。

详见动画。
[attach]1237518[/attach]

作者: dreamsboy    时间: 2016-8-2 16:34
莱虫 发表于 2016-8-2 15:49
假设在A1单元格输入项目号

第一层的函数写法建议如下:

唉,莱大,我表示很惭愧,我理解了您的思路,可是这些算法和代码我完全看不懂。恐怕要辜负您的期望了。

作者: 莱虫    时间: 2016-8-2 17:18
dreamsboy 发表于 2016-8-2 16:34
唉,莱大,我表示很惭愧,我理解了您的思路,可是这些算法和代码我完全看不懂。恐怕要辜负您的期望了。

慢慢看,用心看,必定会明白的。

为什么按不直接给予excel文件,就是希望不是单单解决今天的问题,而是日后可以用得着。
通过提示(其实动画内有显示函数怎么写),亲自动手键入,可从临摹及失败的过程之中了解因由,获得更多。

整合后的函数写法见附图,一步就可以制作出排序栏位,注意无须隔行,隔行只是为了截图方便不至于过宽。
[attach]1237529[/attach]


作者: dreamsboy    时间: 2016-8-2 17:31
本帖最后由 dreamsboy 于 2016-8-2 17:33 编辑
莱虫 发表于 2016-8-2 17:18
慢慢看,用心看,必定会明白的。

为什么按不直接给予excel文件,就是希望不是单单解决今天的问题,而 ...

莱大所言甚是。我从上周五晚上开始,一直没停歇的研究学习VB到周日晚上。今天深圳台风红色预警放假,我从昨天下班又一直学习到现在都还没闭过眼呢。这几天下载学习了二十几个宏文件,就在学宏代码的用法语法。不是我不想学,实在是起点有点低了,之前都没学过VB语言,有的东西一时半会学不来。有实例的东西,我可以修修改改,达到我想实现的目的,改动量太大的东西现在真的还没那水平几天搞定。


能否请莱大把这个文件初步的做些框架出来,让我学习学习,学习的同时再慢慢的去修改一下测试一下,慢慢的提高水平?
谢莱大。


作者: 莱虫    时间: 2016-8-2 19:14
dreamsboy 发表于 2016-8-2 17:31
莱大所言甚是。我从上周五晚上开始,一直没停歇的研究学习VB到周日晚上。今天深圳台风红色预警放假,我从 ...

excel函数基本上与VB无关的,在excel环境来说,应先采用函数,不行再考虑VBA。
这是一个单纯使用函数来解决排序的例子,好吧,俺就放上excel文件供君参考。
[attach]1237530[/attach]


作者: dreamsboy    时间: 2016-8-2 19:23
莱虫 发表于 2016-8-2 19:14
excel函数基本上与VB无关的,在excel环境来说,应先采用函数,不行再考虑VBA。
这是一个单纯使用函数来 ...

谢谢莱大了。
我下载了。先去吃饭了,吃饭回来看看还搞不搞得了了。研究宏研究得二十个小时没睡了。

作者: dreamsboy    时间: 2016-8-4 23:33
莱虫 发表于 2016-8-2 19:14
excel函数基本上与VB无关的,在excel环境来说,应先采用函数,不行再考虑VBA。
这是一个单纯使用函数来 ...

莱大您好。这两天工作比较忙,在出一个项目的设备安装需求图,没有多少时间仔细研究这个文件。不过我也并没有偷懒,在手机上下了个VB教程的APP了,在有时间就瞄几眼学一下。
对于您这个文件,我主要是卡在了你的一行代码上。

=IF(MID(A5,ROUNDUP((LEN(A5)-LEN(A$1))/3,0)*3+LEN(A$1)-2,1)=".","装配","-零件-")

请问下,这一行代码,ROUNDUP((LEN(A5)-LEN(A$1))/3,0)*3 ,想请问下,为什么(LEN(A5)-LEN(A$1))的结果要除以这个3呢?这一步的思路是什么呢?是因为表里的装配体代号加上前面的符号段(这例里的.号)的字符长度都是3位吗?我试了下,如果装配体的编号超过10时,这一个部件被识别成了零件。同时后面的那例乘号和加号的混合运算的结果也会出错了,比前面的.05  .07   .08等的运算结果都要小了。且装配体的编码为.012等三位数值时,后面的混合运算的结果就报错了。出错的情况如附件和图片所示。如果用这代码的话,那就是以后部件编码最多到.09了,从.010的组件开始后面的就会有问题了(因为我们公司的规定是部件的编码前面必须得加这个数字“0”)。这个问题应该怎么解决?请莱大指点指点,谢谢。

作者: 莱虫    时间: 2016-8-5 10:24
建议一开始就尽量说出要求,像挤牙膏般,想到什么就什么,不是办法,只会让早前所做的一切都变得白做。
作者: dreamsboy    时间: 2016-8-5 22:39
莱虫 发表于 2016-8-5 10:24
建议一开始就尽量说出要求,像挤牙膏般,想到什么就什么,不是办法,只会让早前所做的一切都变得白做。

好吧,我之前没说清楚组件前面这个0并不是纯粹是为了把组件图号补足成两位数的。

作者: 大鹿    时间: 2016-8-6 16:40
貌似要二次开发
作者: dreamsboy    时间: 2016-8-7 02:28
大鹿 发表于 2016-8-6 16:40
貌似要二次开发

API 宏已经属于二次开发的范筹了吧?
作者: 大鹿    时间: 2016-8-7 12:35
dreamsboy 发表于 2016-8-7 02:28
API 宏已经属于二次开发的范筹了吧?

哦 明白
作者: sw    时间: 2016-8-12 09:06
按莱虫说法搞了一下,附件写得丑陋,代码不便公开,玩玩好了。
作者: dreamsboy    时间: 2016-8-24 15:57
sw 发表于 2016-8-12 09:06
按莱虫说法搞了一下,附件写得丑陋,代码不便公开,玩玩好了。

谢谢了。我下载了学习学习。
作者: huangjie2009    时间: 2021-12-17 22:59
kankan学习学习谢谢楼主




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3