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,另一個按鈕功能沒有實現

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