ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1299|回复: 1

[求助] 求助用 VB6 封装包含 SQL 语句的VBA 的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-27 22:50 | 显示全部楼层 |阅读模式
本帖最后由 soleilzx 于 2018-7-28 23:37 编辑

大家好,先介绍一下背景,由于公司安全要求,在公司的计算机系统上禁止个人用户注册,安装 .dll文件,但不禁止VBA。所以我想把自己的代码在私人电脑上用VB6封装成 .exe 文件,然后在公司电脑上共享给同事使用,

公司工作环境是 Win7 和 Excel 2013
我私人电脑环境是 Win8.1 和 Excel 2016

我现在碰到的问题是,在VBE中运行正常,可以确认代码没问题,但在封装过程中总是在 “sdb.Open cnn” 运行不过去
所以请求各位 Excel 行家帮助找一下以下封装代码的问题到底出在哪里。
  1. Sub Main()
  2.    
  3.     Dim sPath As String
  4.     Dim ExcelApp As Excel.Application ' ================================ 定义ExcelApp 为 Excel对象
  5.     Dim bCreatApp As Boolean
  6.     Dim wWB As Workbook

  7.     sPath = App.Path & ""  ' ====================================== 获得当前Exe文件所在文件夹
  8.     On Error Resume Next
  9.     Set ExcelApp = GetObject(, "Excel.Application") ' 获取已经打开的 Excel 程序
  10.     bCreatApp = ExcelApp Is Nothing
  11.     On Error GoTo 0
  12.     If bCreatApp Then ' ========================================= 如果 Excel 程序未打开
  13.         Set ExcelApp = CreateObject("Excel.Application") ' ====== ================ 则打开 Excel 程序
  14.         ExcelApp.Visible = True ' ====================================== 显示 Excel 程序
  15.         With ExcelApp
  16.             Set wWB = .Workbooks.Open(sPath & "TEST-Encapsulation V1.xlsm") ' ========== 打开目标 Excel 文件
  17.         End With
  18.     Else
  19.         With ExcelApp
  20.             For Each wkb In .Workbooks
  21.                 If wkb.Name = "TEST-Encapsulation V1.xlsm" Then ' ===================== 找到目标文件
  22.                     Set wWB = .Workbooks("TEST-Encapsulation V1.xlsm") ' ================== 把目标文件赋给 wWB
  23.                 End If
  24.             Next
  25.         End With
  26.     End If
  27.    
  28.     ' ====================== 以下代码开始计算聚合表 =========================
  29.     With wWB
  30.         Set sdb = CreateObject("adodb.connection")
  31.    
  32.         cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" _
  33.                 & .FullName ' ====================== SQL 链接语句
  34.    
  35.         qry = "transform count(*) select `Dept` from [TestDB$] group by `Dept` pivot `OS Class`"
  36.    
  37.         sdb.Open cnn ' ============================= 链接数据源表
  38.         Set sta = sdb.Execute(qry) ' =============== 执行数据SQL语句
  39.         
  40.         With .Worksheets("Statistic") ' ============ 在统计工作表中,显示SQL语句执行结果
  41.             For i = 0 To sta.Fields.Count - 1
  42.                 .Cells(1, i + 1) = sta.Fields(i).Name
  43.             Next i
  44.    
  45.             .Cells(2, 1).CopyFromRecordset sta
  46.         End With
  47.    
  48.         sdb.Close
  49.         Set sdb = Nothing
  50.     End With
  51. End Sub
复制代码



捕获.jpg

TA的精华主题

TA的得分主题

发表于 2018-7-28 07:53 | 显示全部楼层
其他暂时没看出什么问题,但有一个地方可能需要考虑一下调整
1532735297(1).jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-28 23:12 | 显示全部楼层
本帖最后由 soleilzx 于 2018-7-28 23:40 编辑
microyip 发表于 2018-7-28 07:53
其他暂时没看出什么问题,但有一个地方可能需要考虑一下调整

谢谢 microyip 的回复,依您的提示我分别在 24,27 和 29 行添加了退出语句,如下代码段:
但是在代码的封装过程中,仍然被卡在 第41行 的对数据源的链接语句上,并且提示 “未找到提供程序”,如下图
所以我想继续追问,我的代码是在哪里出了问题,能否烦您继续指点迷津?

C:\Users\soleil\Desktop\Appendre\04 Excel\04 Encapsulation VBA\捕获.PNG
  1. Sub Main()
  2.    
  3.     Dim sPath As String
  4.     Dim ExcelApp As Excel.Application ' 定义ExcelApp 为 Excel对象
  5.     Dim bCreatApp As Boolean
  6.     Dim wWB As Workbook
  7.         
  8.     sPath = App.Path & "" ' 获得当前Exe文件所在文件夹
  9.     On Error Resume Next
  10.     Set ExcelApp = GetObject(, "Excel.Application") ' 获取已经打开的 Excel 程序
  11.     bCreatApp = ExcelApp Is Nothing
  12.     On Error GoTo 0
  13.     If bCreatApp Then ' ========================================= 如果 Excel 程序未打开
  14.         Set ExcelApp = CreateObject("Excel.Application") ' ====== 则打开 Excel 程序
  15.         ExcelApp.Visible = True ' =============================== 显示 Excel 程序
  16.         With ExcelApp
  17.             Set wWB = .Workbooks.Open(sPath & "TEST-Encapsulation V1.xlsm") ' ======= 打开目标 Excel 文件
  18.         End With
  19.     Else
  20.         With ExcelApp
  21.             For Each wkb In .Workbooks
  22.                 If wkb.Name = "TEST-Encapsulation V1.xlsm" Then ' =========== 找到目标文件
  23.                     Set wWB = .Workbooks("TEST-Encapsulation V1.xlsm") ' ==== 把目标文件赋给 wWB
  24.                     GoTo jump:
  25.                 End If
  26.             Next
  27.             Exit Sub
  28.         End With
  29. jump:
  30.     End If
  31.    
  32.     ' ====================== 以下代码开始计算聚合表 =========================
  33.     With wWB
  34.         Set sdb = CreateObject("adodb.connection")
  35.    
  36.         cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" _
  37.                 & .FullName ' ====================== SQL 链接语句
  38.    
  39.         qry = "transform count(*) select `Dept` from [TestDB$] group by `Dept` pivot `OS Class`"
  40.    
  41.         sdb.Open cnn ' ============================= 链接数据源表
  42.         Set sta = sdb.Execute(qry) ' =============== 执行数据SQL语句
  43.         
  44.         With .Worksheets("Statistic") ' ============ 在统计工作表中,显示SQL语句执行结果
  45.             For i = 0 To sta.Fields.Count - 1
  46.                 .Cells(1, i + 1) = sta.Fields(i).Name
  47.             Next i
  48.    
  49.             .Cells(2, 1).CopyFromRecordset sta
  50.         End With
  51.    
  52.         sdb.Close
  53.         Set sdb = Nothing
  54.     End With
  55. End Sub
复制代码
捕获.jpg
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-11 04:06 , Processed in 0.025799 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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