




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Excel中应用VBA批量导入数据1. 问题由来当一个漂亮MM向你请教如何录制并修改一个宏,把她每次的实验数据(几十个数据文件)导入Excel时,你感慨道:“很多Excel专家会录制一个宏来解决问题,然后每次使用的时候修改代码并粘贴到需要的地方,对于一个合格的程序员,这是最要命的事情。” 漂亮MM打断并告诉你,她不是程序员,也不想做程序员,然后命令你开始工作。2. 通过录制宏导入数据对于这个无法拒绝的MM,你只好垂头丧气的开始面对要解决的问题,想着MM几年后博士毕业,年薪至少5万,干个3、5年,年薪10万,还有项目提成,平时吃饭、打车、买可乐都可以报销,当然不会像你放弃了自己的专业,做了一个为生计奔波的程序员。数据文件是仪器生成一系列文本格式的数据文件,格式完全一样,目的是要把每个数据文件导入到Excel中作为一条记录,也就是一行。那么,你想,可以用VBA写一个程序,然后定位到需要的位置,读入需要的信息就可以了。你打开Excel,打开VBA编辑器,准备开始写代码。“开始录宏吧”,MM提醒了心不在焉的你,你沉默了0.1秒,默念了一下VBA的信条:“万不得已不要写代码,尽量使用Office的功能”。于是你启动Excel打开这个文本文件,按照弹出的文本文件导入向导对话框的步骤,使用固定列宽导入了需要的数据。数据包括2部分,第一部分是文件头,包括一些数据信息,后面是按行放置的数据,包括结果和误差,MM要的是后边的数据,要把每行的数据和误差放置到相邻的两列(见下图)。图 1数据文件部分和需要在Excel中的结果数据明白了问题,一切就好办了,打开Excel,然后开始录制宏:首先打开文件,通过导入文本文件向导,读入数据,将特定单元格的数据拷贝到一个目标Excel文件中,然后关闭这个文本文件,停止录制宏。录制的宏很长,大概包括2部分。第一部分是一句打开文件,格式转换的操作,后边一部分是激活不同的文件,拷贝和粘贴不同的Range。你删除掉刚才拷贝进来的数据,运行了一下这个宏,很好,需要的数据进来了。3. 修改宏导入成批数据MM提醒你,这个她也能做到,但怎么样把所有的数据文件都导入进来。你看看她带来的文件,文件名是“r20041124001357.txt”、“r20041124001358.txt”、“r20041124001359.txt”、“r20041124001360.txt”之类,大概是时间加序列吧。你想,嗯,写一个循环就可以了,你打开了刚才录制的宏,检查了一下MM带来的文件,文件名最后2位从46到89,你可以写一个i从1到44的循环,把读入文件部分的文件名改为:r200411240013 & ( i + 45 ) & .txt把粘贴目的地(range)表示行数的数字用i替换。OK,你按下了执行按钮,每次关闭文件的时候,有一个讨厌的是否保存文件的对话框跳出来,其他好像一切正常,还好,点击了44次鼠标后,MM得到了需要的数据。4. 修改VBA代码实现一个可通用的宏4.1. 指定要导入的文件当MM向你请教如何更改循环以导入不同的文件的数据时,你程序员的劣根性又开始冲动,你想通过一个打开文件对话框来指定需要的文件。你觉得实现应该不复杂,通过一个打开文件对话框,选择一系列文件,然后将文件全路径存入一个集合或数组,然后循环读出这些文件就可以了。你先创建了一个窗体,然后放置了一个按钮,将CommonDialog控件引入工程,添加到窗体,在按钮的点击事件里加入如下代码: Dim strFiles As String, i As Long With CommonDialog1 .Flags = &H200& Or &H80000 可以选择多个文件 .ShowOpen If .FileName Then strFiles = .FileName End If End With 分割返回值,返回值为以ASCII码为0的分割的字符串 字符串第一个为路径,之后为单个文件名 Files = Split(strFiles, Chr(0) For i = 1 To UBound(Files) Step 1 Files(i) = Files(0) & & Files(i) 连接路径和文件名,组成文件数组 Next i代码不多,最后的文件列表保存在Files数组里。因为第一次使用CommonDialog控件打开多个文件,查找出多个文件的分割符号是ASCII码为0的字符费了你不少时间。你开始查了文档,没有得到信息;将FileName属性用Msgbox输出只有路径,在调试状态跟踪时是一个怪字符分割的;你开始想想应该是Tab或者回车之类的,然后使用这些字符用Split函数分割,没有成功;只好测试了,你将所有字符使用ASC函数输出,发现原来是ASCII码为0的字符。你想,微软的文档向来不错,为什么这个在帮助里没有呢?后面的部分就简单了。For i = 1 To UBound(Files) Step 1 strFilename = Files(i) DoImport strFilenameNext i把原来的宏修改后保存在DoImport这个过程里,传入文件名即可导入这个文件,循环导入所有文件就可以了。虽然程序功能复杂了,但代码似乎要有条理了。4.2. 指定要导入的位置聪明绝顶的MM很高兴,马上又举一反三,提出应该可以指定从第几行开始导入。你脑子转了一下,认为这个需求属于合理需求,不能不予理会。给窗体加一个RefEdit,点击开始的区域后返回的将是一个引用位置的字符串,使用Range函数得到该区域的引用对象(Range对象),然后就可以得到其开始行数:Range(Me.RefEdit1.Value).Row重构一下DoImport这个过程,增加一个mRow参数,将导入的数据全部写到第mRow行。上面的调用过程就变成了:dim mRow as longmRow = Range(Me.RefEdit1.Value).Row For i = 1 To UBound(Files) Step 1 strFilename = Files(i) DoImport strFilename, mRow mRow = mRow + 1Next i你终于松了一口气,脸上又浮现出了贼贼的笑容。MM也答应要请你吃饭,不过你知道兑现的可能性不大,最后还可能是MM请客你掏钱,不过不要紧,程序员的最起码的风度和尊严还是要维护的。4.3. 修改导入规则你忽然觉得灵感一现,甚至想做一个可以导入各种格式文件的通用模块,然后作为加载宏发布,于是很多实验室都开始用你的程序,你开始狂收注册费,Gates也坐不住了,要把你的程序买了OEM在Excel里这时,呆在一旁的MM敲了一下你的头
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年虚拟现实技术在教育行业应用前景研究报告
- 2025年人工智能在智能交通领域的应用前景研究报告
- 2025年智能家居行业智能家电市场前景分析研究报告
- 2025年火电脱硝行业研究报告及未来发展趋势预测
- 压力机安全培训内容课件
- 2025年人脸识别技术行业市场应用前景研究报告
- 2025年智能穿戴行业可穿戴设备应用与市场前景研究报告
- 2025年区块链技术在保险行业的应用前景研究报告
- 2025年可穿戴设备行业创新设计与市场前景研究报告
- 巴中市2025年四川巴中市第八批就业见习岗位笔试历年参考题库附带答案详解
- 2024年考研英语核心词汇
- 起重作业十不吊、八严禁
- 核电知识学生科普单选题100道及答案解析
- 钢筋混凝土污水管道施工工程施工组织设计方案
- 百度在线朗读器
- 医院消防安全知识培训课件
- 常压储罐日常检查记录表
- 《公共政策学(第二版)》 课件 杨宏山 第1-6章 导论、政策系统-政策执行
- 2024使用林地可行性报告委托编制合同书(范本)
- 《马克思主义基本原理概论》试题库含答案(典型题)
- 脑梗取栓护理查房
评论
0/150
提交评论