Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

再请教部分导入excel表

风语  发表于:2011-04-12 22:05:40  
复制

我的access表有10个字段,excel表有20个字段其中10个和access名称相同一一对应)如果我只想把excel表中的10个字段导入,sql代码应该怎么写最精炼?

access 表1 共有字段4~字段13 10字段

excel  表1 共有字段1~字段20   20个字段

要把excel表1的字段4~字段10导入到excel中,我代码为

insert into 表1 Select [字段4], [字段5],[字段6],[字段7],[字段8],[字段9],[字段10] from [Excel 8.0;DATABASE=E:\桌面\表1.xls].[Sheet1$]

则执行时报错

但代码改为以下时可以成功导入

insert into 表名 ( [字段4], [字段5],[字段6],[字段7],[字段8],[字段9],[字段10] ) Select  [字段4], [字段5],[字段6],[字段7],[字段8],[字段9],[字段10]  from [Excel 8.0;DATABASE=E:\桌面\表1.xls].[Sheet1$]

这样很麻烦,而且字段要录入2次,而且,由于要导入的字段多时会报错,提示大意是引入长度超限,要求减少字段数量。请问该如何解决?

各位走过路过,麻烦指点一下,谢谢。

 

Top
煮江品茶 发表于:2011-04-13 14:16:26

dim ssql as string

dim strfld as string

dim i as long

strfld=""

for i=4 to 13

   strfld=strfld & "字段" & i & ","

next

strfld=left(strfld,len(strfld)-1)

ssql="insert into tbname ( " & strfld & " ) "

ssql=ssql & "select " & srefld

ssql=ssql & " from [Excel 8.0;DATABASE=E:\桌面\表1.xls].[Sheet1$]"

docmd.runsql ssql

 



风语 发表于:2011-04-13 22:56:08

嗯这种方法可行,对于字段名称有规律的很精悍,已经过验证,修改了一个错别字并插入几个必要的空格后代码如下;

(但我还是不理解为什么在ACCESS数据表仅有字段4~字段13这几个字段的情况下也需要把字段名称一一列举,excel表的字段是比ACCESS多的。)

 

dim ssql as string

dim strfld as string

dim i as long

strfld=""

for i=4 to 13

   strfld=strfld & "字段" & i & ","

next

strfld=left(strfld,len(strfld)-1)

ssql="insert into tbname ( " & strfld & " ) "

ssql=ssql & "select " & srefld

ssql=ssql & " from [Excel 8.0;DATABASE=c;\表1.xls].[Sheet1$]"

docmd.runsql ssql

 

我实际工作中的ACCESS表及EXCEL表字段名都是没规律的,ACCESS表的字段数有十几个,是EXCEL表字段的一部分,而且要定期更新很多张表,一一列举字段名比较麻烦,能否引入时查询语句或函数获取字段名以便简化?

-------------------------------------

 

本站中搜索到有个案例可以取得数据表的全部字段名,如果能结合的话可能就更简洁些,但我不知道怎么正确使用,我把这个模块引入后在上面案例的过程中直接 插入strfld=uf_GetfldName(表1)想获取字段名试验是不行的。

 

Public Function uf_GetfldName(strSourceTable As String) As String
Dim rst As DAO.Recordset
Dim fldName As String

Set rst = CurrentDb.OpenRecordset(strSourceTable)

Dim i As Integer
For i = 0 To rst.Fields.Count - 1
fldName = fldName & rst.Fields(i).Name & ";"
Next
uf_GetfldName = Left(fldName, Len(fldName) - 1)
End Function


 



煮江品茶 发表于:2011-04-14 10:03:22

这不是一回事嘛

 

Public Function 导入E(strSourceTable As String)
Dim rst As DAO.Recordset
Dim fldName As String
dim ssql as string

Dim i As Integer

Set rst = CurrentDb.OpenRecordset(strSourceTable)

For i = 0 To rst.Fields.Count - 1
     fldName = fldName & rst.Fields(i).Name & ";"
Next
fldName = Left(fldName, Len(fldName) - 1)


ssql="insert into tbname ( " & fldName & " ) "
ssql=ssql & "select " & fldName
ssql=ssql & " from [Excel 8.0;DATABASE=c;\表1.xls].[Sheet1$]"

docmd.runsql ssql


End Function



煮江品茶 发表于:2011-04-14 10:17:13

这个问题可看成顺序执行的三个步骤:第一步得到字段名列表字符串,第二步得到sql字符串,第三步执行sql语句。第二步和第三步基本可以不变化,第一步根据情形不同可采取不同方法得到:

第一种情形:导入的字段数量不多,则解决方法为枚举之;

第二种情形:字段名符合整数递增规律,则用整数循环得到字段名列表字符串;

第三种情形:目的表字段少于等于源表字符串,则用ADO或者DAO的fileds遍历字段name属性得到字段名列表字符串。



风语 发表于:2011-04-14 13:25:19

非常感谢煮版的热心帮助,我立马去验证一下。



总记录:5篇  页次:1/1 9 1 :