设为首页 收藏本站
查看: 1137|回复: 0

[经验分享] Excel中用VBA链接Oracle实现位置随意标题

[复制链接]

尚未签到

发表于 2018-9-24 12:10:20 | 显示全部楼层 |阅读模式
  我用的是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>  其中odbc只能实现链接本机数据库,不能远程,而ado方式可以实现远程连接,只需把host后面的ip改成目标地址即可。
  做了一个活动标题的excel vba例子,所谓活动标题,是位置比较随意,可以互换位置,但中间不能有空的单元格,如果表头中有“序列”的话,可以自动编号。下面就贴上代码
  VBA代码
  


  • Option Explicit
  • Public Const DATA_START_ROW As Byte = 4 '数据起始位置
  • Public fieldsCount As Integer
  • Public fieldsZH() As String '中文名称 表头
  • Public fieldsEN() As String '英文名称,数据库字段
  • Public fieldsType() As String '字段类型

  • '初始化字段值
  • Sub initFields()
  •     Dim i As Integer
  •     ThisWorkbook.Sheets(1).Activate
  •     With Range("A1").CurrentRegion
  •         fieldsCount = .Rows.Count
  •     End With

  •     ReDim fieldsZH(fieldsCount - 1)
  •     ReDim fieldsEN(fieldsCount - 1)
  •     ReDim fieldsType(fieldsCount - 1)

  •     For i = 0 To fieldsCount - 1
  •         fieldsZH(i) = Cells(i + 1, 1)
  •         fieldsEN(i) = Cells(i + 1, 2)
  •         fieldsType(i) = Cells(i + 1, 3)
  •     Next
  • End Sub

  • Option Explicit

  • '定义链接属性
  • Dim conn As ADODB.Connection '##################################################
  • Dim rs As ADODB.Recordset '#######################################
  • Dim OraID As String
  • Dim OraUsr As String
  • Dim oraPwd As String
  • Dim serIP As String
  • Dim sqlStr As String

  • '初始化链接属性
  • Sub InitConnect()
  •     On Error GoTo ConnectingError
  •     Set conn = New ADODB.Connection
  •     Set rs = New ADODB.Recordset
  •     OraID = "orcl"       'Oracle数据库的相关配置
  •     OraUsr = "scott"      '用户名
  •     oraPwd = "tiger"      '登录密码
  •     serIP = "127.0.0.1"   '数据库ip地址和数据困服务器名
  •     conn.ConnectionString = "Provider = OraOLEDB.Oracle.1;" & _
  •     "Password=" & oraPwd & ";User ID=" & OraUsr & _
  •     ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" & _
  •     "(HOST=" & serIP & ")(PORT=1521))" & _
  •     "(CONNECT_DATA=(SERVICE_NAME=" & OraID & ")))"
  •     'MsgBox conn.ConnectionString
  •     conn.Open
  •     rs.ActiveConnection = conn
  •     Exit Sub
  • ConnectingError:
  •     MsgBox "无法连接数据库,请检查数据库服务配置"
  •     Exit Sub
  • End Sub

  • '从Excel同步到Oracle
  • Sub ExcelToOracle()

  • End Sub

  • '关闭连接
  • Sub CloseConnect()
  •     On Error Resume Next
  •     If Not IsEmpty(rs) Then
  •         rs.Close
  •     End If
  •     If Not IsEmpty(conn) Then
  •         conn.Close
  •     End If
  • End Sub

  • '从Oracle同步到Excel
  • Sub OracleToExcel()
  •     InitConnect '初始化链接
  •     initFields  '初始化字段
  •     Dim i As Integer
  •     Dim j As Integer
  •     Dim k As Integer
  •     Dim excelTitleSeq() As Integer '存储表头对应的数据库字段所在位置
  •     Dim flag As Boolean '循环跳出标识
  •     Dim idSeq As Integer ' 表头中“序列”的下标

  •     ThisWorkbook.Sheets(2).Activate
  •     sqlStr = "select * from empinfo where newdata=1"
  •     rs.Open Source:=sqlStr, LockType:=adLockBatchOptimistic

  •     ReDim excelTitleSeq(rs.Fields.Count - 1)
  •     For i = 0 To rs.Fields.Count - 1
  •         excelTitleSeq(i) = -1
  •     Next



  •     '----------------------新算法, 序列位置随意
  •     For i = 0 To Cells(DATA_START_ROW - 1, 1).CurrentRegion.Columns.Count - 1 '循环匹配表头
  •         If Cells(1, DATA_START_ROW - 1).Value = "序列" Then
  •             idSeq = i + 1
  •         End If
  •         flag = False
  •         For j = 0 To fieldsCount - 1 '依次找到对应的数据库字段的下标
  •             If Trim(Cells(DATA_START_ROW - 1, i + 1)) = Trim(fieldsZH(j)) Then
  •                 For k = 0 To rs.Fields.Count - 1 '从数据库字段中查找这个对应值
  •                     If UCase(Trim(fieldsEN(j))) = UCase(Trim(rs.Fields(k).Name)) Then
  •                         excelTitleSeq(i) = k
  •                         flag = True
  •                         Exit For
  •                     End If
  •                 Next
  •             End If
  •             If flag Then
  •                 Exit For
  •             End If
  •         Next
  •     Next




  •     '给表格赋值
  •     i = DATA_START_ROW
  •     Do Until rs.EOF
  •         For j = 0 To rs.Fields.Count - 1
  •             If idSeq  0 Then '判断是否有“序列”
  •                 Cells(i, idSeq).Value = i - DATA_START_ROW + 1
  •             End If

  •             If excelTitleSeq(j)  -1 Then
  •                 Cells(i, j + 1).Value = rs.Fields(excelTitleSeq(j)).Value
  •             End If
  •         Next
  •         i = i + 1
  •         rs.MoveNext
  •     Loop
  •     CloseConnect
  • End Sub
  

  sql语句
  


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

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600582-1-1.html 上篇帖子: Oracle RAC 添加删除节点 下篇帖子: Oracle解决查询表空间速度慢的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表