ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [42期]ado 添加不重复姓名

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-12-1 05:18 | 显示全部楼层 |阅读模式
此工作簿目录下有 a.mdb、a.xls 和 数据源.xls 三个文件
其中都有名为通讯录的表,请将数据源中的人名分别追加到 a.mdb、a.xls
如果a.mdb、a.xls中有与数据源中相同的姓名,则保持原样
只添加没有姓名的记录?

此工作簿只运行程序,没有数据,也不得作为数据的暂存处
运行两次的结果要求与参考结果文件夹中的一致
分别写两句sql语句执行
结果正确得2分
代码结构已写好,只需在代码中的答题区填写"????" 部分
由于字符串较长,可以分行填写

仅需发送 EXCEL文件?
EXCEL文件请以用户ID+"_42VBA"保存 例如 LDY_42VBA
答案请压缩后发送到 26258103@163.com?并跟贴占位,请勿在跟贴中直接发答案
邮件主题 格式为 42VBA答案_用户ID 例如 42VBA答案_LDY
因每天收到邮件过多,请严格按要求发送邮件。谢谢合作
试题下载
漏了一个文件,现已更新


补充说明:答题区中只允许填写字符串组织语句,象 Dim 、Set、New  CreateObject 、GetObject 等关键字是不能使用的。

[ 本帖最后由 ldy 于 2008-12-1 20:35 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-1 19:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不熟悉sql语句,按要求做不出来,放弃!!
(本想声明一个数组,将数据源.xls的记录集装入数组,再循环比对...。呵呵,不让用dim,偶就弄不出来了)

谢谢提醒,已经更新了,只能使用sql(或叫ado)语句答题 --ldy

[ 本帖最后由 HHAAMM 于 2008-12-13 21:55 编辑 ]

TA的精华主题

TA的得分主题

发表于 2008-12-3 01:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

已发送

邮件已发送



收到--ldy



excelToexcel = " insert into  [" & ThisWorkbook.Path & "\a.xls].[通讯录$] SELECT  姓名,  电话 from  [" & ThisWorkbook.Path & "\数据源.xls].[通讯录$]  aa where  aa.姓名 not in (select  姓名 from  [" & ThisWorkbook.Path & "\a.xls].[通讯录$])"
excelToacc = "insert into    通讯录  in '" & ThisWorkbook.Path & "\a.mdb'   SELECT  姓名,  电话 from [" & ThisWorkbook.Path & "\数据源.xls].[通讯录$] aa where  aa.姓名 not in (select  姓名 from 通讯录  in '" & ThisWorkbook.Path & "\a.mdb' )   "


正确 +2

[ 本帖最后由 ldy 于 2008-12-31 21:02 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-3 04:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
邮件已发送,跟帖占位。
不知道在中文excel下,能用不。

regards

收到,中文下能用 --ldy

    excelToacc = "INSERT INTO [;DATABASE=" & ThisWorkbook.Path & "\a.mdb].通讯录 " & _
                 "SELECT * FROM [" & ThisWorkbook.Path & "\数据源.xls].[通讯录$] " & _
                 "WHERE 姓名 NOT IN (SELECT 姓名 FROM [;DATABASE=" & ThisWorkbook.Path & _
                 "\a.mdb].通讯录)"
    excelToexcel = "INSERT INTO [" & ThisWorkbook.Path & "\a.xls].[通讯录$] " & _
                   "SELECT * FROM [" & ThisWorkbook.Path & "\数据源.xls].[通讯录$] " & _
                   "WHERE 姓名 NOT IN (SELECT 姓名 FROM [" & ThisWorkbook.Path & _
                   "\a.xls].[通讯录$])"


正确 +2

[ 本帖最后由 ldy 于 2008-12-31 21:00 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-4 15:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
邮件已发送,Excel2007下运行通过,03不知能否用.


收到,2003下能用 --ldy

excelToexcel = "insert into [excel 8.0;database=" & ThisWorkbook.Path & "\a.xls].[通讯录$] select * from [excel 8.0;database=" & ThisWorkbook.Path & "\数据源.xls].[通讯录$] where 姓名 not in(select 姓名 from [excel 8.0;database=" & ThisWorkbook.Path & "\a.xls].[通讯录$])"
excelToacc = "insert into [;database=" & ThisWorkbook.Path & "\a.mdb].[通讯录] select * from [excel 8.0;database=" & ThisWorkbook.Path & "\数据源.xls].[通讯录$] where 姓名 not in(select 姓名 from [;database=" & ThisWorkbook.Path & "\a.mdb].[通讯录])"


答案正确 +2

[ 本帖最后由 ldy 于 2008-12-31 20:58 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-10 01:02 | 显示全部楼层
发现原答案不够完善,已重发,


收到--ldy

[ 本帖最后由 ldy 于 2008-12-14 08:31 编辑 ]

TA的精华主题

TA的得分主题

发表于 2008-12-13 23:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 1楼 ldy 的帖子

已发送
邮件已发送

收到--ldy

    excelToexcel = "INSERT INTO [Excel 8.0;Database=" & ThisWorkbook.Path & "\a.xls" & "].[通讯录$] (姓名,电话)" _
                 & " SELECT 姓名,电话 FROM [Excel 8.0;Database=" & ThisWorkbook.Path & "\数据源.xls" & "].[通讯录$] as b" _
                 & " where b.姓名 not in (SELECT 姓名 FROM [Excel 8.0;Database=" & ThisWorkbook.Path & "\a.xls" & "].[通讯录$]) " '
     
     excelToacc = "INSERT INTO [;Database=" & ThisWorkbook.Path & "\a.mdb" & "].[通讯录] (姓名,电话)" _
                 & " SELECT 姓名,电话 FROM [Excel 8.0;Database=" & ThisWorkbook.Path & "\数据源.xls" & "].[通讯录$] as b" _
                 & " where b.姓名 not in (SELECT 姓名 FROM [;Database=" & ThisWorkbook.Path & "\a.mdb" & "].[通讯录]) "


正确 +2

[ 本帖最后由 ldy 于 2008-12-31 21:06 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-12-31 22:46 | 显示全部楼层

小结 及参考答案


  1. Tb1 = "[MS Access;pwd=;DATABASE=" & ThisWorkbook.Path & "\a.mdb" & "].通讯录 "
  2. Tb2 = "[Excel 5.0;hdr=yes;DATABASE=" & ThisWorkbook.Path & "\数据源.xls" & "].[通讯录$] "
  3. exceltoacc = " select a.姓名,a.电话 from " & Tb2 & " as a left outer join " & Tb1 & " as b on a.姓名= b.姓名 where b.姓名 is null"
  4. exceltoacc = "INSERT INTO " & Tb1 & exceltoacc

  5. Tb1 = "[Excel 5.0;hdr=yes;DATABASE=" & ThisWorkbook.Path & "\a.xls" & "].[通讯录$] "
  6. exceltoexcel = " select a.姓名,a.电话 from " & Tb2 & " as a left outer join " & Tb1 & " as b on a.姓名= b.姓名 where b.姓名 is null"
  7. exceltoexcel = "INSERT INTO " & Tb1 & exceltoexcel
复制代码


为了看得清楚些,我把语句拆开了。Tb1 和 Tb2 分别是 access表 和 excel表的 字符串表达式

此题的考点是JET引擎中对其他类型数据库引用的表达式。

主要语句结构各位参与者的答案 都一致。大家可能对我的答案有些疑问,我的语句长度要长很多,并且使用了联合语句。

这是因为 sql语句执行 where not  in(.....................) 子句判断时 效率极低,当数据量达到一定数量时(2000个姓名),不管是写代码的还是用代码的都不能接受

这一点在 [第36期]万里挑一  已经说明,我曾遇到此类问题,所以只要有where not  in 判断的地方都用联合语句+where is null 代替。


不过这不是本期的考点,对代码速度也没有要求,只要结果正确都得分。


附1:文本文件在 JET引擎中表达式 范例


Tbtext = " [Text;DATABASE=c:\文本数据库].通讯录.txt "  '通讯录.txt是以 “,” 分隔的与csv 文件相同






因为数据库服务器不是每个坛友都有机会接触到,所以此题中没有导入到sql2000的任务


附2:sql2000服务器在 JET引擎中表达式 范例


Tbsql2000="  通讯录 in  [ODBC][ODBC;Driver=SQL Server;Server=192.168.0.188;Uid=sa;Pwd=123456;database=企业数据库] "


应用例子

rc.open "select *  from " & Tbsql2000 , cn, 1,3 ' 注cn 是EXCEL 或 acc、TEXT 等非服务器 数据库的连接


常用的4个类型的数据库字符表达式都介绍到了,以后遇到不同类型的数据库导来导去的问题,就不用满头冒烟了


祝各位坛友新年快乐,学有所成,升官发财,马到成功, 还有一万多个好词....... 略.....自己想去,想到了就是自己的,
呵呵 这叫心想事成!!!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-1-1 09:18 | 显示全部楼层

回复 8楼 ldy 的帖子

sql语句执行 where not  in(.....................) 子句判断时 效率极低,当数据量达到一定数量时(2000个姓名),不管是写代码的还是用代码的都不能接受................所以只要有where not  in 判断的地方都用联合语句+where is null 代替。


第一次听说,谢谢 ldy 版主的总结.

TA的精华主题

TA的得分主题

发表于 2009-3-8 09:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
赶紧做个记号,好好学习!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 18:38 , Processed in 0.047221 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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