ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

希望用SQL复制解决工作上的问题,您能帮我吗?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-3-1 22:02 | 显示全部楼层 |阅读模式

大家好!又有问题麻烦了.

我有一个数据表,里面有30个左右的SHEET,存放着数据.每天把该表的数据更新到我的费用表中很费工夫,希望能用SQL依次更新.数据表中经常会有新的SHEET出现,要是在更新时发现新的SHEET就自动在费用表中先创建同名SHEET再将数据添入就最好了.

我在northwolves斑竹的http://club.excelhome.net/viewthread.php?tid=176754&replyID=&skin=0找到了如何从数据表中取得SHEET名和数量的方法,希望将其存入变量,用循环的办法依次对比费用表中的SHEET名,如存在就拷贝数据,如不存在就创建该SHEET,然后拷贝数据.但我的变量SQL总提示有误,能帮帮我吗?先谢谢了!

附件中testaql就相当于费用表.盼着您的回复!

DSDYh9WR.rar (77.02 KB, 下载次数: 2)


麻烦各位好心的高手能否把这几个要求统一起来做,因为我越来越发现自己不会把别人的好方法综合到一起,也算给小弟一个思路吧,再次感谢!

[此贴子已经被作者于2007-3-1 22:07:27编辑过]

TA的精华主题

TA的得分主题

发表于 2007-3-1 22:51 | 显示全部楼层

gXPoAMyy.rar (20.76 KB, 下载次数: 18)


这是爱歌版主的一个多表查询实例,供参考

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-1 23:04 | 显示全部楼层
QUOTE:
以下是引用向您问好在2007-3-1 22:51:00的发言:


这是爱歌版主的一个多表查询实例,供参考

谢谢向您问好!这个例子很好,我会仔细研究.

但我的意思是这样:

如果我的TESTSQL中有A,B两个SHEET,数据表中有A,B,C            3个SHEET,

那么运行宏后TESTSQL中有A,B两个SHEET自动更新为数据表A,B的值;自动创建C,然后更新为数据表C的值

依次类推,就是一个SHEET对SHEET的复制过程,并且能使两表中的SHEET数量,SHEET名称,内容都保持同步.

也许你会说那还不如直接复制工作表呢?!但我计算费用时TESTSQL.XLS的AD列后面是对应的费用啊,所以只能更新每个SHEET AD列前面的部分,请再辛苦一下!

[em04]

TA的精华主题

TA的得分主题

发表于 2007-3-1 23:14 | 显示全部楼层

本来以为你是把所有的表都复制到同一个工作表上,都写好了.

现在你就你的表,说明一下你要怎么复制吧.问题描述清楚一点.

根据你上面的描述,我觉得还不如直接整个复制工作簿,把后面的费用往里填. 这样不是来得更简单一点.

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-1 23:35 | 显示全部楼层
QUOTE:
以下是引用EdgeOfCity在2007-3-1 23:14:03的发言:

本来以为你是把所有的表都复制到同一个工作表上,都写好了.

现在你就你的表,说明一下你要怎么复制吧.问题描述清楚一点.

根据你上面的描述,我觉得还不如直接整个复制工作簿,把后面的费用往里填. 这样不是来得更简单一点.

好的!我试着说得更清楚点:

我的testsql.xls里的SHEET应该与数据.xls里的完全一致,因为数据.xls是我的同事每天报给客户的,格式是固定的,而且每来一种新的产品就会增加一个SHEET,SHEET的标签就是产品的名字.我要想每天手工更新每个SHEET并查看是否有新增的SHEET实在是太痛苦了.因为觉得SQL功能强大而且速度也快,就想用它自动更新每个SHEET中A:AC的数据,并且在         数据.xls增加新产品时我的testsql.xls也会自动生成相应的SHEET并拷贝其中的数据.这就是我的问题.

之所以我不采用直接整个复制工作簿,再把后面的费用往里填的办法,是因为后面的费用计算相当烦琐,只拷贝前面的数据部分更容易实现.请EdgeOfCity兄大力帮助,不吝赐教!

TA的精华主题

TA的得分主题

发表于 2007-3-2 00:38 | 显示全部楼层

感觉你有些东西还是没有完全说清楚.

先把我刚才做的传上来,你参考一下. 如果可以的话自己改一下.

附件里面是把数据的所有表放到一个工作表了.你根据需要修改一下(代码中有一句加了提示,改那个地方)

.如有问题再提出来.

3YqNlLcM.rar (80.71 KB, 下载次数: 2)


Option Explicit

Sub QueryData()
Dim conn As Object
Dim sql As String
Dim path As String
Dim catADOX As New ADOX.Catalog
Dim i As Integer
Dim arrShtNames() As String '存取工作表名的数组
Dim arrRows() As Long  '存取每个表标题行数
Dim intSheets As Integer '工作表数量
Dim lngLastRow As Long '当前数据行数
Dim rngCopy As Range
Application.ScreenUpdating = False
path = ThisWorkbook.path
catADOX.ActiveConnection = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & path & "\数据.xls"
intSheets = catADOX.Tables.Count
ReDim arrShtNames(intSheets)
For i = 1 To intSheets
        arrShtNames(i) = Replace(catADOX.Tables(i - 1).Name, "'", "") '取表名,并去掉单引号,以利于查询语句处理
Next i
Set catADOX = Nothing
'path = "F:\Documents and Settings\stephen\桌面\"
path = ThisWorkbook.path
Set conn = CreateObject("adodb.connection")
conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1;';data source=" & path & "\数据.xls"
lngLastRow = 1
'Sheet1.UsedRange.Clear '每次执行查询前,清除原先的数据
For i = 1 To intSheets
    sql = "select * from [" & arrShtNames(i) & "e:x]"
    Set rngCopy = Sheet1.Cells(lngLastRow, 1) '这句根据需要修改:如修改为不同的表名
    rngCopy.CopyFromRecordset conn.Execute(sql)
    lngLastRow = rngCopy.Parent.Range("a65536").End(xlUp).Row + 1
'    Stop
Next i

conn.Close: Set conn = Nothing
Application.ScreenUpdating = True
End Sub

[此贴子已经被作者于2007-3-2 0:41:08编辑过]

TA的精华主题

TA的得分主题

发表于 2007-3-2 00:49 | 显示全部楼层

两个表的结构一样,就改成这样.(你的testsql工作簿里面没有相应的表,也说法没测试了).

Sub QueryData()
Dim conn As Object
Dim sql As String
Dim path As String
Dim catADOX As New ADOX.Catalog
Dim i As Integer
Dim arrShtNames() As String '存取工作表名的数组
Dim arrRows() As Long  '存取每个表标题行数
Dim intSheets As Integer '工作表数量
Dim lngLastRow As Long '当前数据行数
Dim rngCopy As Range
Application.ScreenUpdating = False
path = ThisWorkbook.path
catADOX.ActiveConnection = "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & path & "\数据.xls"
intSheets = catADOX.Tables.Count
ReDim arrShtNames(intSheets)
For i = 1 To intSheets
        arrShtNames(i) = Replace(catADOX.Tables(i - 1).Name, "'", "") '取表名,并去掉单引号,以利于查询语句处理
Next i
Set catADOX = Nothing
'path = "F:\Documents and Settings\stephen\桌面\"
path = ThisWorkbook.path
Set conn = CreateObject("adodb.connection")
conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1;';data source=" & path & "\数据.xls"
lngLastRow = 1
'Sheet1.UsedRange.Clear '每次执行查询前,清除原先的数据
For i = 1 To intSheets
    sql = "select * from [" & arrShtNames(i) & "e:x]"
    Set rngCopy = Worksheets(arrShtNames(i)).Range("a1") '修改了这里
    rngCopy.CopyFromRecordset conn.Execute(sql)
Next i
conn.Close: Set conn = Nothing
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2007-3-2 08:24 | 显示全部楼层

1AQTdOnd.rar (90.79 KB, 下载次数: 7)

俺对这个东东很菜,学着修改了一下你的附件

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-2 11:52 | 显示全部楼层

谢谢楼上几位深夜还在帮助我,辛苦了!

我一打开你们的附件就提示“找不到工程或库”

打开引用发现“丢失:Microsoft ADO Ext. for DDL and Security.”

可是关上附件打开我自己的文件就没问题,这怎么回事?

TA的精华主题

TA的得分主题

发表于 2007-3-2 13:08 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-10-4 02:27 , Processed in 0.043238 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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