VBA把excel备份至SQL或者实现数据交换 提示下标越界 重金悬赏大神解决

达到理想要求追加50—100分
求大神解决,能修改的就帮忙修改下
最好大神能为在下编写一个
最好能实现EXCEL表与SQL数据库实现数据同步 随便那一边的数据更改另一边的数据页跟随改动 加则加 少则少 变则变
如果不行 能实现自动把数据备份至SQL就行 就是 加则加
表名称:汇总记录页
SQL: 192.168.1.20
数据库:master
账号: sa
密码: tiger

下面是在下网上搜来的,提示“下标越界”

Sub 导入数据()
Dim i As Integer, j As Integer, sht As Worksheet 'i,j为整数变量;sht 为excel工作表对象变量,指向某一工作表
Dim cn As New ADODB.Connection '定义数据链接对象 ,保存连接数据库信息;请先添加ADO引用
Dim rs As New ADODB.Recordset '定义记录集对象,保存数据表
Dim strCn As String, strSQL As String '字符串变量
strCn = "Provider=sqloledb;Server=192.168.1.20;Database=master;Uid=sa;Pwd=tiger;" '定义数据库链接字符串
rs.CursorLocation = 3

strSQL = "select * from 汇总记录页$" '表名
cn.Open strCn '与数据库建立连接,如果成功,返回连接对象cn
rs.Open strSQL, cn, 1, 3 '执行strSQL所含的SQL命令,结果保存在rs记录集对象中
'i = 1
Set sht = ThisWorkbook.Worksheets("插入") '把sht指向当前工作簿的sheet1工作表
For i = 2 To Sheets("插入").[a65535].End(xlUp).Row 'i为"行数"的意思
rs.AddNew
For j = 0 To rs.Fields.Count - 1 'j为'列数'
rs(j) = Sheets("插入").Cells(i, j + 1)
Next j
rs.Update
Next i
rs.MoveLast
rs.Close '
MsgBox "导入完毕!"
End Sub
快点来大神帮我解答

根据您的数据表的格式及数据库管理的性能,您要想实现多处随意动态更新,我觉得是有难度的!
1、你的表格首先没有标定的唯一行(也就是数据库表中的键值),因此不管是哪个操作者任意更新一行或增加(删除)一行(或修改一行中某元的内容)形成新的数据表格后,在数据库中是很难界定的(这一点不知道您是否理解!)。如果没有唯一(键值)来约束的话,只能按顺序的方式来从数据库中下载内容到Excel或者将现在的Excel数据更新到数据库中。也就是说:Excel文件的当前操作者最好是一个,因为多个操作者不能实现数据同步的,数据库只能保留最后的更新者的数据。除非你把Excel表中的某一列标示为整个表格中的唯一一行(也就是数据库表中键值)

2、根据以上分析的结果,只好在 Excel 中使用两项功能,“下载”和“上传”
“下载”就是每次在操作之前,先把数据库中的内容更新到 Excel文件的Sheet 中。
如:
Dim i As Integer
Dim n As Integer

Dim mySheet As Worksheet

Dim conStr As String
Dim mySQL As String

Dim conn As New ADODB.Connection
Dim sn As New ADODB.Recordset

Set meSheet = Sheet2 '用一个新的Sheet表单

conStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa; Password=xxx; Data Source =电脑名(或IP地址);Initial Catalog=数据库名;"

conn.Open conStr

mySQL = "SELECT * FROM 表名称"
sn.Open mySQL, conn, adOpenStatic, adLockReadOnly
‘可以把字段名称做为 Excel表的第一行,也可以不要下面的循环
If Not sn.BOF And Not sn.EOF Then
For i = 0 To sn.Fields.Count - 1
meSheet.Cells(1, i + 1) = sn.Fields(i).Name
Next i
End If
'从第二行开始写数据
n = 2
Do While Not sn.EOF
For i = 0 To sn.Fields.Count - 1
meSheet.Cells(n, i + 1) = sn(i)
Next i

n = n + 1
sn.MoveNext
Loop
'数据已经从数据库下载到当前的Sheet完成

当你把数据修改完后可以把整个数据表更新到数据库,实现"上传"功能
如:
Dim i As Long
Dim meSheet As Worksheet
Dim conStr As String
Dim mySQL As String

Dim conn As New ADODB.Connection
Dim sn As New ADODB.Recordset

Set meSheet = Sheet2

conStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa; Password=xxx; Data Source =电脑名(或IP地址);Initial Catalog=数据库名;"
conn.Open conStr
'需要将原来数据库中的数据删除掉
conn.Execute "DELETE FROM 表名"
mySQL = "SELECT * FROM 表名"
sn.Open mySQL, conn, adOpenDynamic, adLockOptimistic
'循环增加数据(也可以用SQL语句(INSERT INTO)逐行增加)
For i = 2 To 65535(最大行数,不一定到65535,因为后面也许是空值)
sn.AddNew
sn(0) = meSheet.Cells(i, 1)
sn(1) = meSheet.Cells(i, 2)
...多少根据列数来定
sn(7) = meSheet.Cells(i, 7)
sn.Update
Next i

更新完成.追问

第一行 车间 姓名这行是固定的 需要列的话 我可以在其后 或其前添加一行

追答

您说的行,实际上在数据库中是一条记录而已,一般Excel中的标题名称在数据库中是按字段名称处理的.所以我给你的程序:
‘可以把字段名称做为 Excel表的第一行,也可以不要下面的循环
If Not sn.BOF And Not sn.EOF Then
For i = 0 To sn.Fields.Count - 1
meSheet.Cells(1, i + 1) = sn.Fields(i).Name
Next i
End If
就是把字段名变成Excel 中的列名.

如果要保证每个操作者的操作与数据库实现同步,那就在每行数据中增加一个唯一的标示符号!如记录的顺序号.如:
序号 车间 姓名 ......
1 一 张三
2 二 李四
3 三 王五

...

在 Excel 中必须有约定,一但有操作者增加一行新数据(不管在最后还是在中间插入),系统要产生一个新的"序号",这个值是唯一的,且当删除一行后这个"序号"也就消失了,不可重复使用!

追问

我这么改了 然后我应该怎么做?

追答

按照上面说的思路,把程序写成宏命令执行就OK 了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-30
我可以帮您做成VB程序,按VB程序再转换为VBA应该不是困难的问题,如果需要请百度HI吧!追问

亲 求帮助

追答

已经做了一部分,你的联系方式?

追问

扣扣 578491863 996688366

追答

做好后发给你,请稍等。

追问

嗯嗯嗯

追答

已经加你,验证:实现数据交换

追问

亲 你怎么还没发给我

追答

最近有其他事,没顾上,现在已经做好了,如果需要请回复。

第2个回答  2013-11-14
For i = 2 To Sheets("插入").[a65535].End(xlUp).Row 'i为"行数"的意思

把这个.[a65535].数字改小一点,改成.[a100].试试
第3个回答  2013-10-30
根据您的数据表的格式及数据库管理的性能,您要想实现多处随意动态更新,我觉得是有难度的!
1、你的表格首先没有标定的唯一行(也就是数据库表中的键值追问

可以添加一行 只要可以 并附上程序

第4个回答  2013-10-23
你检查下sql表的大小和列数,估计要减一才对