Excel中用VBA链接Oracle实现位置随意标题

我用的是Oracle 11g + Microsoft Office 2010 旗舰版 

首先要添加引用类库:

  Microsoft ActiveX Data Objects Recordset 6.0(或者2.8)Library

  Microsoft Activex Data Objects 6.1(或者2.8) Library

 

链接Oracle的字符串有三种,而我试验了几次两种,一种是odbc,另一种是ado方式

这两种链接方式如下:

odbc: 

"DSN=orcl;UID=scott;PWD=tiger;DBQ=ORCL;DBA=W;APA=T;EXC=F;

FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;

NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;"

ado:

"Provider = OraOLEDB.Oracle;Persist Security Info=true;User ID = scott;Password = whg;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.178.168)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=Orcl)))"

其中odbc只能实现链接本机数据库,不能远程,而ado方式可以实现远程连接,只需把host后面的ip改成目标地址即可。

做了一个活动标题的excel vba例子,所谓活动标题,是位置比较随意,可以互换位置,但中间不能有空的单元格,如果表头中有“序列”的话,可以自动编号。下面就贴上代码

VBA代码

  1. Option Explicit 
  2. Public Const DATA_START_ROW As Byte = 4 '数据起始位置 
  3. Public fieldsCount As Integer 
  4. Public fieldsZH() As String '中文名称 表头 
  5. Public fieldsEN() As String '英文名称,数据库字段 
  6. Public fieldsType() As String '字段类型 
  7.  
  8. '初始化字段值 
  9. Sub initFields() 
  10.     Dim i As Integer 
  11.     ThisWorkbook.Sheets(1).Activate 
  12.     With Range("A1").CurrentRegion 
  13.         fieldsCount = .Rows.Count 
  14.     End With 
  15.      
  16.     ReDim fieldsZH(fieldsCount - 1) 
  17.     ReDim fieldsEN(fieldsCount - 1) 
  18.     ReDim fieldsType(fieldsCount - 1) 
  19.      
  20.     For i = 0 To fieldsCount - 1 
  21.         fieldsZH(i) = Cells(i + 1, 1) 
  22.         fieldsEN(i) = Cells(i + 1, 2) 
  23.         fieldsType(i) = Cells(i + 1, 3) 
  24.     Next 
  25. End Sub 
  26.  
  27. Option Explicit 
  28.  
  29. '定义链接属性 
  30. Dim conn As ADODB.Connection '################################################## 
  31. Dim rs As ADODB.Recordset '####################################### 
  32. Dim OraID As String 
  33. Dim OraUsr As String 
  34. Dim oraPwd As String 
  35. Dim serIP As String 
  36. Dim sqlStr As String 
  37.      
  38. '初始化链接属性 
  39. Sub InitConnect() 
  40.     On Error GoTo ConnectingError 
  41.     Set conn = New ADODB.Connection 
  42.     Set rs = New ADODB.Recordset 
  43.     OraID = "orcl"       'Oracle数据库的相关配置 
  44.     OraUsr = "scott"      '用户名 
  45.     oraPwd = "tiger"      '登录密码 
  46.     serIP = "127.0.0.1"   '数据库ip地址和数据困服务器名 
  47.     conn.ConnectionString = "Provider = OraOLEDB.Oracle.1;" & _ 
  48.     "Password=" & oraPwd & ";User ID=" & OraUsr & _ 
  49.     ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" & _ 
  50.     "(HOST=" & serIP & ")(PORT=1521))" & _ 
  51.     "(CONNECT_DATA=(SERVICE_NAME=" & OraID & ")))" 
  52.     'MsgBox conn.ConnectionString 
  53.     conn.Open 
  54.     rs.ActiveConnection = conn 
  55.     Exit Sub 
  56. ConnectingError: 
  57.     MsgBox "无法连接数据库,请检查数据库服务配置" 
  58.     Exit Sub 
  59. End Sub 
  60.  
  61. '从Excel同步到Oracle 
  62. Sub ExcelToOracle() 
  63.  
  64. End Sub 
  65.  
  66. '关闭连接 
  67. Sub CloseConnect() 
  68.     On Error Resume Next 
  69.     If Not IsEmpty(rs) Then 
  70.         rs.Close 
  71.     End If 
  72.     If Not IsEmpty(conn) Then 
  73.         conn.Close 
  74.     End If 
  75. End Sub 
  76.  
  77. '从Oracle同步到Excel 
  78. Sub OracleToExcel() 
  79.     InitConnect '初始化链接 
  80.     initFields  '初始化字段 
  81.     Dim i As Integer 
  82.     Dim j As Integer 
  83.     Dim k As Integer 
  84.     Dim excelTitleSeq() As Integer '存储表头对应的数据库字段所在位置 
  85.     Dim flag As Boolean '循环跳出标识 
  86.     Dim idSeq As Integer ' 表头中“序列”的下标 
  87.      
  88.     ThisWorkbook.Sheets(2).Activate 
  89.     sqlStr = "select * from empinfo where newdata=1" 
  90.     rs.Open Source:=sqlStr, LockType:=adLockBatchOptimistic 
  91.      
  92.     ReDim excelTitleSeq(rs.Fields.Count - 1) 
  93.     For i = 0 To rs.Fields.Count - 1 
  94.         excelTitleSeq(i) = -1 
  95.     Next 
  96.      
  97.      
  98.      
  99.     '----------------------新算法, 序列位置随意 
  100.     For i = 0 To Cells(DATA_START_ROW - 1, 1).CurrentRegion.Columns.Count - 1 '循环匹配表头 
  101.         If Cells(1, DATA_START_ROW - 1).Value = "序列" Then 
  102.             idSeq = i + 1 
  103.         End If 
  104.         flag = False 
  105.         For j = 0 To fieldsCount - 1 '依次找到对应的数据库字段的下标 
  106.             If Trim(Cells(DATA_START_ROW - 1, i + 1)) = Trim(fieldsZH(j)) Then 
  107.                 For k = 0 To rs.Fields.Count - 1 '从数据库字段中查找这个对应值 
  108.                     If UCase(Trim(fieldsEN(j))) = UCase(Trim(rs.Fields(k).Name)) Then 
  109.                         excelTitleSeq(i) = k 
  110.                         flag = True 
  111.                         Exit For 
  112.                     End If 
  113.                 Next 
  114.             End If 
  115.             If flag Then 
  116.                 Exit For 
  117.             End If 
  118.         Next 
  119.     Next 
  120.                      
  121.                  
  122.      
  123.      
  124.     '给表格赋值 
  125.     i = DATA_START_ROW 
  126.     Do Until rs.EOF 
  127.         For j = 0 To rs.Fields.Count - 1 
  128.             If idSeq <> 0 Then '判断是否有“序列” 
  129.                 Cells(i, idSeq).Value = i - DATA_START_ROW + 1 
  130.             End If 
  131.              
  132.             If excelTitleSeq(j) <> -1 Then 
  133.                 Cells(i, j + 1).Value = rs.Fields(excelTitleSeq(j)).Value 
  134.             End If 
  135.         Next 
  136.         i = i + 1 
  137.         rs.MoveNext 
  138.     Loop 
  139.     CloseConnect 
  140. End Sub 

sql语句

 

  1. --人员基本信息表 
  2. create table empinfo(   
  3.    email varchar2(50), --邮箱 
  4.    eno varchar2(12) unique--人员编号 
  5.    ename varchar2(20) not null--人员姓名 
  6.    eid varchar2(20) unique--身份证号码 
  7.    cardno varchar2(6) unique--卡号 
  8.    status varchar2(20), --状态 
  9.    org varchar2(50), --人员组织 
  10.    egroup varchar2(50), --组别 由group改- 
  11.    groupno varchar2(10), --组号 由组别截取第一位 
  12.    formation varchar2(25), --编制 
  13.    sex varchar2(10), --性别 
  14.    birthday varchar2(20), --出生日期 
  15.    address varchar2(100), --家庭住址 
  16.    drivetime varchar2(20), --车程 
  17.    graduate varchar2(50), --毕业院校 
  18.    major varchar2(50), --专业 
  19.    job varchar2(50), --职务 
  20.    elevel varchar2(20), --等级 由level改 
  21.    eresume varchar2(10), --简历 是否有 由resume改 
  22.    erole varchar2(50), --角色 由role改 
  23.    tutor varchar2(20), --导师 
  24.    phone varchar2(20), --电话 
  25.    tel varchar2(20), --座机 
  26.    education varchar2(20), --学历 
  27.    leveltime varchar2(20), --等级时间 
  28.    graduateyear varchar2(10), --毕业年份 
  29.    interntime varchar2(20), --见习时间 
  30.    comtime varchar2(20), --入司时间 
  31.    deptime varchar2(20), --入部门时间 
  32.    depyear varchar2(10), --入部门年度 
  33.    beforeinfo varchar2(500), --入部门前情况 
  34.    leavetime varchar2(20), --离职时间 
  35.    workinfo varchar2(500), --工作经历 
  36.    projectexpr varchar2(500), --卫生政务项目经历 
  37.    tecinfo varchar2(50), --技术认证 
  38.    certificate varchar2(10), --证书 
  39.    marriage varchar2(10), --婚姻 已婚 未婚 离异 
  40.    childyear varchar2(10), --小孩年份 
  41.    im1 varchar2(20), --及时通讯工具1 
  42.    im2 varchar2(20), --及时通讯工具2 
  43.    linkman varchar2(20), --紧急联系人 
  44.    linkmanphone varchar2(20), --紧急联系人电话 
  45.    tecdirection varchar2(50), --推荐技术方向 
  46.    homephone varchar2(20), --家庭电话 
  47.    comments varchar2(500), --备注 
  48.    newdata varchar2(1)  --最新数据标识 
  49. ); 

附件中,只实现了从Oracle导出到excel,另一个按钮功能没有实现

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章