<p><strong>人力资源统计VBA的高级应用实例分析(续)</strong></p><p>编写这样一个程序,需要具备三方面的知识技能,首先懂得数据库的基本知识,明白数据库的结构,理解字段、记录的含义;其次,掌握SQL语句基本用法,特别是查询语句的使用,即select 语句的不同用处;会用ADO对象,理解连接对象并会使用,理解记录集对象并会灵活地使用。这些对搞人力资源的专业人员来说有一定难度,本人也是在实际使用过程中,逐步掌握的,本身并不是计算机专业出身。最后是掌握一点VBA编程技术。只有这样你才能理解这段不长,但功能很强的代码。<br/> 程序的第一部分,就是前几行,以Dim开头的语句,这些是定义变量的,目的是为下面使用做基础的。<br/> Dim cnn As New ADODB.Connection<br/> Dim rs As New ADODB.Recordset<br/> 这两句是定义ADO连接对象和记录集对象的变量,可以理解成我们借来两个大的机器设备,准备好两个地方。其他的变量是普通变量,从字母上也很好理解。比如:mymonth,就是一个统计月数的变量,统计12个月的数据,就付给它12,统计6个月的数据,就付给它6。<br/>为了使程序能找到dbf文件,必须确定当前的路径,接下来的语句就是取得路径的变量,通过ThisWorkbook.Path语句获得路径的。其语句为:<br/> myPath = ThisWorkbook.Path<br/>而下面的语句是定义了dbf文件的完整的文件名和路径<br/> xlsFile = Dir(ActiveWorkbook.Path & "\payto2007.DBF")<br/> 而下面5行,是个定势,是访问数据库dbf的固定模式,含义是连接一个dbf文件并使这个连接有效。语句为:<br/> cnnStr = "Driver={Microsoft Visual FoxPro Driver};" _<br/> & "SourceType=DBF;" _<br/> & "SourceDB=" & myPath & ";" _<br/> & "Exclusive=No;"<br/> cnn.Open cnnStr<br/>需要强调的是,这5行语句中,只有第三行使用了我们定义的变量,其他一律照搬,不需要理解也能用。这种使用的方法,如同我们使用电话机一样,我们知道打电话时,只管拨对号就是了,不必了解其构造。<br/> 在和数据库联通之后,就为我们查询数据提供了方便,就好比打开了一个仓库的大门,里面有很多的货物,下一步我们要采取何种办法,如何尽快找到我们需要的货物。对数据库而言,就要使用记录集了。<br/> 要完成对记录集的查询,有一个最好的方法,就是用SQL语句,SQL语句是针对各种数据库查询而设计的万能钥匙,其语法很简单,用语言叙述,就是要从那个数据表中,查看那些数据内容,也就是字段。语法是这样:select(查询语句开头) 字段名1,字段名2... from(从那个) 数据库名称。如我们写:<br/>select name,team,paytotal from pay2007 就是从表名为pay2007的表中,查看员工姓名,部门和收入总额。查看的内容一定和数据库里的字段名一致,如果我们想改名,就要在该字段后,写上as再写要显示的名称。如数据库员工姓名字段是name,要改为“姓名”,写成" name as 姓名"。有时候我们对查询需要汇总后的内容,那么,再学会使用group by这句。<br/> 好了,理解了SQL语句就掌握了这个程序的内容的80%。下面的语句也是个固定模式,理解为运行写好SQL语句并把结果放入内存。具体语句是:<br/>rs.Open SQL, cnn, adOpenDynamic, adLockOptimistic<br/>我们的目的是将查询的结果放入EXCEL表格中,不是放入内存,放入内存是看不到结果的。因此,要指定当</p><p>前的EXCEL表格,将内容拷入到表格当中去,在拷贝之前还要将表格清空,防止混乱,同时还要在第一行自动写入每行的标题。如下语句分别解释:</p><p> Sheets("累计收入").Activate 选定工作表语句<br/> Cells.Clear 表格清空<br/> 一下三行在第一行自动写入每行的标题,也是个固定用法<br/> For I = 1 To rs.Fields.Count<br/> Cells(1, I) = rs.Fields(I - 1).Name<br/> Next I<br/> Range("A2").CopyFromRecordset rs 从表格第二行开始复制查询出来的记录<br/> rs.Close 关闭记录集<br/> 需要说明的是rs.Close语句。当一个查询语句使用后一定要关闭它。一来可以节省内存的空间,另外,也为建立新的记录查询做好准备。关掉后我们就可以再继续进行新的查询。这段程序之所以能完成三种不同的查询,技巧就在这里。很多教材在写ADO对象的使用时,往往使用的是单一的记录查询,会时读者理解成,一个数据源的连接,只能使用一次SQL语句。还有我们这里的记录集是针对一个dbf文件,实际上,当有其他的文件时,同样可以查询,这样一来,查询更多,使用起来更灵活。<br/> 罗唆了这么多,也不知道大家能不能看懂,我还是头回写这样的文字,感觉这里气氛很好,主要是想和大家共同分享,共同学习,在这里我得到过很多无私朋友的帮助,也想把我工作中的经验和大家说说。</p>
[此贴子已经被作者于2007-12-23 9:52:26编辑过] |