欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用vba实现将记录集输出到Excel模板

程序员文章站 2022-03-26 07:58:57
复制代码 代码如下:'************************************************  '** 函数名称: ...

复制代码 代码如下:

'************************************************ 
'** 函数名称:  exporttemplettoexcel 
'** 函数功能:  将记录集输出到 excel 模板 
'** 参数说明: 
'**            strexcelfile         要保存的 excel 文件 
'**            strsql               查询语句,就是要导出哪些内容 
'**            strsheetname         工作表名称 
'**            adoconn              已经打开的数据库连接 
'** 函数返回: 
'**            boolean 类型 
'**            true                 成功导出模板 
'**            false                失败 
'** 参考实例: 
'**            call exporttemplettoexcel(c:\\text.xls,查询语句,工作表1,adoconn) 
'************************************************ 
private function exporttemplettoexcel(byval strexcelfile as string, _ 
                                      byval strsql as string, _ 
                                      byval strsheetname as string, _ 
                                      byval adoconn as object) as boolean 
   dim adort                        as object 
   dim lngrecordcount               as long                       ' 记录数 
   dim intfieldcount                as integer                    ' 字段数 
   dim strfields                    as string                     ' 所有字段名 
   dim i                            as integer 

   dim exlapplication               as object                     ' excel 实例 
   dim exlbook                      as object                     ' excel 工作区 
   dim exlsheet                     as object                     ' excel 当前要操作的工作表 

   on error goto localerr 

   me.mousepointer = vbhourglass 

   '// 创建 ado 记录集对象 
   set adort = createobject(adodb.recordset) 

   with adort 
      .activeconnection = adoconn 
      .cursorlocation = 3           'aduseclient 
      .cursortype = 3               'adopenstatic 
      .locktype = 1                 'adlockreadonly 
      .source = strsql 
      .open 

      if .eof and .bof then 
         exporttemplettoexcel = false 
      else 
         '// 取得记录总数,+ 1 是表示还有一行字段名名称信息 
         lngrecordcount = .recordcount + 1 
         intfieldcount = .fields.count - 1 

         for i = 0 to intfieldcount 
            '// 生成字段名信息(vbtab 在 excel 里表示每个单元格之间的间隔) 
            strfields = strfields & .fields(i).name & vbtab 
         next 

         '// 去掉最后一个 vbtab 制表符 
         strfields = left$(strfields, len(strfields) - len(vbtab)) 

         '// 创建excel实例 
         set exlapplication = createobject(excel.application) 
         '// 增加一个工作区 
         set exlbook = exlapplication.workbooks.add 
         '// 设置当前工作区为第一个工作表(默认会有3个) 
         set exlsheet = exlbook.worksheets(1) 
         '// 将第一个工作表改成指定的名称 
         exlsheet.name = strsheetname 

         '// 清除“剪切板” 
         clipboard.clear 
         '// 将字段名称复制到“剪切板” 
         clipboard.settext strfields 
         '// 选中a1单元格 
         exlsheet.range(a1).select 
         '// 粘贴字段名称 
         exlsheet.paste 

         '// 从a2开始复制记录集 
         exlsheet.range(a2).copyfromrecordset adort 
         '// 增加一个命名范围,作用是在导入时所需的范围 
         exlapplication.names.add strsheetname, = & strsheetname & !$a$1:$ & _ 
                                  ugetcolname(intfieldcount + 1) & $ & lngrecordcount 
         '// 保存 excel 文件 
         exlbook.saveas strexcelfile 
         '// 退出 excel 实例 
         exlapplication.quit 

         exporttemplettoexcel = true 
      end if 
      'adstateopen = 1 
      if .state = 1 then 
         .close 
      end if 
   end with 

localerr: 
   '********************************************* 
   '** 释放所有对象 
   '********************************************* 
   set exlsheet = nothing 
   set exlbook = nothing 
   set exlapplication = nothing 
   set adort = nothing 
   '********************************************* 

   if err.number <> 0 then 
      err.clear 
   end if 

   me.mousepointer = vbdefault 
end function 

'// 取得列名 
private function ugetcolname(byval intnum as integer) as string 
   dim strcolnames                  as string 
   dim strreturn                    as string 

   '// 通常字段数不会太多,所以到 26*3 目前已经够了。 
   strcolnames = a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z, & _ 
                 aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az, & _ 
                 ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz 
   strreturn = split(strcolnames, ,)(intnum - 1) 
   ugetcolname = strreturn 
end function