科学网

 找回密码
  注册
科学网 标签 VBA

tag 标签: VBA

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

让EXCEL帮你念成绩单,录入校对
热度 2 cambaluc 2020-1-13 20:42
刚批完卷子!代了三门课,平时成绩和期末成绩都放在 Excel 文件中,需要录入到教务系统(不提供批量导入),也需要语音校对一遍。让 Excel 宏来帮忙吧。 文件格式:在 Sheet2 中第 A 列为学号,第 B 、 C 、 D 列为姓名、平时成绩、期末成绩,假设本班有 32 人。 在 Excel” 宏 ” , ” 查看宏 ” 中编写如下代码: Sub aaa() For i = 2 To 33 Application.Speech.Speak (Worksheets(Sheet2).Cells(i, 2).Text) Application.Speech.Speak (Worksheets(Sheet2).Cells(i, 3).Text) Application.Speech.Speak (Worksheets(Sheet2).Cells(i, 4).Text) Next End Sub 运行此宏,她就帮你读了,读姓名和数字,你可转教务模块中边听边录成绩,再运行也可边听边校对。 (office excel 2007以上版)
个人分类: VB|3928 次阅读|5 个评论
一个将名称与编码转换的小工具
dingsir 2019-12-28 22:53
在配方开发中,经常会需要将缩写与物料编码、CAS、中文名称等信息进行转换,当物料不多时,这些信息容易记住,但数量多了之后,就很难完全记住了,记错了反而容易误事。因此,我写了一个小工具来方便大家转换,免得每次用Vlookup函数来显式转换。 因为采用的是EXCEL的加载宏形式,因此你的EXCEL版本要在2007之上,并且要安装VBA,这样宏才能运行。将以下压缩包中后缀为xlam的文件复制到EXCEL的默认加载路径下(将{用户名}替换为你的电脑上的用户名): C:\\Users\\{用户名}\\AppData\\Roaming\\Microsoft\\AddIns 然后在Excel加载项中勾选“代码转换工具-public”即可使用。 因为各家使用的缩写/编码都不一样,你可以自己定义,因此,打开这个xlam文件之后,在VBA编辑环境(按Alt+F11打开),选中ThisWorkBook 然后在下面的属性栏中选择将IsAddin修改为False, 则Excel会自动打开加载宏中隐藏的表格,如下(都是随便编的数据,编码和价格不具备真实性) 除了第一行不要改,各栏的顺序不要改。第2行起各行内容都可以根据你的需要修订或增加。可以填写的区域从A2:E100都可以。如果还不够你可以修改VBA代码中定义的 PublicConstDataBlock=$A$1:$F$100 这一句来扩展。 修改完成之后,切换到VBA编辑环境,将上面的IsAddin重新改回True,再按Ctrl+S保存即可。 这个小工具提供了几个函数,CtoN表示Code→Name,也就是代码转换到名称;CtoP表示代表转换到价格;CtoCAS表示代码转换到CAS号,CtoCNname表示代码转换到中文名称。依次类推。。。 压缩包中提供了一个演示文件,基于演示用的几个数据制作的。只要加载宏已经正确加载,Demo.xlsx的函数转换就可以正常运作。 特别提示一下,因为这类对照信息往往是保密的,因此,如果你使用这个工具,可以给它加上密码,或者控制发放范围 ,以防止不必要的泄密, 这是各位使用者自己的责任。也可以给VBAProject增加密码保护,但强度不高。 为了方便大家自己修改表格数据,我把VBA工程的密码就清除了,因此代码是公开透明的,你可以随便修改。 编码-缩写-中文名等信息的转换工具(加载宏).rar
个人分类: 软件杂谈|3605 次阅读|0 个评论
最新文章|自动校对来了
热度 1 hxiuzhou 2018-9-25 08:26
PDF 全 文见: 基于逻辑原则的科技论文自动校对方法 侯修洲, 黄延红. 基于逻辑原则的科技论文自动校对方法. 中国科技期刊研究, 2018, 29(9): 920-924 科技论文在同行评议完成后 , 一般还需要经过编辑加工、校对、质检、核对清样等步骤后 , 才能正式发表 , 这些作者看不见的工作往往比较繁琐 , 还容易出现差错。 2018 年 1 月 10 日 , 国家新闻出版广电总局报刊司发出《关于对 报刊质量管理规定 ( 征求意见稿 ) 征求意见的通知》 , 对期刊质量要求比之前更为严格 , 其中最明显的调整是将期刊编校差错率从 3/10000 降低到 2/10000, 差错率超过 2/10000 的 , 其编校质量为不合格。显而易见 , 编辑在以后的工作中压力会越来越大 , 并且编辑长期陷入事务性的编校工作中 , 也难以发挥编辑的主动性和创造性。 薛子俭等人 提出了一个分步编校方法 , 该方法从 “ 论文构架核查、分类加工、常规润色、整体核对 ” 四个方面分步进行 , 条理很清楚 , 避免了漏校 , 缺点是全部需要人工参与 , 并没有减少工作量 , 也不能完全保证将每条错误检查出来。近年 , 王红剑 和黄城烟 提出了利用 VBA 编程技术在 Word 文档环境中批量替换易错字词的功能 , 可以一定程度上解放人工劳动。 龚小谨 , 朱磊 , 张仰森 等人从自然语言理解和语法分析角度对文章进行了校对研究 , 其优点是校对的颗粒度能达到词语级别 , 但是其纠错建议的有效率或首选正确率还比较低 , 与用户的要求还有较大差距 , 故其技术还有待进一步研究。另外,市场流行的黑马校对软件也是主要集中在词语的错误用法和敏感词的识别方面,其查错率也有待提高。 近年来 , 国际上大多数期刊均采用了 XML 排版 , 其优点是论文结构清晰 , 不仅可以提供丰富的阅读体验 , 而且由于其结构化特点 , 我们看到了从其结构化角度 , 来寻找科技论文内在的逻辑规律的可能性 , 找到这些规律 , 我们就可以对论文进行计算机程序辅助校对。由于 VBA 技术和 Word 文档的良好结合性 , 并且本文作者已经将 VBA 技术成功应用于 Word 文档的 XML 结构化标记和参考文献的自动加工中 , 在这些工作的基础上 , 本文尝试寻找科技论文内在的连续性、一致性和唯一性等逻辑原则 , 基于此原则和 VBA 辅助编程来对科技论文进行自动校对。本文说的编校差错指的是排版前由计算机程序识别的错误 , 并且尽量将大多数错误在排版前发现出来 , 以提高编排效率 , 避免多次编校返工。 关于 VBA 语言环境、部署及实例应用可以参考王玥等人 的文章 , 限于篇幅 , 本文不再做详细阐述。语法规则可以参考 http://www.doc88.com/p-931469800915.html 。 1 科技论文的连续性、一致性和唯一性原则 在长期的编辑工作实践中 , 我们知道 , 科技论文写作是有一定写作要求的 , 对于顺序文献编码制 , 一般要求正文中的文献引用序号必须按照顺序出现 , 也不能漏引 , 同理 , 图表序号、公式序号、章节序号也需要按照顺序出现 , 不能中断 , 这就是科技论文的连续性原则。 一致性原则主要用在著作年制文献的校对。对于著作年制 , 一般要求正文中出现的著者年需要和文后的文献严格一致 , 比如 , 正文中著者姓的大小写和拉丁文书写格式经常和文后不一致;如果正文中著者后面出现 “et al” 或 ” 等 ” 的描述 , 则要求文后文献的作者至少是 3 个;如果正文中著者后面出现 “and” 或 ” 和 ” 的描述 , 则一般要求文后文献的作者是 2 个作者 , 如果人工校对 , 则是大量而又繁琐的工作 , 并且很难避免出现疏漏或错误 . 一致性原则对于中文科技论文 , 还可以校对作者的中英文姓名和拼音是否一致 , 以及中英文地址邮编是否一致。 另外 , 无论是顺序编码制文献还是著者年制文献 , 都要求文后的每一条参考文献只能出现一次 , 不能重复出现 , 这就是文献的唯一性原则。而作者在撰写和修改论文的时候 , 由于反复增删内容或其他原因 , 经常会发生重复文献出现的情况 , 这个时候就需要对文献的唯一性进行检查和校对。 需要说明的是依照上述原则进行校对的结果 , 只是在原文中相应地方进行高亮标识 , 以提醒加工者注意 , 是建议性质的辅助校对 , 并不是强制要求用户修改 , 相关编辑部可以按照具体体例进行针对性修改 , 如有特殊情况也可以具体问题具体分析。 2 基于连续性原则的自动校对方法 以顺序文献编码制为例 , 在正文中引用文献的格式一般为 “ ”, “ ”, “ ”, “ ”, “ ” 等形式 , 其中的对开线有时也可能为全身线或 “~” 符号 , 首先我们需要识别这些描写文献序号的文字 , 在 VBA 语言环境中 , 上述文献格式可以用正则表达式来表述:“ \\ {1,3})((, |.) {1,3})?\\ ] ” , 其中“ \\ ”表示结束的方括号 , “ ( {1,3}) ”表示文献序号 , “ ((, |.) {1,3})? ”表示结束的文献序号 , 其中有“ ? ”表示结束的文献序号也可以没有 , 如果是像 “ ” 这样复杂的文献表述 , 则只需将“ ((, |.) {1,3})? ”在正则表达式中重复几次出现即可。 当我们识别了正文中所有的文献序号后 , 接下来就是判断序号的连续性问题了 , 在本文中是这样判断的 , 我们将某一处的文献序号表述内容记为 I , 将 I 处之前的文献序号表述内容记为 I -1, 设定 I -1 处的最大文献序号为 Max, 显然 , 正文中第 1 处文献序号的最大值应为 1 。当程序执行到第 I 处时 , 求取该处文献序号的最大值和最小值 , 分别记为 I max , I min , 此时判断第 I 处文献序号是否和第 I -1 处文献连续 , 可以分为三种情况 , 如图 1 所示: 当 I max ≤Max, 则 I 处文献和 I -1 处文献连续 ; 当 I min Max, 则 I 处文献和 I -1 处文献不连续 , 此时将 Max 重新赋值为 I max ; 当 I max Max 并且 I min ≤Max, 此时则判断 Max~ I max 之间的每一个数是否在第 I 处文献序号内容中包含 , 如果包含 , 则判断为连续 , 否则 , 则判断为不连续 , 同时将将 Max 重新赋值为 I max 。 图 1 顺序文献编码制连续性校对流程图 在程序运行中我们将每一处连续的文献序号标为蓝色 , 将不连续的文献序号标为红色字体并高亮 , 如图 2 所示 , 见方框标示。 图 2 顺序文献编码制文献序号连续性校对示意图 图表序号、公式序号判断规则和顺序编码制文献序号连续性判断规则一致 , 此处不再赘述。 对于章节标题序号的连续性判断 , 则需要事先定位章节标题的位置 , 章节标题标记方法可以参考文献 。 对于一级标题 , 则只需提取标题前面的序号 , 然后按照自然数来判断是否连续即可 , 二级标题和三级标题的序号连续性判断则不能简单套用自然数来判断。一般二级标题序号为“ 1.1, 1.2, 1.3 ” , “ 2.1, 2.2, 2.3 ”等形式 , 三级标题序号为“ 1.1.1, 1.1.2, 1.1.3 ” , “ 2.1.1, 2.1.2, 2.1.3 ”等形式。针对二级和三级标题 , 当我们成功提取标题序号后 , 首先将序号中的点忽略掉 , 那么也是相当于比较自然数顺序序列。与判断一级标题序号连续性不同的是 , 当考虑二级标题序号的连续性时 , 既要满足自然数连续性规则 , 同时该二级标题序号的第一位数需要和紧邻的一级标题序号一致;当考虑三级标题序号的连续性时 , 同样还要考虑该三级标题序号的前两位数与紧邻的二级标题序号一致。对于不连续的章节标题 , 我们用黄色高亮标明 , 见图 3 所示 , 见方框标示。 图 3 章节序号不连续示意图 3 基于一致性原则的自动校对方法 一致性校对主要涉及到著作年制文献的校对 , 一般著作年制文献在正文中引用时 , 其表述方式为“姓 , 年”、“姓 et al/ 等 , 年”、“姓 1 and/ 和 姓 2, 年”、“姓 ( 年 ) ”、“姓 et al/ 等 ( 年 ) ”和“姓 1 and/ 和 姓 2( 年 ) ”等等形式。基于以上格式 , 我们编写了识别著者年的正则表达式: ((\\b +\\b(( and | 和 )\\b +\\b)?)|( {2, 3}( 和 ( {2, 3}))?))( 等人 | 等 | et al.| et al|)?(, )?( )?(\\()?((20|19|18)( {2}))( )?(\\))? 当完成正文的著者年信息识别后 , 还需要将每一条的识别内容和文后参考文献进行比较 , 其流程如图 4 所示。基于文献 , 我们已经成功将参考文献进行了自动加工和 XML 标记拆分 , 绝大多数参考文献都完成了姓名、文题、刊名、年、卷、页码等信息拆分 ( 如图 5), 我们只要将正文中识别的姓和年和文后已经拆分的文献信息中的姓和年进行匹配比较 , 如果前后验证没问题则标上蓝色 , 如果前后不对应则高亮并用红色字体标识 , 与图 5 文献对应的校对示例如图 6 所示。 图 4 著者年制文献一致性校对流程图 图 5 参考文献 XML 标记加工示意图 图 6 著者年制参考文献一致性校对示意图 ( 第 1 条文献作者 Colwell 多了 s, 第 2 条文献作者 Ibrahim 多了 s ) 对于中文版论文 , 因为我们已经利用 VBA 程序将文档的中英文作者和地址进行了标记 , 所以我们很方便提取每一个中英文作者和地址 , 先将中文作者的姓名转换英文姓名 , 然后去和英文作者进行匹配比较 , 如果不一致则标黄色高亮 , 同理 , 我们提取了中英文地址的邮编信息 , 如果不一致 , 同样黄色高亮提示 , 见图 7 所示。同时 , 如果中英文作者和地址的个数不一致 , 将弹窗提醒加工人员注意。 图 7 中英文作者姓名和邮编校对示意图 , 见方框标示 4 基于参考文献唯一性原则的校对方法 基于文献 , 我们已经将参考文献进行了 XML 拆分 , 并且获取了文献的 doi 信息 , 如图 5 所示 , 那么提取每条参考文献的 doi 信息 , 如果发现有相同 doi 信息的参考文献 , 则判断这些文献是重复文献 , 程序会将重复文献都标上红色字体 , 具体示例如图 8 所示 , 见方框标示。 图 8 参考文献唯一性校对示意图 ( 文献 1 和 3 的 doi 相同 , 视为重复文献 ) 5 结论 本文在已有工作的基础上 , 通过寻找全文逻辑的连续性、一致性和唯一性原则 , 利用这些原则对科技论文进行了全文自动校对 , 不仅减轻了加工人员的劳动量 , 减少了审校的轮次 , 也避免了低级编校错误的出现 , 提高了出版效率和速度 , 同时也为后期 Word 文档转换为 XML 文件提供了质量保证。 需要说明的是 , 这些原则是作者在《中国科学》系列刊物编校实践中总结出来的 , 依照上述原则进行校对的结果 , 是建议性质的辅助校对 , 相关编辑部可以按照具体体例进行针对性修改。 连续性原则适用于 论文中不连续的文献序号、章节序号、图表序号、公式序号; 一致性原则适用于著作年制文献前后不一致的表述 , 中英文作者姓名拼音 , 中英文地址邮编; 唯一性原则适用于文后重复出现的参考文献。 关于论文自动校对,大致包含逻辑和语法校对两个方向,本文侧重于逻辑原则,将来是否有可能包含所有方面的且性能良好的校对方法,我们也很期待。 参考文献 1. 薛子俭 , 付利 . 科技论文分步编校法及注意事项 . 中国科技期刊研究 , 2012, 23(2): 325-328. 2. 王红剑 , 高爱英 , 游苏宁 . 利用 WORD 进行自动编校 . 中国科技期刊研究 , 2009, 20(3): 502-503. 3. 黄城烟 . 基于 WORD 宏技术的易错词自动检索与校对 . 编辑学报 , 2014, 26(4): 356-358. 4. 龚小谨 , 罗振声 , 骆卫华 . 中文文本自动校对中的语法错误检查 . 计算机工程与应用 , 2003, 8: 98-100, 127 5. 朱磊 . 自然语言处理之汉语文本自动校对 . 成都 : 电子科技大学 , 2006 6. 张仰森 , 俞士汶 . 文本自动校对技术研究综述 . 计算机应用研究 , 2006, (6): 8-12 7. 侯修洲 , 黄延红 . 基于 VBA 的 Word 文档 XML 结构化标记方法 . 编辑学报 , 2017, 29(5): 471-474. 8. 侯修洲 , 黄延红 . 利用 VBA 程序和 HTTPS 协议获取参考文献的 DOI 信息 . 编辑学报 , 2016, 28(5): 466-469. 9. 侯修洲 , 黄延红 . 基于 CrossRef 数据库的参考文献自动加工及 XML 标引方法 . 编辑学报 , 2017, 29(1): 70-72. 10. 王玥 , 毛善锋 , 刘谦 . Word 文档中通过 CrossRef 自动查询与整合英文参考文献 DOI 的实践 . 中国科技期刊研究 , 2013, 24(2): 333-337.
5538 次阅读|4 个评论
VBA编程中经常碰到的错误
dingsir 2018-2-24 10:12
VBA编程十几年了,这些年我犯过无数的错误,收集一下以娱自己: 1.忘记设定option explicit. 由于拼写错误而导致产生的新变量,而不是打算写的那个变量. 2.忘记写对应的End if 或 End with,这个也非常常见. 3.变量范围没有写正确,该Public的写成了Private(反之可以运行但是不太安全) 4.最奇葩的一次,声明一个字串,写成了 dim s,而这个值正好用来存放数值的字串,结果直接整成了长型().正确的应该是dim s$ 5.比较奇葩的一次,比较a/b/c/d四个值中的最小值,根据谁是最小值(类似min=a)来写四个平行的分支代码.没有想到(min=a)的分支执行完之后,碰到一个(min=b)也成立的情况,结果两个分支都走了一次,出错了.不是调试还真看不出来. 6.总喜欢在VBA在设置引用FileSystemObject的VBS运行时库,却忘记他人的机子上可能没有这样的设置. 7.忘记检查被除数是否为0 8.对象没有确定是存在就调用其方法(这个主要在首次写某段代码时出现). 9.很高兴还能在VBA中使用goto 语句 10.以前总喜欢在代码中使用数字硬编码,比如单元格的地址(行/列),数组的大小尺寸,现在好一点,习惯在头部集中声明. 11.忘记在字串形式存放的代码中加入应有的引号(SQL语句,回调函数等) 12.用integer数值来存放EXCEL中Range的行数,有时会溢出出错(EXCEL2016的行数远远超过整型值的上限). 13.在32位EXCEL中写的代码,在64位EXCEL中有的代码不能运行(涉及API的),要改. 14.拿起键盘就写,写到一半发现思路混乱,越来越混乱写不下去了.只好推倒重来. 15.有时感觉写来写去,编码水平没有什么提升,很无望; 16.有时总在一些非常细节的小问题上绞尽脑汁,很挫败.比如昨天不小心将自定义的菜单命名为Custom之后,出现了无法showpopup的问题,查来查去找不出原因. 山穷水尽之后换个名字竟然就解决了. 16. 待更新
个人分类: 软件杂谈|3259 次阅读|0 个评论
EXCEL 分列 (TextToColumns) 的C#代码
dingsir 2017-12-15 00:43
EXCEL中有一个有用的功能,叫做“分列”,顾名思义,EXCEL中将一串文本根据选择的分隔符对文本进行分解,从而产生几列数据。这个功能最常用的地方应该是导入一些文本形式的数据时,特别有用。比如导入CSV格式的数据。 举个简单的例子,假设有一行数据是这样的,LIPF6:13%:Salt 原来的数据表示 第1列为LIPF6,是物质名称,文本性质; 第2列为该物质的含量,用13%表示;第3列为该物质的归类,Salt类。 导入到EXCEL中时,如果不分列,这样的一个文本串不便于计算。因此,选中这(些)个单元格,再点击“数据”菜单下的分列,根据向导,选择冒号作为分隔符,就可以将它分为三列了。 EXCEL的这个操作,正是Range对象的一个方法TextToColumns完成的。我们来看一下录制宏时记录下的代码 Selection. TextToColumns Destination:=Range(A1), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar :=:, _ FieldInfo:= Array(Array(1, 2), Array(2, 1),Array(3,2)) , TrailingMinusNumbers:=True Selection表示我们选中的单元格对象,类型即Range, Destination参数指定拆解后的数据左上角的位置,此处为A1格;DataType表明数据为分隔类型( xlDelimited), 还 有一种是定宽类型( xlFixedWidth表示) ; TextQualifier 参数 指定 文本边界的符号为双引号类型; ConsecutiveDelimiter参数指定是否把连续的多个某分隔符视为一个,此处为否(false); Tab参数说明是否选用制表符作为分隔符,如果是则此参数为True,不是则为False. 后面几个参数是同样的意思: Semicolon 即分号;Comma为逗号,Space为空格,这几个的用法都是一样的,它们作为分隔符,则该参数指定为True,否则为False. 因为我们的例子中用冒号作为分隔符,不在这几个之列,因此后面的Other参数设置为True,表示使用其它字符作为分隔符,同时我们必须指定紧接着的OtherChar 参数为冒号. 再后面这个FieldInfo参数比较难理解,我研究了好久才弄明白,多写一点。 它是一个数组的数组,用于指定分列之后的各列的内容类型。这个例 子里数组有三个元素,每个元素为一对值。 拿第一个元素Array(1,2)来说吧,第一个参数1代表说明这是拆解后的第1列的内容。 第二个参数2代表该列(即第1列)的内容类型。这个2对应是什么类型呢? 见下面的定义: public enum XlColumnDataType { xlGeneralFormat = 1, //通用类型 xlTextFormat = 2, //文本 xlMDYFormat = 3, //月日年 xlDMYFormat = 4, //日月年 xlYMDFormat = 5, //年月日 xlMYDFormat = 6, xlDYMFormat = 7, xlYDMFormat = 8, xlSkipColumn = 9, //忽略此列 xlEMDFormat = 10 } 原来2代表分列后的内容是文本 (xlTextFormat = 2) 。 类似的,第2个元素Array(2,1)代表分列后第2列为通用类型即xlGeneralFormat( xlGeneralFormat = 1 ). 上述3~8均为日期的不同格式,D为日,M为月,Y为年,按顺序排列就明白了。 这里面比较有意思的有几点: 1.列的内容类型如果没有指定,就按通用类型解析(类型1)。 2.列的顺序可以可以打乱。比如上面的写成 FieldInfo:= Array( Array(2, 1),Array(3,2), Array(1, 2) ) 也是可以的。 3. 如果你不想解析出这一列的内容,指定其类型为9也就是xlSkipColumn就可以。这样看来,所谓的第几列是根据文本的内容来推算的,不是实际解析完成后的列数。 接下来后面还有几个参数: DecimalSeparator 为字符串,表示小数点的分隔符,默认为系统设置,你也可以不设(缺着就行);ThousandsSeparator也是字符串,指定千分位分隔符,默认也是系统设置。TrailingMinusNumbers为逻辑值,True表示认可负号开始的数字,False表示不接受负号开始的数字。 在C#中这样写的。 private void button1_Click(object sender, EventArgs e) { Excel.Worksheet asht = Globals.ThisWorkbook.Application.ActiveSheet; asht.get_Range(A1:A6).Select(); Excel.Range selection = Globals.ThisWorkbook.Application.Selection; int myField = { { 1, 2 }, { 2, 1 },{ 3, 2 } }; selection.TextToColumns( asht.get_Range(A1) , Excel.XlTextParsingType. xlDelimited , Excel.XlTextQualifier.xlTextQualifierDoubleQuote, false, false, false, false, false, true, :, myField ,.,,,true); } 针对上面的例子,比如说字串 “LIPF6:13%:Salt, 使用上面的方法进行分列,得到的13%被视为通用类型(对应中间的那个{2,1}即第2列为类型1即通用类型,分列之后的15% EXCEL会视为数字。如果你将{2,1} 改成{2,2},即第2列当成类型2(文本),EXCEL就会显示 提示这是以文本形式存储的数字。见下图的对比。 最后是EXCEL的文件例子(需要运行宏的权限才能) 分列示例.rar
个人分类: 软件杂谈|9945 次阅读|0 个评论
一个奇怪的EXCEL VBA模块出错问题
dingsir 2017-9-29 19:18
今天在打开配方处理软件时,突然碰到问题了,EXCEL无法读出VBA的部分.恢复的措施就是删除了代码. 我很奇怪,前面使用时也没有出现VBA出错的迹象啊. OK,按它的建议,打开文件再看,所有的代码都丢光了,这个可不能接受! 于是果断的不保存文件,关闭了EXCEL. 再找出以前备份的版本,打开还是类似的毛病,无法读出代码部分.这就怪了,我备份的时候这个文件好好的,不正常我也不备份它啊. 那么,是EXCEL上装的排版插件出问题了吗? 卸掉再打开这个文件,问题依旧.说明不是这个原因. 那是VBA的模块出问题了吗? 我重新安装了VBA模块,问题还是存在.包括重启后再重新安装VBA模块也是如此. 最后看了一下OFFICE的安装时间,竟然就是今天.冤枉啊,我明明今天没有安装过OFFICE! 难道是OFFICE自动更新了? 原因也许是--OFFICE自动更新带来了毛病,导致前面编写的代码模块读取时出故障了? 那么,试试重新安装OFFICE看看. 先把它卸载了.再安装一下先前的版本.--果然什么毛病都没有了,再打开XLSM文件, 正常得很! 竟然,真是Office自动更新带来的BUG!! 好在我没有相信是文件损坏的问题. 我晕! 好端端的程序竟然被自动更新搞出毛病来了!
个人分类: 软件杂谈|4388 次阅读|0 个评论
一个解析SOOPAT专利信息并追加到NoteExpress的小工具(开源)
dingsir 2017-6-4 13:07
NoteExpress是一个不错的国产文献数据库,前几年我研究过它的接口使用,可以利用它的接口进入导入和导出数据,只是官方没有公开具体的使用说明,只好自己摸索。好在类型库中的名称比较规范,还多少可以猜测一些出来,因此还可以玩玩. 因为本人比较喜欢读专利,看到感兴趣的专利信息就在NoteExpress数据库中保存起来。前些年我经常在国家知识产权局官方网站上看,那时网站速度还比较快,现在辄是动不动就跳出“流量太大”要识别数字认证,烦不胜烦,所以就改用Soopat了,虽然要付费,但体验相当好. 为了保存一些专利的信息,如申请号,申请时间,名称,申请人等,最早的时候我很勤奋,手工输入,在NE中新建一个题录(就是一条记录)再一个字段一个字段的手工输入,虽然打字很快,但速度还是慢,特别是要在NE中一个个字段切换来切换去,相当的麻烦。 后来就想了个办法,用Delphi写了个文本处理工具,只要选中网页内容一拖到界面上就自动将内容复制到文本控件,再解析文本的内容找出各项信息,保存到INI文件中。这样就非常快的将要输入的专利相关信息解析好了。然后摸索了很久, 边学边尝试,写了一个集成到资源管理器的DLL服务器,在选择相应的INI文件后,点击弹出菜单的设定项,调用NE的接口将文本内容按字段一项项导入到NE中。就这样玩了几年,积累了6000多条感兴趣的专利信息记录。 没想到2015年我在用硬盘对拷的工具备份时,由于硬件的问题,将我的硬盘损坏了两个大分区,损坏了大量的数据,生生的把这些非常宝贵的资料弄没了(在京东网买的,投诉无人理睬,自从之后,我再也不买这家(ORICO)的硬件,再也不用京东的账号)。 后来,由于国家知识产权局的网站改版,网页格式变了,我的浏览器也不再用maxthon而是改成了Chrome,这个工具也不好用了。由于学艺不精,用Delhpi写这些东西太累,慢慢的这套工具不用了。 在接触正则表达式之后,发现这个玩意正好是解析文本的好帮手,用来处理专利信息非常适合,而OFFICE中正好有正则的引擎,于是想用WORD的VBA来做个解析工具看看,这个小工具就这么诞生了。 思路:从网页复制文本,在工具中粘贴,粘贴后利用正则表达式解析文本,得到各种信息放到文本框,再利用NoteExpress的接口将这些分解好的信息导入到NE中生成题录。 详细的我就不讲了。如果你觉得有用,请Email 告诉我一声就够了,谢谢。 不过,如果你的OFFICE没有启用宏,这个工具是无法运行的。宏是很强大的工具,非常有用,不能因为曾经出现过宏病毒就谈虎色变,我特意开源了,有兴趣你可以自己看看代码是否安全。 放两张相关的图如下,界面左下角 两个文本框 供用户分别输入关键词和注释 ,关键词用空格分开即开,保存时会自动将空格替换成分号以适应NE的要求。 因为我的电脑是64位Win10 + 64位OFFICE2016, 其它版本我没测试,有问题请Email 专利信息提取工具.rar
个人分类: 软件杂谈|7150 次阅读|0 个评论
利用VBA程序和HTTPS协议获取参考文献的DOI信息
hxiuzhou 2016-11-4 09:09
摘要 为了丰富文章信息,提升读者的阅读体验 , 本文编写了 VBA 程序,并利用 HTTPS 协议自动获取参考文献的 DOI 信息和超链接。经测试,运行 VBA 程序后,每 50 条参考文献大约需要 1 分钟即可解析完成,对注册过 DOI 的期刊文献的命中成功率几乎达到 100% 。对参考文献的体例结构进行精准分析和拆分是 VBA 程序运行成功的基础,向 CrossRef 机构申请成为会员使得 DOI 数据解析不受数据条目的限制,并对今后的数据挖掘提供方便。 关键词 VBA 程序 ; HTTPS 协议 ; DOI 2015 年文化产业专项资金项目 “ 中国科技类学术期刊国际传播平台 ” 支持 Email: hxz@scichina.or g PDF全文见: 侯修洲 , 黄延红 . 利用 VBA 程序和 HTTPS 协议获取参考文献的 doi 信息 . 编辑学报 , 2016, 28(5): 466-469 数字对象唯一标识符 DOI (Digital Object Identifier) 是辨识文献关联信息资源的关键字段信息,通过 DOI 可以快速链接到出版商网站发布的原文网页,也可以获取到该文献的完整 Metadata 元数据,方便读者下载和管理文献,在网络信息资源利用及文本挖掘方面有不可替代的地位和作用 。近年以来,出版商为了丰富文章信息,提升读者的阅读体验,往往会在参考文献中列出各个数据库的链接目标源, DOI 及其相关链接便是其中的一种。同时我国已经于 2015 年 12 月公布了新的参考文献著录标准 GB /T 7714—2015 《信息与文献 参考文献著录规则》 , 在标准中已经明确将 DOI 作为必备著录项目 。 但是在实际编辑出版中 , 出版商如何快速获取参考文献的 DOI 信息呢,在搜索引擎逐篇查询显然不可取,效率、时间和质量都难以保证。 VBA 程序 (Visual Basic for Applications) 在编辑出版工作中的应用已经有多人进行了尝试 ,本文充分利用 CrossRef 机构的会员身份,尝试借助 VBA 程序和 HTTPS 协议自动获取 Word 文档中的参考文献 DOI 。 1 DOI 查询方法 1.1 简单查询方法 DOI 作为 CrossRef 网站 (www.crossref.org) 的核心产品,该网站提供了查询 DOI 的几个方式 : 首先可以在其官方首页搜索关键词或主题检索文献信息,可以间接查询到 DOI 信息 ; 其次,该网站提供了一个简单查询页面 ( http://www.crossref.org/simpleTextQuery ), 任何人都可以在这个页面注册 Email 账户,然后将本地的文献信息拷贝到 ”Enter text inthe box below” 搜索框查询 DOI 信息。 每次查询时允许多条批量查询,并且可以附带查询 PubMed IDs 信息,但是该方法限制每个月最多只能查询 1000 条,并且还需要将返回的结果网页的数据复制到 Word 文档中,由于复制的仅仅是文本信息,原文档的格式也难以保留,并且每一个步骤都是手动的,效率也不是很高。中国肺癌杂志的王玥和毛善锋等人 利用 VBA 编程在 Word 中实现了自动调用简单查询网页地址、自动填充 email 和参考文献等功能,但是每个月 1000 条的文献查询限制阻碍了该方法的推广,并且由于每个刊的参考文献体例格式不一样,实际上, CrossRef 网站无法和待查的参考文献作出精确匹配,并且这个简单查询网页的核心只是一个模糊查询算法,难以精准锁定返回每篇文献的 DOI 。 1.2 利用 API 接口查询 DOI 的方式 CrossRef 网站已经认识到了简单查询页面不够精准的问题,并且已经开发了一套通过 API(ApplicationProgramming Interface, 应用程序编程接口 ) 精准锁定 DOI 的方法,主要包含两类,即 OpenUrl 开放链接源和 HTTPS 协议,这两种方式都允许会员和普通 email 用户查询,唯一区别是会员查询没有条数限制。 需要说明的是,由于注册 DOI 信息的主要是科技期刊文献, CrossRef 网站并不提供基于 API 接口的书籍、专利、博士论文、会议文集等其他形式的文献查询,所以本文讨论的也主要是如何获取期刊文献的 DOI 信息。 1.2.1 OpenUrl 开放链接源查询 DOI 通过 OpenUrl 开放链接源查询 DOI( http://help.crossref.org/using_the_open_url_resolver ), 对于会员,其查询格式如下,其中黑色字体部分是用户的用户名和密码: https://DOI.crossref.org/openurl?pid= username:password aulast=Maas%20LRMtitle=JOURNAL%20OF%20PHYSICAL%20OCEANOGRAPHYvolume=32issue=3spage=870date=2002 对于普通 email 账户,只需将上面网址中的 “username:password” 替换为注册过的 email 账户名即可。 不过无论是会员还是普通用户,对于 OpenUrl 开放链接源查询方式 ,上述地址最后返回的网页只是出版商的文章详情页,至于用户怎么从出版商的网页上获取 DOI 信息, CrossRef 是不负责查询的,由于各个出版商的网页格式各种各样,如果想通过网页抓取 DOI 文本信息,这对程序设计是一个很大的挑战。 1.2.2 HTTPS 协议查询 DOI 通过 HTTPS 协议查询 DOI( http://help.crossref.org/using_http ), 对于会员,其查询格式如下,其中黑色字体部分是用户的用户名和密码: https://DOI.crossref.org/servlet/query?usr= USERNAME pwd= PASSWORD qdata=|%20Natl%20Acad.%20Sci.%20USA|Zhou|94|24|13215|1997||| 上述网址中 ”qdata=” 之后每一个竖线间隔对应一个字段,分别为刊名、第一作者的姓、卷、期、首页码、出版年。需要提醒注意的是,该网址末尾最后三个竖线不能省略,否则不能获取 DOI 信息。 对于普通 email 账户,需要将上面网址中的 “usr=USERNAMEpwd=PASSWORD” 替换为注册过的 email 账户名即可 , 其代码为 “pid=email 账户名 ” 。 相比 OpenUrl 开放链接源查询方式, HTTPS 协议更简单快捷,比如通过 HTTPS 协议,网页只显示一串简单文本,由于无关信息少,所以打开网页速度非常快,并且可以直接在返回的网页文本中显示 DOI ,该字段信息被固定在最后一个竖线的末尾,方便后续程序来获取该文献的 DOI 信息,如图 1 所示。 图 1 利用 HTTPS 协议获取文献 DOI 信息的示意图 2 利用 VBA 程序和 HTTPS 协议 如果我们想利用 HTTPS 协议自动获取每条参考文献的 DOI ,首先面临的是 HTTPS 协议网址如何获取到文献的基本元数据,并且通过文献的元数据能够唯一确定这篇文献。一般来说,只要解析出文献的刊名、年、卷、首页码即可唯一确定文献,在 WORD 文档中,解析文献的刊名 - 出版年 - 卷 - 首页码元数据、启动 HTTPS 协议网址、获取到返回网页的文本并解析出 DOI 信息,以及最后决定性的一步,即将该 DOI 信息按照一定的格式填写到文献末尾 , 所有这些任务都可以交给 VBA 程序来完成。 2.1 解析文献元数据 以 Science ChinaPhysics, Mechanics Astronomy 一篇参考文献为例,我们尝试分析一下这篇文献的体例格式: “ Roberts P H,Glatzmaier G A. A three-dimensional self-consistent computer simulation of ageomagnetic field reversal. Nature, 1995,377: 203–209” 。经过分析,我们得出结论:这篇文献的体例为【作者 . 文题 . 刊名 , 年 , 卷 : 首页码 – 尾页码】,那么转换为程序语言则需要首先识别出【 * . * . * , * , * : * 】这样的段落,然后再作数据解析拆分,即能得到该参考文献的刊、年、卷、首页码信息,其中 * 为通配符,句点、逗号和冒号则是拆分段落中各元素时的标记位置,拆分函数代码如下: n1= InStr(x, .) ‘ 第一个句点出现的位置 n2= InStr(n1 + 1, x, .) ‘ 第二个句点出现的位置 n3= InStr(n2 + 1, x, ,) ‘ 第二个句点之后第一个逗号的位置 n4= InStr(n3 + 1, x, ,) ‘ 第二个句点之后第二个逗号的位置 n5 = InStr(n4 + 1, x, :) ‘ 第二个句点之后第二个逗号之后第一个冒号的位置 上述代码中, Instr 为 VBA 中的字符串函数,主要功能是获取指定字符在字符串首次出现的位置,以 “n2= InStr(n1 + 1, x, .)” 为例,其中, n1+1 是寻找的起始位置, x 为寻找的字符串, ”.” 是寻找的字符。后面 “‘” 代表注释部分。 接下来我们要根据上述拆分点解析出具体数据,代码如下: j = Trim(Mid(x, n2 + 1, n3 - n2 - 1)) ‘ 期刊名 year = Trim(Mid(x, n3 + 1, n4 - n3 - 1)) ‘ 出版年 vol = Trim(Mid(x, n4 + 1, n5 - n4 - 1)) ‘ 卷 If InStr(vol, () 0 Then vol = Trim(Left(vol, InStr(vol, ()- 1)) End If ref.SetRange ref.Start + n5 + 1, ref.End fpage = Trim(ref.Words(1).Text) 其中, Trim 函数功能为删掉字段首尾空格, Mid, Left 函数为取值函数,其意义和 Excel 中的同名函数一致。 2.2 启动并发送 HTTPS 协议 当我们获得了文献的关键数据之后,就可以启动 HTTPS 协议了,具体过程如下: link= https://DOI.crossref.org/servlet/query?usr= 用户名 pwd= 密码 qdata= “|” j “|” “|” vol “|” “|” fpage “|” year “|” “|” “|” ‘ 组合为 HTTPS 协议网址 Sethttp = CreateObject(Microsoft.XMLHTTP) http.OpenPOST, link, False http.send ‘ 发送 http 协议请求网址 2.3 获取返回数据并解析 DOI 信息 Ifhttp.Status = 200 Then re= http.responsetext ‘ 获取 http 协议返回文本 DOI= Trim(Mid(re, InStrRev(re, |) + 1, Len(re) - InStrRev(re,|) - 1)) ‘ 解析 DOI 数据 ref.SetRangeref.End-1, ref.End – 1 ‘ 创建写入位置 ref.Select ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range,Address:=http://dx.doi.org/ DOI, TextToDisplay:= EndIf 3 主函数过程 综合上述代码,主函数过程如下: SubDOI() Setmyrange = Selection.Range ‘ 对选定的段落进行操作 ForEach i In myrange.Paragraphs Set ref =i.Range If ref Like*.*.*,*,*:* Then x = ref.Text ‘ 提取识别段落的文本 “2.1 解析文献元数据相关代码 ” “2.2 启动并发送 HTTPS 协议相关代码 ” “2.3 获取返回数据并解析 DOI 信息相关代码 ” End If Next End Sub 需要说明的是,必须先选中参考文献,才可以运行 VBA 程序,有关 VBA 程序的函数解释、界面介绍、录制宏及运行程序等方面可以参考文献 , 经测试,运行 50 条参考文献查询大概需要 1 分钟, 对注册过 DOI 的期刊文献的命中成功率几乎达到 100% 。 最终运行程序后的结果如图 2 所示 , 图中 CrossRef 已经自动带上了 DOI 的超链接。 图 2 利用 VBA 程序和 HTTPS 协议获取文献 DOI 信息的示意图 4 总结 本文利用 VBA 程序和 HTTPS 协议成功自动解析出了参考文献的 DOI 信息,需要说明的是,由于期刊均有自己特有的文献体例格式,所以本文中的拆分规则不可能也没必要去适应所有期刊的体例格式,这里只是提供一个解决问题的思路,具体问题还需具体分析,比如还是上面那篇文献,有的期刊体例格式可能是如下形式: “P. H. Roberts,and G. A. Glatzmaier, A three-dimensional self-consistent computer simulationof a geomagnetic field reversal, Nature 377, 203 (1995)” ,经分析,此体例可以拆分为【 *and 作者 , 文题 , 刊名 卷 , 首页码 ( 年 ) 】,那么转换为程序语言则需要首先识别出【 *and*, *, * (*) 】这样的段落 , 然后再按照这个数据特点进行进一步的拆分。 此外,注册为 CrossRef 网站的会员非常必要,相比普通 email 用户,会员用户获取该网站的引文信息更加便捷,几乎没有任何限制,并且可以免费获得 CrossRef 的技术支持。 5 参考文献 任瑞娟 , 孙玲玲 , 赵然 , 等 . DOI 在网络信息资源管理中的应用价值分析 . 情报科学 , 2010, 28(8): 1143-1146,1228 张欣欣 , 缪弈洲 , 张月红 . CrossRef 文本和数据挖掘服务 —— 《浙江大学学报 ( 英文版 ) 》的实践 . 中国科技期刊研究 , 2015, 26(6): 594-599 信息与文献 参考文献著录规则 : GB/T 7714—2015 . 北京 : 中国标准出版社 , 2015 陈浩元 . GB/T 7714 新标准对旧标准的主要修改及实施要点提示 . 编辑学报 , 2015(04): 339-343 刘铁英 , 张小白 , 叶慧玲 . Word VBA 及宏在科技期刊编辑中的应用 . 编辑学报 , 2007, 19(1): 47-48 游中胜 , 李若溪 , 欧红叶 , 等 . 利用 WordVBA 及宏实现编校信息快速查询 . 编辑学报 , 2009, 21(1): 72-73 王玥 , 毛善锋 , 刘谦 . Word 文档中通过 CrossRef 自动查询与整合英文参考文献 DOI 的实践 . 中国科技期刊研究 , 2013, 24(2):333-337 黄美君 , 姜爱蓉 . 合适的链接 最佳的服务 ——SFX 与 CrossRef/DOI 交互作用探讨 . 图书情报工作 , 2006, 50(3):93-96 李广建 , 李亚子 , 蒋君 . OpenURL 标准的版本演化及比较分析 . 图书馆杂志 , 2009, 28(7):53-59
5192 次阅读|0 个评论
[转载]VBA如何判断在指定字符串中是否有指定字符
lucheng918 2016-4-28 20:47
Sub test1() Dim str As String str = 英属维尔京群岛持续发展控股有限公司、刘敦辉 If InStr(str, 、) Then MsgBox 包含 Else MsgBox 不包含 End If End Sub Sub test2() Dim str As String str = 英属维尔京群岛持续发展控股有限公司、刘敦辉 If str Like *、* Then MsgBox 包含 Else MsgBox 不包含 End If End Sub
个人分类: VBA|4003 次阅读|0 个评论
VBA按照标点分割excel的字符串
lucheng918 2014-2-25 21:05
城建档案*(管理+信息管理)*系统 电力*远程*培训*系统*(总站+主站)*分站 (泄漏 + 漏泄)* (通信 + 通讯)*(矿 + 井)*(无源 + 宽频) 建筑 *(施工+脚手架+模板工程+基坑支护)*(系统+平台+软件) 单片机*(机房+基站)*(通风+新风+换气+排气+降温+散热+温控) (脐橙+水果+农产品+茶)*(安全+质量)* 追溯 *(系统+平台) (探伤车+钢轨)*(缺陷+伤损+标识)*(定位+GPS+图像识别+视频监控) 光纤光栅 * 桥 + 九江 * 长江 * 桥 (隧道 + 桥梁 + 桥隧)* 三维 *(成图 + 建模 + 可视 + 动态浏览)* 地质 将以上表格中数据按照标点分割成以下格式: 根据标点分割字符2014.2.25.xlsm 3G * P2P * H.264 * 多方 * ( 通信 + 通讯 + 电话 ) ( 招商 + 引资 ) * ( 系统 + 平台 + 软件 + 工作流 ) 城建档案 * ( 管理 + 信息管理 ) * 电力 * 远程 * 培训 * 系统 * ( 总站 + 主站 ) * ( 泄漏 + 漏泄 ) * ( 通信 + 通讯 ) * ( 矿 + 井 建筑 * ( 施工 + 脚手架 + 模板工程 + 基坑支护 ) * ( 系统 + 平台 + 单片机 * ( 机房 + 基站 ) * ( 通风 + 新风 + 换气 + 排气 + ( 脐橙 + 水果 + 农产品 + 茶 ) * ( 安全 + 质量 ) * 追溯 ( 探伤车 + 钢轨 ) * ( 缺陷 + 伤损 + 标识 ) * ( 定位 + 光纤光栅 * 桥 + 九江 * 长江 * ( 隧道 + 桥梁 + 桥隧 ) * 三维 * ( 成图 + 建模 + 可视 + SmarTeam * ( Oracle + 电子仓库 ) * vba程序 Sub cutStringBySymbol() ' ' cut Macro ' Dim i, i1, j, k1, k2, m, n As Integer Dim sWord, sRight, sMatch, sLeft, sMid As String For i = 1 To 1113 '定义行数 sWord = Sheet1.Cells(i, 1) m = InStr(1, sWord, *) n = InStr(1, sWord, +) k1 = InStr(1, sWord, () k2 = InStr(1, sWord, )) Sheet2.Cells(i, 1) = m Sheet2.Cells(i, 2) = n Sheet2.Cells(i, 3) = k1 Sheet2.Cells(i, 4) = k2 i1 = 1 If m 0 Or n 0 Or k1 0 Or k2 0 Then '判断是否存在逻辑符号 If m = 0 Then '将不存在的逻辑符号做最大化处理,便于后期处理 m = 20000 End If If n = 0 Then '将不存在的逻辑符号做最大化处理,便于后期处理 n = 20000 End If If k1 = 0 Then '将不存在的逻辑符号做最大化处理,便于后期处理 k1 = 20000 End If If k2 = 0 Then k2 = 20000 End If j = Application.Min(m, n, k1, k2) '求最小值 Sheet2.Cells(i, 5) = j sRight = sWord If j 20000 Then While j 20000 '判断是否不再有逻辑符号 sLeft = Mid(sRight, 1, j - 1) sMid = Mid(sRight, j, 1) sRight = Mid(sRight, j + 1) If sLeft Then Sheet3.Cells(i, i1) = sLeft i1 = i1 + 1 End If Sheet3.Cells(i, i1) = sMid i1 = i1 + 1 m = InStr(1, sRight, *) n = InStr(1, sRight, +) k1 = InStr(1, sRight, () k2 = InStr(1, sRight, )) If m = 0 Then m = 20000 End If If n = 0 Then n = 20000 End If If k1 = 0 Then k1 = 20000 End If If k2 = 0 Then k2 = 20000 End If j = Application.Min(m, n, k1, k2) Wend End If Else Sheet3.Cells(i, 1) = sWord '将不符合条件的直接存入表中 End If Next ' End Sub
个人分类: 技术控|4143 次阅读|0 个评论
[转载]Advantages and Disadvantages of VBA
cughy 2013-8-30 19:24
Advantages and Disadvantages of VBA In this section, I briefly describe the good things about VBA — and I also explore its darker side. VBA advantages You can automate almost anything you do in Excel. To do so, you write instructions that Excel carries out. Automating a task by using VBA offers several advantages: Excel always executes the task in exactly the same way. (In most cases, consistency is a good thing.) Excel performs the task much faster than you can do it manually (unless, of course, you’re Clark Kent). If you’re a good macro programmer, Excel always performs the task without errors (which probably can’t be said about you or me). If you set things up properly, someone who doesn’t know anything about Excel can perform the task. You can do things in Excel that are otherwise impossible — which can make you a very popular person around the office. For long, time-consuming tasks, you don’t have to sit in front of your computer and get bored. Excel does the work, while you hang out at the water cooler. VBA disadvantages It’s only fair that I give equal time to listing the disadvantages (or potential disadvantages) of VBA: You have to find out how to write programs in VBA (but that’s why you bought this book, right?). Fortunately, it’s not as difficult as you might expect. Other people who need to use your VBA programs must have their own copies of Excel. It would be nice if you could press a button that transforms your Excel/VBA application into a stand-alone program, but that isn’t possible (and probably never will be). Sometimes, things go wrong. In other words, you can’t blindly assume that your VBA program will always work correctly under all circumstances. Welcome to the world of debugging and, if others are using your macros, technical support. VBA is a moving target. As you know, Microsoft is continually upgrading Excel. Even though Microsoft puts great effort into compatibility between versions, you may discover that VBA code you’ve written for Excel 2007 doesn’t work properly with older versions or with a future version of Excel. http://rajexcel.blogspot.jp/2012/12/advantages-and-disadvantages-of-vba.html#.UiB_X9Jmiq0
1728 次阅读|0 个评论
[转载]Preventing Auto_open And Workbook_Open Events From Running
cughy 2013-8-10 15:32
Introduction As a fulltime developer I oftentimes open files containing VBA and want to be able to run code. At the same time I sometimes want to prevent Workbook_Open event code or an Auto_Open macro from running. This little article shows you how to achieve that. Why would you want to do this? Typically, I use this on my own files in which I am still developing. The Open event might contain code that takes a while to run, or configures the project in a way which I don't want to happen when I start working with the file. If the file you opened using the methods described below contains other event handlers, note that these event handlers will remain disabled until you start a macro manually (by clicking a command button or a menu entry) or if a User Defined function in your code has been called. I do not recommend using this method to open files from sources you do not know or trust. The VBA code can contain events which will eventually run and possibly cause trouble. Excel 2010Macro security set to low or trusted document If you have set your macro security to "Enable All Macros" or you have already set the document to trusted or the document is in a trusted folder, click File, Open, select your file and hold down the shift key when you click the Open button: Fig. 1: Selecting the file from the File, Open dialog (Excel 2010) Of course your file might be listed in the Most Recently Used files (MRU) list. In that case, hold shift when you click the file in the list: Fig. 2: Clicking the file on the MRU (Excel 2010) Doing so will prevent the Workbook_Open event from firing and the Auto_Open macro from running. Macro security set to prompt If your document is not in a trusted folder, has never been set to be trusted and macro security is set to something other than enable all macros to run, you can repeat what I've shown above. Normally, if you open such a document, Excel will show the security bar. In this situation however, due to you holding down shift, Excel shows this window: fig 3: Enable macros dialog (Excel 2010) Because you held down the shift button when you clicked the file in the MRU or when you clicked the Open button, you can now just click "Enable macros" and no Automacros will run. Excel 2007 and upMacro security set to low or trusted document Note that this seems to fail if the trusted folder is on a network share! If you have set your macro security to "Enable All Macros" or you have already set the document to trusted or the document is in a trusted folder, click File, Open, select your file and hold down the shift key when you click the Open button: Fig. 4: Selecting the file from the File, Open dialog (Excel 2007 and up) Of course your file might be listed in the Most Recently Used files (MRU) list. In that case, hold shift when you click the file in the list: Fig. 2: Clicking the file on the MRU (Excel 2007 and up) Doing so will prevent the Workbook_Open event from firing and the Auto_Open macro from running. Macro security set to prompt If your document is not in a trusted folder, has never been set to be trusted and macro security is set to something other than enable all macros to run, you can repeat what I've shown above. Normally, if you open such a document, Excel will show the security bar. In this situation however, due to you holding down shift, Excel shows this window: fig 3: Enable macros dialog (Excel 2007 and up) Because you held down the shift button when you clicked the file in the MRU or when you clicked the Open button, you can now just click "Enable macros" and no Automacros will run. Excel 97, 2000, XP, 2003Macro security set to low or trusted document In case your macro security is set to low, or your VBA code is signed and you have set the publisher as trusted, you must hold down the shift key when you click the Open button on the File, Open dialog: Fig. 7: Opening the file from the File, Open dialog (Excel 97-2003) Of course your file might be listed in the Most Recently Used files (MRU) list. In that case, hold shift when you click the file in the list: Fig. 8: Clicking the file on the MRU (Excel 97-2003) Doing so will prevent the Workbook_Open event from firing and the Auto_Open macro from running. Macro security set to medium or higher If your macro security is set to al least "Medium" and you have never set it's publisher to trusted (for a signed macro) you can forget about holding shift when opening the file or clicking the file on the MRU list. Instead, you must hold shift when you enable macros: Fig.9: Hold shift when you press Enable macros Doing so will prevent the Workbook_Open event from firing and the Auto_Open macro from running. http://www.jkp-ads.com/Articles/preventopenevent.asp
个人分类: 论文|2024 次阅读|0 个评论
excel的实用VBA程序
aweng 2013-4-22 17:14
Option Explicit '删除活动表中的所有图表对象 Sub BatchDel() Dim ch As ChartObject For Each ch In ActiveSheet.ChartObjects ch.delete '删除活动表中的图表对象 End Sub -------------------------------------------------------------------------- Sub delete() '删除活动表中所有文字与图表 Cells.Select Selection.ClearContents ActiveSheet.Shapes.SelectAll Selection.delete End Sub -------------------------------------------------------------------------- '绘制省级行政区水资源脆弱性变化趋势,是以下Sub Prov_Trend_01()和Sub Prov_Trend_02()的结合 Sub Prov_Trend() Dim i For i = 1 To 31 '绘制省级行政区水资源脆弱性变化趋势折线图,生成趋势线和对应的拟合公式 Sheets(Vtrend).Cells(1 + (i - 1) * 19, 1).Value = Sheets(Vprov结果).Cells(i + 1, 1).Value '写上省级行政区名 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\折线图模板01.crtx) '设置图表类型为折线图模板01 ActiveChart.SetSourceData Source:=Sheets(Vprov结果).Range(AK (i + 1) :AT (i + 1)), PlotBy:=xlRows '设置图表的数据源 ActiveChart.FullSeriesCollection(1).XValues = =Vprov结果!$AK$1:$AT$1 '设置横座标轴的数据源 ActiveChart.Axes(xlCategory).AxisTitle.Text = 年份 '设置横座标轴标题 ActiveChart.Axes(xlValue).AxisTitle.Text = WVI '设置纵座标轴标题 ActiveChart.FullSeriesCollection(1).Trendlines(3).DataLabel.Select Selection.Left = 600 Selection.Top = 80 '设置趋势线拟合公式的位置 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vtrend '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + (i - 1) * 19, 1).Top ActiveChart.Parent.Left = Cells(2 + (i - 1) * 19, 1).Left '设置图表位置的左上角在省级行政区名下方一个单元格的左上角 '绘制省级行政区水资源脆弱性及其排名的变化趋势折线图 Sheets(Vtrend).Cells(1 + (i - 1) * 19, 10).Value = Sheets(Vprov结果).Cells(i + 1, 1).Value '写上省级行政区名 Charts.Add '新建一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\折线图模板02.crtx) '设置图表类型为拆线图模板02 ActiveChart.SetSourceData Source:=Range(Vyear结果!S (92 + 2 * i) :AB (93 + 2 * i)), PlotBy:=xlRows '设置图表数据范围 ActiveChart.FullSeriesCollection(1).Name = =Vyear结果!R (92 + 2 * i) '设置图表系列1的名称 ActiveChart.FullSeriesCollection(1).XValues = =Vyear结果!$S$93:$AB$93 '设置图表系列1的横座标轴数据 ActiveChart.FullSeriesCollection(2).Name = =Vyear结果!R (93 + 2 * i) '设置图表系列2的名称 ActiveChart.FullSeriesCollection(2).XValues = =Vyear结果!$S$93:$AB$93 '设置图表系列2的横座标轴数据 ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = WVI '设置主纵座标轴标题 ActiveChart.Axes(xlValue, xlSecondary).AxisTitle.Text = WVI排序 '设置次纵座标轴标题 ActiveChart.Axes(xlCategory).AxisTitle.Text = 年份 '设置横座标轴标题 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vtrend '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + (i - 1) * 19, 10).Top ActiveChart.Parent.Left = Cells(2 + (i - 1) * 19, 10).Left '设置图表位置的左上角在省级行政区名下方一个单元格的左上角 Next i End Sub -------------------------------------------------------------------------- '绘制省级行政区水资源脆弱性变化趋势折线图,数据源为Vprov结果,保存在Vtrend Sub Prov_Trend_01() Dim i For i = 1 To 31 Sheets(Vtrend).Cells(1 + (i - 1) * 19, 1).Value = Sheets(Vprov结果).Cells(i + 1, 1).Value '写上省级行政区名 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\折线图模板01.crtx) '设置图表类型为折线图模板01 ActiveChart.SetSourceData Source:=Sheets(Vprov结果).Range(AK (i + 1) :AT (i + 1)), PlotBy:=xlRows '设置图表的数据源 ActiveChart.FullSeriesCollection(1).XValues = =Vprov结果!$AK$1:$AT$1 '设置横座标轴的数据源 ActiveChart.Axes(xlCategory).AxisTitle.Text = 年份 '设置横座标轴标题 ActiveChart.Axes(xlValue).AxisTitle.Text = WVI '设置纵座标轴标题 ActiveChart.FullSeriesCollection(1).Trendlines(3).DataLabel.Select Selection.Left = 600 Selection.Top = 80 '设置趋势线拟合公式的位置 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vtrend '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + (i - 1) * 19, 1).Top ActiveChart.Parent.Left = Cells(2 + (i - 1) * 19, 1).Left '设置图表位置的左上角在省级行政区名下方一个单元格的左上角 Next i End Sub -------------------------------------------------------------------------- Sub Prov_Trend_02() '绘制省级行政区水资源脆弱性及其排名的变化趋势,数据源为Vyear结果,保存在Vtrend Dim i Sheets(Vtrend).Select '激活要存图表的工作表 For i = 1 To 31 Sheets(Vtrend).Cells(1 + (i - 1) * 19, 10).Value = Sheets(Vprov结果).Cells(i + 1, 1).Value '写上省级行政区名 Charts.Add '新建一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\折线图模板02.crtx) '设置图表类型为拆线图模板02 ActiveChart.SetSourceData Source:=Range(Vyear结果!S (92 + 2 * i) :AB (93 + 2 * i)), PlotBy:=xlRows '设置图表数据范围 ActiveChart.FullSeriesCollection(1).Name = =Vyear结果!R (92 + 2 * i) '设置图表系列1的名称 ActiveChart.FullSeriesCollection(1).XValues = =Vyear结果!$S$93:$AB$93 '设置图表系列1的横座标轴数据 ActiveChart.FullSeriesCollection(2).Name = =Vyear结果!R (93 + 2 * i) '设置图表系列2的名称 ActiveChart.FullSeriesCollection(2).XValues = =Vyear结果!$S$93:$AB$93 '设置图表系列2的横座标轴数据 ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = WVI '设置主纵座标轴标题 ActiveChart.Axes(xlValue, xlSecondary).AxisTitle.Text = WVI排序 '设置次纵座标轴标题 ActiveChart.Axes(xlCategory).AxisTitle.Text = 年份 '设置横座标轴标题 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vtrend '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + (i - 1) * 19, 10).Top ActiveChart.Parent.Left = Cells(2 + (i - 1) * 19, 10).Left '设置图表位置的左上角在省级行政区名下方一个单元格的左上角 Next i End Sub -------------------------------------------------------------------------- '绘制省级行政区逐年和多年平均的水资源脆弱性雷达图,数据源在表Vprov结果中,保存在Vstru中 Sub BatchRadar() Sheets(Vstru).Select '激活要存图表的工作表 Dim i Dim j For i = 1 To 11 For j = 1 To 31 Sheets(Vstru).Cells(1 + (j - 1) * 19, 1 + (i - 1) * 9).Value = Sheets(Vprov结果).Cells(j + 1 + 31 * (i - 1), 1) '写上省级行政区名 Sheets(Vstru).Cells(1 + (j - 1) * 19, 2 + (i - 1) * 9).Value = Sheets(Vprov结果).Cells(j + 1 + 31 * (i - 1), 3) '写上年份 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\雷达图模板01.crtx) '设置图表类型为雷达图模板01 ActiveChart.SetSourceData Source:=Sheets(Vprov结果).Range($AC$1:$AJ$1, AC (j + 1 + 31 * (i - 1)) :AJ (j + 1 + 31 * (i - 1))), PlotBy:=xlRows '设置图表的数据源 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vstru '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + (j - 1) * 19, 1 + (i - 1) * 9).Top ActiveChart.Parent.Left = Cells(2 + (j - 1) * 19, 1 + (i - 1) * 9).Left '设置图表保存的位置在省级行政区名下方一个单元格的左上角 Next j Next i End Sub -------------------------------------------------------------------------- '绘制地级行政区水资源脆弱性雷达图,数据源在表Vcity结果中,保存在Vcitystru中 Sub CityRadar() Sheets(Vcitystru).Select '激活要存图表的工作表 Dim i For i = 1 To 360 Sheets(Vcitystru).Cells(1 + (i - 1) * 19, 1).Value = Sheets(Vcity结果).Cells(i + 1, 1) '写上省级行政区名 Sheets(Vcitystru).Cells(1 + (i - 1) * 19, 2).Value = Sheets(Vcity结果).Cells(i + 1, 2) '写上省级行政区代码 Sheets(Vcitystru).Cells(1 + (i - 1) * 19, 3).Value = Sheets(Vcity结果).Cells(i + 1, 3) '写上地级行政区名 Sheets(Vcitystru).Cells(1 + (i - 1) * 19, 4).Value = Sheets(Vcity结果).Cells(i + 1, 4) '写上地级行政区代码 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\雷达图模板01.crtx) '设置图表类型为雷达图模板01 ActiveChart.SetSourceData Source:=Sheets(Vcity结果).Range(AE (i + 1) :AL (i + 1)), PlotBy:=xlRows '设置图表数据源 ActiveChart.FullSeriesCollection(1).XValues = =Vcity结果!$F$1:$M$1 '设置横座标轴的数据源 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vcitystru '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + (i - 1) * 19, 1).Top ActiveChart.Parent.Left = Cells(2 + (i - 1) * 19, 1).Left '设置图表保存的位置在省级行政区名下方一个单元格的左上角 Next i End Sub -------------------------------------------------------------------------- Sub ProvYearColumn() ' 绘制按年排序的水资源脆弱性柱状图,数据源在工作表Vyear结果中,图放在工作表Vyear中。 Sheets(Vyear).Select '激活要保存的工作表 Dim i For i = 1 To 11 Sheets(Vyear).Range(A (1 + (i - 1) * 19)).Value = Sheets(Vyear结果).Range(A (1 + 2 * i)).Value '写上年份 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\柱状图模板01.crtx) '设置图表类型为柱状图模板01 ActiveChart.SetSourceData Source:=Sheets(Vyear结果).Range(B (1 + 2 * i) :AF (1 + 2 * i)), PlotBy:=xlRows '设置图表数据源 ActiveChart.FullSeriesCollection(1).XValues = =Vyear结果!$B$ (2 * i) :$AF$ (2 * i) '设置横座标轴的数据源 ActiveChart.Axes(xlValue).AxisTitle.Text = WVI '设置纵座标轴标题 ActiveChart.Axes(xlCategory).AxisTitle.Text = 省级行政区 '设置横座标轴标题 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vyear '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + (i - 1) * 19, 1).Top ActiveChart.Parent.Left = Cells(2 + (i - 1) * 19, 1).Left '设置图表位置的左上角在省级行政区名下方一个单元格的左上角 Next i End Sub -------------------------------------------------------------------------- Sub CityFigure() '地级行政区水资源脆弱性从小到大排序的柱状图及雷达图,数据源为Vcity,图表存储在Vcitystru,是Sub CityFigure_01()和Sub CityFigure_02()的结合 Dim i Dim j Dim n Dim a(32) '定义长度为33的数组,值的类型为整型 Sheets(Vcity).Sort.SortFields.Clear Sheets(Vcity).Sort.SortFields.Add Key:=Sheets(Vcity).Range(D2:D361), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(Vcity).Sort .SetRange Sheets(Vcity).Range(A2:AL361) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .Apply End With '初始化排序,把所有数据按地级行政编码从小到大排序 Sheets(Vcity).Range(B362).Value = 0 '初始化B362,令其值适用于下面的排序工作 a(0) = 2 '当n=0时,令a(0)=2,这是北京 n = 1 '初始化n,令下面的循环从a(1)开始 For i = 2 To 361 If ((Sheets(Vcity).Range(B i + 1).Value - Sheets(Vcity).Range(B (i)).Value) 0) Then a(n) = i + 1 n = n + 1 End If Next i '遍历Vcity工作表中第2列“省级行政区”,找到每个省份的起始点,赋值给数组。其中最后一个为截止。 For n = 0 To 30 Sheets(Vcity).Sort.SortFields.Clear Sheets(Vcity).Sort.SortFields.Add Key:=Sheets(Vcity).Range(N a(n) :N (a(n + 1) - 1)), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(Vcity).Sort .SetRange Sheets(Vcity).Range(A a(n) :AL (a(n + 1) - 1)) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .Apply End With '选择某一个省级行政区中的所有地级行政区的所有数据,按脆弱性指数从小到大排序 '以下这一段为绘制省级行政区内所有地级行政区按水资源脆弱性从小到大排序的柱状图 Sheets(Vcitystru).Cells(1 + n * 19, 1).Value = Sheets(Vcity).Cells(a(n), 1).Value '输入省级行政区名 Sheets(Vcitystru).Cells(1 + n * 19, 2).Value = Sheets(Vcity).Cells(a(n), 2).Value '输入省级行政区代码 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\柱状图模板01.crtx) '选择图表模板为柱状图模板01 ActiveChart.SetSourceData Source:=Sheets(Vcity).Range(N a(n) :N (a(n + 1) - 1)), PlotBy:=xlColumns '设置柱状图数据源 ActiveChart.Axes(xlCategory).Select ActiveChart.FullSeriesCollection(1).XValues = =Vcity!C (a(n)) :C (a(n + 1) - 1) '设置柱状图横坐标轴数据 ActiveChart.Axes(xlValue).AxisTitle.Text = WVI '设置柱状图纵座标轴标题 ActiveChart.Axes(xlCategory).AxisTitle.Text = 地级行政区 '设置横座标轴标题 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vcitystru '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + n * 19, 1).Top ActiveChart.Parent.Left = Cells(2 + n * 19, 1).Left '设置图表保存的位置在省级行政区名下方一个单元格的左上角 '以下这段为把省级行政区每个地级行政区的水资源脆弱性结构雷达图绘制出来 For j = 1 To (a(n + 1) - a(n)) Sheets(Vcitystru).Cells(1 + n * 19, 1 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 1).Value '输入省级行政区名 Sheets(Vcitystru).Cells(1 + n * 19, 2 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 2).Value '输入省级行政区代码 Sheets(Vcitystru).Cells(1 + n * 19, 3 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 3).Value '输入地级行政区名 Sheets(Vcitystru).Cells(1 + n * 19, 4 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 4).Value '输入地级行政区代码 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\雷达图模板01.crtx) '选择雷达图模板01 ActiveChart.SetSourceData Source:=Range(Vcity!AE (a(n) + (j - 1)) :AL (a(n) + (j - 1))), PlotBy:=xlRows '设置雷达图的数据源 ActiveChart.FullSeriesCollection(1).XValues = =Vcity!$F$1:$M$1 '设置雷达图的座标轴标题 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vcitystru '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + n * 19, 1 + j * 9).Top ActiveChart.Parent.Left = Cells(2 + n * 19, 1 + j * 9).Left '设置图表保存的位置在省级行政区名下方一个单元格的左上角 Next j Next n End Sub -------------------------------------------------------------------------- Sub CityFigure_01() '地级行政区水资源脆弱性从小到大排序的柱状图,数据源为Vcity,图表存储在Vcitystru Dim i Dim j Dim n Dim a(32) '定义长度为33的数组,值的类型为整型 Sheets(Vcity).Sort.SortFields.Clear Sheets(Vcity).Sort.SortFields.Add Key:=Sheets(Vcity).Range(D2:D361), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(Vcity).Sort .SetRange Sheets(Vcity).Range(A2:AL361) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .Apply End With '初始化排序,把所有数据按地级行政编码从小到大排序 Sheets(Vcity).Range(B362).Value = 0 '初始化B362,令其值适用于下面的排序工作 a(0) = 2 '当n=0时,令a(0)=2,这是北京 n = 1 '初始化n,令下面的循环从a(1)开始 For i = 2 To 361 If ((Sheets(Vcity).Range(B i + 1).Value - Sheets(Vcity).Range(B (i)).Value) 0) Then a(n) = i + 1 n = n + 1 End If Next i '遍历Vcity工作表中第2列“省级行政区”,找到每个省份的起始点,赋值给数组。其中最后一个为截止。 For n = 0 To 30 Sheets(Vcity).Sort.SortFields.Clear Sheets(Vcity).Sort.SortFields.Add Key:=Sheets(Vcity).Range(N a(n) :N (a(n + 1) - 1)), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(Vcity).Sort .SetRange Sheets(Vcity).Range(A a(n) :AL (a(n + 1) - 1)) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .Apply End With '选择某一个省级行政区中的所有地级行政区的所有数据,按脆弱性指数从小到大排序 '以下这一段为绘制省级行政区内所有地级行政区按水资源脆弱性从小到大排序的柱状图 Sheets(Vcitystru).Cells(1 + n * 19, 1).Value = Sheets(Vcity).Cells(a(n), 1).Value '输入省级行政区名 Sheets(Vcitystru).Cells(1 + n * 19, 2).Value = Sheets(Vcity).Cells(a(n), 2).Value '输入省级行政区代码 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\柱状图模板01.crtx) '选择图表模板为柱状图模板01 ActiveChart.SetSourceData Source:=Sheets(Vcity).Range(N a(n) :N (a(n + 1) - 1)), PlotBy:=xlColumns '设置柱状图数据源 ActiveChart.Axes(xlCategory).Select ActiveChart.FullSeriesCollection(1).XValues = =Vcity!C (a(n)) :C (a(n + 1) - 1) '设置柱状图横坐标轴数据 ActiveChart.Axes(xlValue).AxisTitle.Text = WVI '设置柱状图纵座标轴标题 ActiveChart.Axes(xlCategory).AxisTitle.Text = 地级行政区 '设置横座标轴标题 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vcitystru '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + n * 19, 1).Top ActiveChart.Parent.Left = Cells(2 + n * 19, 1).Left '设置图表保存的位置在省级行政区名下方一个单元格的左上角 Next n End Sub -------------------------------------------------------------------------- Sub CityFigure_02() '地级行政区水资源脆弱性按小到大排序的雷达图,数据源为Vcity,图表存储在Vcitystru Dim i Dim j Dim n Dim a(32) '定义长度为33的数组,值的类型为整型 Sheets(Vcity).Sort.SortFields.Clear Sheets(Vcity).Sort.SortFields.Add Key:=Sheets(Vcity).Range(D2:D361), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(Vcity).Sort .SetRange Sheets(Vcity).Range(A2:AL361) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .Apply End With '初始化排序,把所有数据按地级行政编码从小到大排序 Sheets(Vcity).Range(B362).Value = 0 '初始化B362,令其值适用于下面的排序工作 a(0) = 2 '当n=0时,令a(0)=2,这是北京 n = 1 '初始化n,令下面的循环从a(1)开始 For i = 2 To 361 If ((Sheets(Vcity).Range(B i + 1).Value - Sheets(Vcity).Range(B (i)).Value) 0) Then a(n) = i + 1 n = n + 1 End If Next i '遍历Vcity工作表中第2列“省级行政区”,找到每个省份的起始点,赋值给数组。其中最后一个为截止。 For n = 0 To 30 Sheets(Vcity).Sort.SortFields.Clear Sheets(Vcity).Sort.SortFields.Add Key:=Sheets(Vcity).Range(N a(n) :N (a(n + 1) - 1)), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(Vcity).Sort .SetRange Sheets(Vcity).Range(A a(n) :AL (a(n + 1) - 1)) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .Apply End With '选择某一个省级行政区中的所有地级行政区的所有数据,按脆弱性指数从小到大排序 '以下这段为把省级行政区每个地级行政区的水资源脆弱性结构雷达图绘制出来 For j = 1 To (a(n + 1) - a(n)) Sheets(Vcitystru).Cells(1 + n * 19, 1 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 1).Value '输入省级行政区名 Sheets(Vcitystru).Cells(1 + n * 19, 2 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 2).Value '输入省级行政区代码 Sheets(Vcitystru).Cells(1 + n * 19, 3 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 3).Value '输入地级行政区名 Sheets(Vcitystru).Cells(1 + n * 19, 4 + j * 9).Value = Sheets(Vcity).Cells(a(n) + (j - 1), 4).Value '输入地级行政区代码 Charts.Add '增加一个图表 ActiveChart.ApplyChartTemplate ( _ C:\Users\aweng\AppData\Roaming\Microsoft\Templates\Charts\雷达图模板01.crtx) '选择雷达图模板01 ActiveChart.SetSourceData Source:=Range(Vcity!AE (a(n) + (j - 1)) :AL (a(n) + (j - 1))), PlotBy:=xlRows '设置雷达图的数据源 ActiveChart.FullSeriesCollection(1).XValues = =Vcity!$F$1:$M$1 '设置雷达图的座标轴标题 ActiveChart.Location Where:=xlLocationAsObject, Name:=Vcitystru '设置图表保存的工作表 ActiveChart.Parent.Top = Cells(2 + n * 19, 1 + j * 9).Top ActiveChart.Parent.Left = Cells(2 + n * 19, 1 + j * 9).Left '设置图表保存的位置在省级行政区名下方一个单元格的左上角 Next j Next n End Sub
个人分类: 学习|2 次阅读|0 个评论
实用的word的VBA程序
aweng 2013-4-22 17:10
'随便录制一个宏,然后选中这个宏,再编辑,之后在打开的VBA编辑器中输入这些。 '保存后把它添加到自定义功能区里即可。 Sub 清除半角空格() ' ' 清除半角空格 ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = .Replacement.Text = .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub '----------------------------------------------------------- Sub 清除双全角空格() ' ' 清除双全角空格 ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text =    .Replacement.Text = .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub '----------------------------------------------------------- Sub 清除3个及以上段落标记() ' ' 清除3个及以上段落标记 ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ^p^p^p .Replacement.Text = ^p^p .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub '----------------------------------------------------------- Sub 双段落标记替换为手动换行符() ' ' 双段落标记替换为手动换行符 ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ^p^p .Replacement.Text = ^l .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub '----------------------------------------------------------- Sub 手动换行符替换为双段落标记() ' ' 手动换行符替换为双段落标记 ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ^l .Replacement.Text = ^p^p .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub '----------------------------------------------------------- Sub 清除段落标记() ' ' 清除段落标记 ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ^p .Replacement.Text = .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub '----------------------------------------------------------- Sub 双全角空格替换为段落标记() ' ' 双全角空格替换为段落标记 ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text =    .Replacement.Text = ^p .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub '----------------------------------------------------------- Sub 题注_图() ' ' 题注_图 ' '光标初始位置为题注内容所在行的任意位置 Selection.EndKey Unit:=wdLine '将光标移至行末 Selection.HomeKey Unit:=wdLine, Extend:=wdExtend '选中整行 Selection.ClearFormatting '清除此行的格式 Selection.HomeKey Unit:=wdLine '将光标移至行首 Selection.InsertCaption Label:=图, Position:=wdCaptionPositionBelow '插入题注,题注标签为“图” Selection.TypeText Text:=vbTab '在题注标签和编号后插入一个制表位,分隔其与题注内容 End Sub '----------------------------------------------------------- Sub 题注_表() ' ' 题注_表 ' '光标初始位置为题注内容所在行的任意位置 Selection.EndKey Unit:=wdLine '将光标移至行末 Selection.HomeKey Unit:=wdLine, Extend:=wdExtend '选中整行 Selection.ClearFormatting '清除此行的格式 Selection.HomeKey Unit:=wdLine '将光标移至行首 Selection.InsertCaption Label:=表, Position:=wdCaptionPositionBelow '插入题注,题注标签为“表” Selection.TypeText Text:=vbTab '在题注标签和编号后插入一个制表位,分隔其与题注内容 End Sub '----------------------------------------------------------- Sub 题注_Table() ' ' 题注_Table ' '光标初始位置为题注内容所在行的任意位置 Selection.EndKey Unit:=wdLine '将光标移至行末 Selection.HomeKey Unit:=wdLine, Extend:=wdExtend '选中整行 Selection.ClearFormatting '清除此行的格式 Selection.HomeKey Unit:=wdLine '将光标移至行首 Selection.InsertCaption Label:=Table, Position:=wdCaptionPositionBelow '插入题注,题注标签为“Table” Selection.TypeText Text:=vbTab '在题注标签和编号后插入一个制表位,分隔其与题注内容 End Sub '----------------------------------------------------------- Sub 题注_Fig() ' ' 题注_Fig. ' '光标初始位置为题注内容所在行的任意位置 Selection.EndKey Unit:=wdLine '将光标移至行末 Selection.HomeKey Unit:=wdLine, Extend:=wdExtend '选中整行 Selection.ClearFormatting '清除此行的格式 Selection.HomeKey Unit:=wdLine '将光标移至行首 Selection.InsertCaption Label:=Fig., Position:=wdCaptionPositionBelow '插入题注,题注标签为“Fig.” Selection.TypeText Text:=vbTab '在题注标签和编号后插入一个制表位,分隔其与题注内容 End Sub '----------------------------------------------------------- Sub 增加题注标签() ' ' 增加题注标签 ' ' CaptionLabels.Add Name:=图 CaptionLabels.Add Name:=表 CaptionLabels.Add Name:=Fig. CaptionLabels.Add Name:=Table CaptionLabels.Add Name:=附图 CaptionLabels.Add Name:=附表 End Sub '----------------------------------------------------------- Sub 图片大小调整() Dim image As InlineShape Dim h0 '图片原高度限值 Dim w0 '图片原宽度限值 Dim h1 '图片新高度 Dim w1 '图片新宽度 h0 = 8 '设置图片原高度限值 w0 = 10 '设置图片原宽度限值 h1 = 4.5 '设置图片新高度 w1 = 6 '设置图片新宽度 For Each image In ActiveDocument.InlineShapes If (image.Height CentimetersToPoints(h0) And image.Width CentimetersToPoints(w0)) Then '这是判断要调整大小的图片,不是必须。在此例中,图片的大小高小于h0cm,宽小于w0cm 。 'CentimetersToPoints是用来把cm为单位的长宽换算为像素为单位的长宽 image.Height = CentimetersToPoints(h1) image.Width = CentimetersToPoints(w1) '这是将图片的长宽设为cm为单位的值 'image.Height = 200 'image.Width = 350 '这是直接将图片的长宽设为像素表示的值。 '注意,用像素表示的话,有可能和机器而不同。 End If Next End Sub '----------------------------------------------------------- Sub 居中对齐() ' ' 把所选行的内容居中对齐 ' ' Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter End Sub '----------------------------------------------------------- Sub 图片居中() Dim image As InlineShape For Each image In ActiveDocument.InlineShapes image.Select '选中这张图 Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter '把所选行的内容居中对齐 End Sub '----------------------------------------------------------- Sub 向下移动n行() ' Dim n '定义变量n n = 2 '给n赋值 Selection.MoveDown Unit:=wdLine, Count:=n '向下移动n行 End Sub '----------------------------------------------------------- Sub 自动编号转普通文本() ActiveDocument.Content.ListFormat.ConvertNumbersToText End Sub '----------------------------------------------------------- Sub 参考文献替换() ' ' 参考文献替换 宏 ' 中文文献中的“et al”替换为“等” ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = ^$, et al .Replacement.Text = ^, 等 .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = , et al .Replacement.Text = , 等 .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll With Selection.Find .Text = , 等, 等 .Replacement.Text = , et al .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub
个人分类: 学习|2 次阅读|0 个评论
Useful website(s) for learning VBA
cughy 2013-3-16 21:27
http://www.cpearson.com/Excel/Topic.aspx
个人分类: 常识|1997 次阅读|0 个评论
从植物采集记录生成标本记录标签
热度 3 zjlcas 2013-1-31 23:30
请参阅 http://blog.sciencenet.cn/blog-255662-849868.html https://github.com/helixcn/herblabel 使用 herblabel程序包生成植物标本采集标签。 早在2006年, 一起和同门的陈彬博士在云南出野外时, 陈博士就提供了一个打印植物采集标签的Excel小程序。 因为我当时完全不懂编程, 觉得很神奇, 程序虽然很小,但是确实提供了很多方便。 进入嘉道理农场工作以来, 我的工作包括采集标本。 从采集记录快速生成采集标签的需求又一次摆在我面前。 但是陈彬博士提供的excel程序各部分都是中文, 但是我需要输入英文, 标签的格式也要进行相应的调整。 基于他提供的VBA程序, 我对VBA的源代码进行了修改, 调整了输出标签的格式,以及字体, 每一行的大小, 以及插入分隔符的位置等。 实现的功能 输入 在sheet1中按照要求相应的采集信息, 执行本命令, 例如用按钮关联,在sheet2中就可以生成固定的标签。 以下是Excel VBA中的源代码。 供感兴趣的读者参考, 并欢迎提出宝贵意见。 ''######################################################################### ''########## This macro was developed Dr. JinlongZhang base on ########## ''################# a VBA macro by Dr. Bin Chen ######################### ''################# Email : jinlongzhang01@gmail.com #################### ''######################### 30/01/2013################################### ''######################################################################### Dim a , b , c , d , e , f , g As Integer 'Definition of the variables 'Maximum Number of labels can be created 'b Sheet2.Columns.Clear Sheet2.ResetAllPageBreaks Sheet2.DisplayPageBreaks = False c = 1 ' d = 0 For a = 2 To 50000 If Sheet1.Cells ( a , 1 ) = Then MsgBox Please find the labels in Sheet 2 Exit For Else g = Sheet1.Cells ( a , 16 ) ' Numberof copies for one collection number For b = 1 To g If d 1 And ( d Mod 8 = 0 Or d Mod 8 = 1 ) Then 'Ajustingthe margins, and number of labels per page. f = 13 Else f = 14 End If If d 1 And ( d Mod 2 = 0 ) Then c = c + f End If e = ( d + 1 ) Mod 2 If e = 1 Then Sheet2.Cells ( c , 1 ) = TextBox1.Text Sheet2.Cells ( c + 1 , 1 ) = TextBox2.Text Sheet2.Cells ( c + 2 , 1 ) = Sheet1.Cells ( a , 4 ) 'Species: Sheet2.Cells ( c + 3 , 1 ) = Sheet1.Cells ( a , 5 ) ' Infraspecies: Sheet2.Cells ( c + 4 , 1 ) = Family: + Sheet1.Cells ( a , 8 ) Sheet2.Cells ( c + 5 , 1 ) = Local Name: + Sheet1.Cells ( a , 6 ) Sheet2.Cells ( c + 6 , 1 ) = Field Note: + Sheet1.Cells ( a , 9 ) Sheet2.Cells ( c + 7 , 1 ) = Locality: + Sheet1.Cells ( a , 17 ) Sheet2.Cells ( c + 8 , 1 ) = Lon/Lat/Alt: + Sheet1.Cells ( a , 18 ) + / + Sheet1.Cells ( a , 19 ) + / + Sheet1.Cells ( a , 20 ) + m Sheet2.Cells ( c + 9 , 1 ) = Col. Num: + Sheet1.Cells ( a , 2 ) + + Sheet1.Cells ( a , 1 ) Sheet2.Cells ( c + 10 , 1 ) = Date Col.: + Sheet1.Cells ( a , 3 ) Sheet2.Cells ( c + 11 , 1 ) = Det. Date: + Sheet1.Cells ( a , 24 ) + / + Sheet1.Cells ( a , 25 ) Sheet2.Cells ( c + 12 , 1 ) = Note: + Sheet1.Cells ( a , 13 ) With Sheet2 'applicaton ' Adjusting the display of the text 'Set height for rows . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). RowHeight = 12 'Set width for columns . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). ColumnWidth = 42 . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). Font.Name = Arial . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). Font.Size = 11 'Size . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). HorizontalAlignment = xlGeneral . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). VerticalAlignment = xlCenter . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). WrapText = False . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). Orientation = 0 . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). AddIndent = False . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). IndentLevel = 0 . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). ShrinkToFit = True . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). ReadingOrder = xlContext . Range (. Cells ( c , 1 ), . Cells ( c + 12 , 1 )). MergeCells = False End With With Sheet2.Cells ( c , 1 ) 'Adjusting the Title, right . Font.Name = Arial 'Font . Font.Size = 12 'Size . Font.Bold = True 'Alignment . HorizontalAlignment = xlCenter . VerticalAlignment = xlCenter . WrapText = False . Orientation = 0 . AddIndent = False . IndentLevel = 0 . ShrinkToFit = True . ReadingOrder = xlContext . MergeCells = False End With With Sheet2.Cells ( c + 1 , 1 ) ' Formatthe subtitle . HorizontalAlignment = xlCenter . VerticalAlignment = xlCenter . Font.Name = Times New Roman 'Font . Font.Size = 12 'Size End With ElseIf e = 0 Then Sheet2.Cells ( c , 2 ) = TextBox1.Text 'Title Sheet2.Cells ( c + 1 , 2 ) = TextBox2.Text 'Subtitle Sheet2.Cells ( c + 2 , 2 ) = Sheet1.Cells ( a , 4 ) 'Species: Sheet2.Cells ( c + 3 , 2 ) = Sheet1.Cells ( a , 5 ) ' Infraspecies: Sheet2.Cells ( c + 4 , 2 ) = Family: + Sheet1.Cells ( a , 8 ) Sheet2.Cells ( c + 5 , 2 ) = Local Name: + Sheet1.Cells ( a , 6 ) Sheet2.Cells ( c + 6 , 2 ) = Field Note: + Sheet1.Cells ( a , 9 ) Sheet2.Cells ( c + 7 , 2 ) = Locality: + Sheet1.Cells ( a , 17 ) Sheet2.Cells ( c + 8 , 2 ) = Lon/Lat/Alt: + Sheet1.Cells ( a , 18 ) + / + Sheet1.Cells ( a , 19 ) + / + Sheet1.Cells ( a , 20 ) + m Sheet2.Cells ( c + 9 , 2 ) = Col. Num: + Sheet1.Cells ( a , 2 ) + + Sheet1.Cells ( a , 1 ) Sheet2.Cells ( c + 10 , 2 ) = Date Col.: + Sheet1.Cells ( a , 3 ) Sheet2.Cells ( c + 11 , 2 ) = Det. Date: + Sheet1.Cells ( a , 24 ) + / + Sheet1.Cells ( a , 25 ) Sheet2.Cells ( c + 12 , 2 ) = Note: + Sheet1.Cells ( a , 13 ) With Sheet2 'applicaton . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). RowHeight = 12 'Setheight for rows . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). ColumnWidth = 42 'Setwidth for columns . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). Font.Name = Arial . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). Font.Size = 11 'Size . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). HorizontalAlignment = xlGeneral . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). VerticalAlignment = xlCenter . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). WrapText = False . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). Orientation = 0 . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). AddIndent = False . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). IndentLevel = 0 . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). ShrinkToFit = True . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). ReadingOrder = xlContext . Range (. Cells ( c , 2 ), . Cells ( c + 12 , 2 )). MergeCells = False End With With Sheet2.Cells ( c , 2 ) 'Adjusting the label, right . Font.Name = Arial 'Font . Font.Size = 12 'Size . Font.Bold = True 'Alignment . HorizontalAlignment = xlCenter . VerticalAlignment = xlCenter . WrapText = False . Orientation = 0 . AddIndent = False . IndentLevel = 0 . ShrinkToFit = True . ReadingOrder = xlContext . MergeCells = False End With With Sheet2.Cells ( c + 1 , 2 ) 'Formatthe subtitle . HorizontalAlignment = xlCenter . VerticalAlignment = xlCenter . Font.Name = Times New Roman 'Font . Font.Size = 12 'Size End With End If d = d + 1 Next b If f = 13 And c 1 Then Sheet2.HPageBreaks.AddBefore := Sheet2.Cells ( c , 1 ) End If End If Next a With Sheet2.PageSetup . LeftMargin = Application.InchesToPoints ( 0.5 ) . RightMargin = Application.InchesToPoints ( 0.5 ) . TopMargin = Application.InchesToPoints ( 0.5 ) . BottomMargin = Application.InchesToPoints ( 0.5 ) . HeaderMargin = Application.InchesToPoints ( 0.5 ) . FooterMargin = Application.InchesToPoints ( 0.5 ) . PrintHeadings = False . PrintGridlines = False . PrintNotes = False . CenterHorizontally = False . CenterVertically = False . Orientation = xlPortrait . Draft = False . PaperSize = xlPaperA4 ' xlPaperA4:A4 . FirstPageNumber = xlAutomatic . Order = xlDownThenOver . BlackAndWhite = False . Zoom = 100 . FitToPagesWide = 1 . FitToPagesTall = 1 . PrintErrors = xlPrintErrorsDisplayed End With Sheet2.PrintPreview
个人分类: 软件介绍|6342 次阅读|3 个评论
初识VBA
热度 1 wjwqbit 2010-7-29 23:55
VBA是Visual Basic for Application 的简写,在数据库自动化处理中用的比较多,比如Excel、word中。如果你对VB语言有所了解,那VBA也就不难了。 相信每个人都用过Excel吧,如果对Excel中一列数据求均值你肯定会了,因为Excel中有直接求均值的函数,也很方便操作。但如果有1000个Excel文件,每个文件中对应的有100列数据,各列在各文件中类型都一样。根据需要公司需要对这100个文件合并后再求每一列的均值。如果手工去完成这个任务,得花多少时间呢?这样算吧,工作包括对这100个文件进行打开,列均值处理,各文件均值汇总在求均值。假如对打开文件需要5秒,求每列数据均值需要10秒,则一个文件需要5+15*100秒也就是约25分钟,1000个文件需要416.7个小时,就是说一个人不吃不喝也需要计算17天半。 但如果用VBA定制宏来实现,那就快的多了。可能10几分钟或者一两个小时就算出来了。 总之,VBA就是用软件自动化来减少大量劳动力或者减少工作时间提高效率的一种方法。在接下来的这个模块当中,笔者会根据自己的一些工程应用给出VBA的一些参考方法。仅供学习参考,如果读者有什么疑问或者共鸣,也可以给我发邮件: ScaleSpaceTime@163.com 。
个人分类: VBA自动化(连载)|3346 次阅读|0 个评论
固体与分子经验电子理论-价电子结构VBA编程计算法
lwsrgr 2010-4-21 11:23
固体与分子经验电子理论-价电子结构VBA编程计算法 这些日子在做编程计算,自从余瑞璜院士的固体与分子经验电子理论的问世,以此为理论基础撰写的大大小小论文数不胜数。在涉及该理论的价电子结构计算,求解价电子参数(na)到求解理论键距(D)乃至最后的计算理论与实验键距误差这些过程中,由于化合物中的各个原子存在的杂化状态种类多,组合计算量大,双元素的组合可达百种,单凭人力将原子的各种状态的参数带入公式,一步一步计算工作量大,不现实。然在现有发表的论文中,就这部分的计算,大都泛泛的提及采用计算机编程,c语言编程,VB语言编程等等。。让很多初学者包括在计算机方面不是很通的人无处下手。 人比人吓死人,人比牛人吓死牛。我在做这方面的计算是采用Office Excel 里的宏命令或者是叫VBA语言,很类似于VB语言,通过调用Excel表格内的数据,做几个循环语句,即可达到解决价电子结构计算的问题,最终求出满足要求的 误差△D。方法简单,望做相关工作的牛人们,朋友们指教一二,只有交流才会有进步。望不吝啬赐教。 现将我做的VBA源码贴上。由于代码的个人化,不懂之处可提出。(QQ:413643738) Static Function Log10(X) Log10 = Log(X) / Log(10#) End Function ''''求解ra 'Dim line As Integer 'Dim i As Integer 'Dim j As Integer 'i = 1 'j = 1 'line = 1 'For i = 1 To 6 ' For j = 1 To 18 ' Sheet4.Cells(line, 6).Value = CStr(i) + -- + CStr(j) ' For n = 2 To 6 ' ''''n是从第二个键开始计算的 ' If Sheet1.Cells(n + 1, 1).Value = Sheet1.Cells(n + 1, 2).Value Then ' If Sheet1.Cells(n + 1, 1).Value = 1 Then ' Sheet4.Cells(line, n - 1).Value = 10 ^ ((Sheet1.Cells(i + 1, 7).Value * 2 - Sheet1.Cells(n + 1, 3).Value) / 0.06 - (Sheet1.Cells(i + 1, 7).Value * 2 - Sheet1.Cells(2, 3).Value) / 0.06) ' Else ' Sheet4.Cells(line, n - 1).Value = 10 ^ ((Sheet1.Cells(j + 1, 5).Value * 2 - Sheet1.Cells(n + 1, 3).Value) / 0.06 - (Sheet1.Cells(i + 1, 7).Value * 2 - Sheet1.Cells(2, 3).Value) / 0.06) ' End If ' Else ' Sheet4.Cells(line, n - 1).Value = 10 ^ ((Sheet1.Cells(i + 1, 7).Value + Sheet1.Cells(j + 1, 5).Value - Sheet1.Cells(n + 1, 3).Value) / 0.06 - (Sheet1.Cells(i + 1, 7).Value * 2 - Sheet1.Cells(2, 3).Value) / 0.06) ' End If ' Next n ' line = line + 1 ' Next j 'Next i ' '求解Ia*Ra 'For n = 1 To 108 ' Sheet4.Cells(n, 8).Value = Sheet1.Cells(2, 4).Value ' For i = 3 To 7 ' Sheet4.Cells(n, 8).Value = Sheet4.Cells(n, 8).Value + Sheet1.Cells(i, 4).Value * Sheet4.Cells(n, i - 2).Value ' Next i 'Next n ' '求解nc总 'Dim line As Integer 'line = 1 ' 'For i = 1 To 6 ' For j = 1 To 18 ' Sheet4.Cells(line, 9).Value = Sheet1.Cells(i + 1, 8).Value * 2 + Sheet1.Cells(j + 1, 6).Value ' line = line + 1 ' Next j 'Next i ' '求解Na 'For line = 1 To 108 ' Sheet4.Cells(line, 10).Value = Sheet4.Cells(line, 9).Value / Sheet4.Cells(line, 8).Value '''''计算并存储nA ' For i = 1 To 5 ' Sheet4.Cells(line, 10 + i).Value = Sheet4.Cells(line, 10).Value * Sheet4.Cells(line, i).Value ' Next i 'Next line ' '求解D(理论) 'Dim line As Integer 'Dim i As Integer 'Dim j As Integer 'i = 1 'j = 1 'line = 1 'For i = 1 To 6 ' For j = 1 To 18 ' For n = 2 To 7 ''''n为键个数 ' If Sheet1.Cells(n, 1).Value = Sheet1.Cells(n, 2).Value Then ' If Sheet1.Cells(n, 1).Value = 1 Then ' Sheet4.Cells(line, 15 + n).Value = Sheet1.Cells(i + 1, 7).Value * 2 - 0.06 * Log10(Sheet4.Cells(line, 8 + n).Value) ' Else ' Sheet4.Cells(line, 15 + n).Value = Sheet1.Cells(j + 1, 5).Value * 2 - 0.06 * Log10(Sheet4.Cells(line, 8 + n).Value) ' End If ' Else ' Sheet4.Cells(line, 15 + n).Value = Sheet1.Cells(i + 1, 7).Value + Sheet1.Cells(j + 1, 5).Value - 0.06 * Log10(Sheet4.Cells(line, 8 + n).Value) ' End If ' Next n ' line = line + 1 ' Next j 'Next i ' '求误差 'Dim line As Integer 'line = 1 'For line = 1 To 108 ' For i = 2 To 7 ' Sheet4.Cells(line, 22 + i).Value = Abs(Sheet4.Cells(line, 15 + i).Value - Sheet1.Cells(i, 3).Value) ' Next i 'Next line ' '筛选 'For line = 1 To 108 ' For col = 24 To 29 ' If Sheet4.Cells(line, col) 0.005 Then ' Sheet4.Cells(line, col) = ' End If ' Next col 'Next line End Sub 转载请注明出处
个人分类: 未分类|3973 次阅读|3 个评论
用VBA剖析文献计量分析研究中的统计分析技术
huabolin 2008-10-24 12:20
用 VBA 剖析文献计量分析研究中的 统计分析技术 化柏林 ( 中国科学技术信息研究所 北京 100038) (发表于《现代图书情报技术》2007年第4期) 【摘要】 对计量分析研究中的统计按照统计结果进行了详细分类,然后对这些统计进行归纳分析,发现各种统计的关键技术都一样,只是对基础统计的依赖程度和输出结果的表现形式有所不同。在不支持 SQL语句的excel里用VBA进行统计,其实质变成了查找。通过本项研究,有望推动文献计量分析论文的自动生成与深入正文字段的内容分析。 【关键词】  计量分析 统计分析 技术实现  VBA 【分类号】  TP311,G35 Anatomy of statistic analysis technology in bibliometric and analytic system via VBA Hua Bolin ( Institute of Scientific and Technical Information of China, Beijing 100038, china) 【 Abstract 】 Statistic process of bibliometric is classified by statistic result. After concluding and analyzing various statistics, It is showed that critical technology of these statistics is same, but there is some difference in dependence on basic statistic and form of output. Statistic is actualized by find and comparing in excel using VBA, which is not supported with SQL. It is expected that papers of bibliometric can be written automatically and paper text can be analyzed deeply. 【 Keywords 】 bibliometric, statistic analysis, technical implement, VBA 文献计量中的统计按照对象分为作者统计、关键词、机构统计、主题统计、分类号统计、期刊统计、地区统计、参考文献统计(不同于引文分析)、基金资助统计、篇名统计、摘要统计、正文统计。按照统计结果又分为Top N 统计、奇异值统计、数量分布统计、年度增长统计、其它关联统计。统计计算过程与类型如图 1 所示。 图1 统计计算过程与类型图 1 数量初步统计 初步统计从技术实现上分为顺排统计与倒排统计。顺排统计指每一步统计只针对一条记录,如一篇文章含有几个关键词 ( 篇含关键词数 ) 、一个标题含多少字 ( 标题长度 ) ;倒排统计指每一项的统计涉及很多条记录,如一个关键词出现在哪些文章里,即统计关键词在统计样本里的总频次。顺排统计一般只需要 一重循环就可以了,而倒排统计往往要麻烦得多。 在不能使用 SQL 语句的情况下,倒排统计变成了一个查找的过程。以作者统计为例的统计程序流程如图 2 所示。 图 2 作者统计数据流程图 以作者统计为例的处理过程如下:从源表里每取一个数据,就要到目标表里去找,如果已经出现,那么在相应值后加 1 ,如果没有找到,则把该作者追加到后面,并初始化值为 1 。该程序需要注意的地方是对目标表必须遍历一趟才能知道有没有,所以用个布尔变量 bFind 来控制,如果找到了,置为 True ;如果没有找到,一直为 False 。也就是说相等说明找到了,不相等不能说明没有找到,只有所有的都不相等才能说明没有找到。统计程序源代码如表 1 所示。 表 1 关键词统计程序源代码 1: For i = 1 To iSrceCount 2: For j = 1 To 20 3: bFind = False 4: sTemp = Trim(Worksheets(sSrce).Cells(i, j)) 5: If sTemp = Then 6: Exit For 7: End If 8: For k = 1 To iDestCount 9: If sTemp = Worksheets(sDest).Cells(k, 1) Then 10: Worksheets(sDest).Cells(k, 2) = Worksheets(sDest).Cells(k, 2) + 1 11: bFind = True 12: Exit For 13: End If 14: Next 15: If bFind = False Then 16: iDestCount = iDestCount + 1 17: Worksheets(sDest).Cells(iDestCount, 1) = sTemp 18: Worksheets(sDest).Cells(iDestCount, 2) = 1 19: End If 20: Next 21: Next 这个算法速度非常慢,当有近五万条数据时,执行时间为二十多个小时。其原因是查找过程( k 循环)读取的是硬盘,因此把目标内容装到内存里,等操作完毕后再写回硬盘。改造前读写硬盘的次数为 iSrceCount*iCount*iDestCount/2 。在本实验中统计关键词时, iSrceCount=42989 , iDestCount=43980 ,篇均关键词个数为 4.7 ,因此统计关键词时读写硬盘的次数为 42989*4.7*43980/2=8886084234 ,约合为 9G 次。 为了提高程序执行速度, 把要查找的内容装到内存里(也就是变量),执行查找,等完全操作完毕后再写回硬盘,并把查找的过程写成函数,程序代码改造如表 2 所示。 表 2 改造后的统计程序源代码 1: Dim sTable(iRecCount, 2) As String 2: For i = 1 To iRecCount 3: For j = 1 To 10 4: sTemp = Worksheets(sSrce).Cells(i, j) 5: If sTemp = Then 6: Exit For 7: End If 8: iFindCol = findinArray(sTemp, sTable, 1) 9: If iFindCol 0 Then 10: sTable(iFindCol, 2) = sTable(iFindCol, 2) + 1 11: Else 12: iDestCount = iDestCount + 1 13:   sTable(iDestCount, 1) = sTemp 14:   sTable(iDestCount, 2) = 1 15: End If 16: Next 17: Next 18: For i = 1 To iRecCount 19: Worksheets(sDest).Cells(i, 1) = sTable(i, 1) 20: Worksheets(sDest).Cells(i, 2) = sTable(i, 2) 21: Next findinArray() 函数类似于系统提供的 instr() 函数。 Instr() 查找某字符串在整个字符串中的首次出现的位置,而 findinArray() 查找某字符串在整个数组中的位置。 本程序的查找过程使用了顺序遍历,如果目标数据做成有序的,按字符顺序排列就可以使用二分查找;如果是按频率排序,还需顺序遍历,这样保证高频词快速找到。按字符顺序排序的情况下,插入新数据比较麻烦;按频率排序的情况下,直接在末尾插入就可以了。 2 加权统计 不同位置的数据有着不同的重要性,因此有的统计需要加权。加权统计分为同字段位序加权与多字段加权。同字段位序加权是同一字段内给不同位序的值分配不同的权重,如作者、机构、分类号等都是有位序的,关键词等一般来讲是无序的。多字段加权是为不同的字段分配不同的权重,例如主题分析时为标题、关键词、分类号等字段分配不同的权重,然后利用公式进行计算求得文献的主题,同一个词在标题、关键词、摘要与正文里出现的权重是不同的。 同字段位序加权是按不同的位序分配不同的权重,一般来讲,位置靠前的作者权重高。加权统计有多种算法,常用的加权统计方法有等级分配法 ,即按合著文献中每个作者的排名先后递减分配其权重,设合作者人数为n ,则排名第i 位的著者的权重 为: 。 如果是加权统计,按表 2 进行计算的话, 把对目标表第 2 列加 1 的地方换成 (iCount-j+1)/iSum 就可以了,当然 iCount 与 iSum 要提前求出来。 由于关键词没有顺序关系,因此直接按出现次数进行统计并从大到小排列就可以了。但是统计关键词平均长度时就需要考虑是否带上频率。统计 关键词平均字符个数有两种统计方法,一种是不考虑出现频率的平均长度统计,一种是考虑出现频率的平均长度统计。用每个关键词长度乘以出现频率累加后除以总关键词频数 ,得到带频率的关键词平均长度 。关键词长度统计算法如表 3 所示。 表 3 带频率的关键词长度取值 1: For i = 1 To recCount 2: Worksheets(sDest).Cells(i, 3) = Len(Worksheets(sDest).Cells(i, 1)) 3: Worksheets(sDest).Cells(i, 4) = CInt(Worksheets(sDest).Cells(i, 3)) * CInt(Worksheets(sDest).Cells(i, 2)) 4: Next 3 TopN 统计 Top N是最常用最基本的统计,如高产作者统计、高被引作者(或文章或机构)统计、高频关键词统计等,以分析核心作者、核心期刊、核心研究机构等,Top N的输出以表格式形式所列,一般不进行图形显示。 Top N统计分为两类,一类是绝对数N,不管总数据量有多少,取绝对数N,例如高产作者前50位。另一类是相对数N,这个N的值不是一个确定的数,往往根据总数据量的多少来确定,一般是数据量的百分比。例如核心期刊的确定就是按照总数据量的多少来取,或者按二八原则确定某一专题研究的核心作者 。前者几乎不需要什么算法,直接取就可以了。后者的处理方式很多,有的按数据个数的百分比,有的按数据累加量的百分比。按二八原则取前N项的程序如表4所示。 表 4 按二八原则取前 N 项的程序源代码 1: For i=1 to iRecCount 2: iTotal=iTotal+ Worksheets(sDest).Cells(i, 2) 3: next 4: For i=1 to iRecCount 5: iSum = iSum+ Worksheets(sDest).Cells(i, 2) 6: if iSum/iTotal0.8 then 7: iTopN=i 8: exit for 9: end if 10: next 4  奇异值统计 奇异值统计包括最长、最短、最多、最少等端点值的统计,它不同于Top N统计。Top N统计某一特征的前N项,奇异值统计的是某一特征的端点值,而且有些特征本身就比较特殊,返回的是一个值,这种特征有时是一些很特殊的需求,所反映的是个别现象或特殊情况,如字符数最多的关键词、不含英文字符与标点符号的最长的关键词是什么,有多长,篇含关键词最多的个数,最短标题的长度,用等值统计和加权统计差别最大的作者(前者是不管第几作者都按一篇计算,后者按位序乘以相应的权重,一篇文章所有的和为1,分析是否有挂名现象等)。这些统计不是没有意义,例如找出最长的关键词可以确定可以在使用关键词构成的词库对标题、摘要等字段进行向量分词时确定最大向量长度。奇异值统计不适合以任何图形形式展现。 奇异值统计主要是循环比较,这种奇异值是需要根据特定的需求进行计算。如想查找标题里出现助词的最多的个数,其算法如表5所示。 表 5 统计标题中助词的最多的次数程序源代码 1: For i = 1 To iRecCount 2: sSentence = LTrim(Worksheets(sSrce).Cells(i, iSrceCol)) 3: For j = 1 To Len(sSentence) 4: If InStr(j, sSentence, 的 /u) 0 Then 5: iDeCount = iDeCount + 1 6: Else 7: exit for 8: End If 9: Next 10: If iDeCountiMaxCount then 11: iMaxCount=iDeCount 12: End If 13: Next 本实验先对所有文章标题进行分词,然后进行词性标记,然后再进行查找出现的字最多的标题。经过分词与词性标记避免了的确、有的放矢等噪声的影响,最终求得的iMaxCount 就是标题里含有助词 的最多的个数。 5  数量分布统计 数量分布统计主要统计数量分布关系,如实验中对图书情报学核心期刊的42,989篇文章进行统计分析,发现篇含关键词数量为三到八个的占到95%,这也要与大多数编辑部要求提供三到八个关键词有关,反过来也可以对一些规定进行验证其合理性。再者统计出四字关键词占关键词总数的41%。数量分布统计常以曲线图、柱状图、饼状图等形式展现。数量分布的统计比较简单,求标题长度分布的程序源代码如表6所示。 表 6 统计标题长度分布的程序源代码 1: For i=1 to iRecCount 2: Worksheets(sDest).Cells(i, 2)=len(Worksheets(sDest).Cells(i, 1)) 3: iLength= CInt(Worksheets(sDest).Cells(i, 2)) 4: Worksheets(sDest).Cells(iLength, 7) =Worksheets(sDest).Cells(iLength, 7) + 1 5: Next 实验中把标题长度进行了数量分布的统计,发现14个字符的标题最多,达到3909篇。数量分布统计的关键是找到分布情况,而不是端点值。例如,标题长度介于8~24个字符的文章数量达到38644篇,占90%,介于5~36个字符的文章数量达到42560,占99%。论文标题长度数量分布统计如图3所示。 图 3 标题长度数量分布统计图 6  年度增长统计 年度增长统计主要进行和时间有关的统计,如作者发文量的增长、关键词年度增长情况等。按年度统计可以分析新的生力军、新的研究热点,按关键词统计年度分布可以分析某项研究的生命周期,作者与关键词及年度的关系可以反映作者的研究轨迹。比较是年度增长统计的主要分析手段,无论是增长量还是增长率,都是双目运算。在年度增长的统计图中,必然要有年度作为一个时间维,这种统计常以曲线图或双柱状图,不适合以饼图形式展现。 还有机构的年度分布,或者关键词按年统计并分析出关键词年增长情况,还可分析关键词与期刊或分类号与期刊之间的关系,得到期刊的偏好,以方便大家投稿。按年度统计关键词程序如表7所示。 表 7 按年度统计关键词程序源代码 1: For i = 1 To iRecCount 2: iYear = Format(Date, YYYY) - Sheet5.Cells(i, 2) 3: iYearCol = iYear * 2 - 1 4: For j = 1 To 20 5: bFind = False 6: sTemp = Trim(Worksheets(sSrce).Cells(i, j)) 7: If sTemp = Then 8: Exit For 9: End If 10: For k = 1 To iYearCount(iYear) + 1 11: If sTemp = Worksheets(sDest).Cells(k, iYearCol) Then 12: Worksheets(sDest).Cells(k, iYearCol + 1) = Worksheets(sDest).Cells(k, iYearCol + 1) + 1 13: bFind = True 14: Exit For 15: End If 16: Next 17: If bFind = False And sTemp Then 18: iYearCount(iYear) = iYearCount(iYear) + 1 19: Worksheets(sDest).Cells(iYearCount(iYear), iYearCol) = sTemp 20: Worksheets(sDest).Cells(iYearCount(iYear), iYearCol + 1) = 1 21: End If 22: Next 23: Next 从关键词增长可以看出当年的研究热点,其计算方法也很多。第一种是年增长量,其弊端是高频关键词会靠前,如图书馆、中国等高频关键词会轮流排在前面;第二种方法是倍数,这样上一年较小的关键词排在前面,尤其是上一年频次为1的关键词;第三种方法是增长率,用当年的频次减去上一年的频次后再除以上一年的频次,得到的是相对于上一年的增长率;第四种方法是相对增长率,用当年的频次除以当年的所有关键词总频次f1,上一年的频次除以上一年的所有关键词总频次f2,然后用f1除以f2,当然也可以除以当年的文献数,这种情况主要是考虑不同年的文献量不一样,这种方法反映关键词在当年比重的增长情况;第五种方法是当年的关键词频次减去上一年的关键词频次再除以该关键词所有年的总频次,这种方法能够反映该关键词增长的高峰期,避免了基数大的词在当年排在了前面;第六种方法是把所有上一年为低频的次年变成高频的关键词统计出来,这能反映出关键词的快速增长期,反映出新的研究热点,不同的计算方法有不同的优缺点,可以满足不同的需求。 除了与时间有关的关联统计外,还可以统计关键词与期刊的关系,以及年度关键词与期刊的关系等都能反映出期刊的侧重点或期刊倾向的转变,便于大家有针对性地查资料或者投稿。技术实现上与年度增长统计大同小异。 7 结论 Top N统计、奇异值统计、数量分布统计、年度增长统计、其它关联统计基本上是在初步统计的基础上进行的。这些统计之间既有共性,又存在着差异。统计不是最终目的,最终目的是通过统计,能够做出评价、分析与预测。 不论是哪种统计,关键技术都比较相似,用循环与条件判断两种程序结构加上数学运算函数与字符串处理函数,无论是主题计量分析研究还是引文分析等计量分析研究都可以自动实现。纵观统计技术,实现起来都比较简单,期望更多的非技术背景的人能够很好的使用这种统计分析技术,共同推动计量分析特别是主题型计量分析研究论文的自动化生成。 虽然各种统计的关键技术相似,但不同的统计计算 对基础统计的依赖程度不一样,输出结果的形式也有所不同。 数量初步统计是基础, 各种统计 与基础统计的关系主要有两类,一类是直接在初步统计的基础上,对统计结果进行某种处理,包括数量分布统计和 Top N 统计,它们都绝对依赖于基础统计,如文章所含关键词个数的数量分布依赖于每篇文章所含的关键词数量,高产作者前 N 位依赖于每位作者的发文量;第二类是在进行基础统计的时候加上某种限定条件,包括奇异值统计、年度增长统计、其它关联统计等,它们是部分依赖于基础统计的,如年度增长统计是按年度进行分类统计,在此基础上进行不同年度之间的比较。 本研究尽管实现了对小字段的全自动统计分析,但尚存在以下几个问题:第一,处理大数据量能力有限,因为excel的限制,几十万的数据量处理起来就稍麻烦一些,需要多个sheet连接处理。第二,更多的是统计,对分析做得很不够。如统计模型与信息分析方法的运用很欠缺,缺乏对一些统计结果的自动化分析,如对奇异值的自动分析。也缺乏对统计结果上升到理论层面的验证与分析。对评价、预测与挖掘等深度分析尚未涉及。预测需要数学模型和专门的方法,如趋势外推法、时间序列法等 。挖掘是要从大量的统计数据中总结出新颖的、潜在有用的知识 。第三,没能实现统计报告的自动生成,统计报告要自动生成,语言理解与生成必不可少。使用统计报告要比统计论文更确切一些。这些统计报告大都涉及对数据源的选取、处理过程、统计结果以及对结果的说明,作者会在后续的研究中进一步总结这些报告或论文的框架与写作规律、常用句型的统计计量等,以实现报告或论文的自动化生成。 参考文献 1 娄策群.社会科学评价的文献计量理论与方法.华中师范大学出版社, 1999 : 68 2 李长玲,化柏林.我国网络计量学研究的文献计量分析.图书情报工作, 2006 ( 9 ): 46-50 3 化柏林.图书情报学核心期刊论文标题计量分析研究.情报学报, 2007(x) 4 蔡筱英,金新政,陈氢.信息方法概论.科学出版社:北京. 2004 . 231 , 239 5 粟湘.数据挖掘在科技论文分析中的应用研究 .中国科学技术信息研究所. 2003
个人分类: 文献计量|4762 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 16:40

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部