Office中国论坛/Access中国论坛

标题: Access导入多个表格遇到的问题 [打印本页]

作者: access_beginner    时间: 2012-12-11 10:36
标题: Access导入多个表格遇到的问题
我写的一个小工具,在导入多个表格的时候碰到问题了,导入的时候貌似程序找不到表名。只会导入sheet1的内容。主要代码如下:

xlBook.SaveAs FileName:=Application.CurrentProject.Path & "\positions_tmp.xls", FileFormat:=xlNormal, _
            ReadOnlyRecommended:=False, CreateBackup:=False
xlBook.Worksheets.Add
xlBook.Worksheets.Add
tmpFile = Application.CurrentProject.Path & "\positions_tmp.xls"
DoCmd.TransferSpreadsheet acImport, , "table1", tmpFile, True, sheet1
DoCmd.TransferSpreadsheet acImport, , "table2", tmpFile, True, sheet2
DoCmd.TransferSpreadsheet acImport, , "table3", tmpFile, True, sheet3
(以上sheet1这种用具体的赋给的表名代替也不行)

或者用下面这种方法也有问题,它导入了三个文件,生成的三张表表名分别为sheet1, sheet2, sheet3. 但是三张表其实导入的内容都是同一个sheet的。

xl.Visible = True
xl.Workbooks.Open "C:\Documents and Settings\e531825\Desktop\positions_tmp.xls"
With xl
    With .Workbooks(.Workbooks.Count)
        For i = 1 To .Worksheets.Count
            WrksheetName = .Worksheets(i).Name
            DoCmd.TransferSpreadsheet (acImport), acSpreadsheetTypeExcel97, WrksheetName, "C:\Documents and Settings\e531825\Desktop\positions_tmp.xls"
        Next i
    End With
End With
Set xl = Nothing
作者: todaynew    时间: 2012-12-11 11:53
本帖最后由 todaynew 于 2012-12-11 16:49 编辑

第三个参数为数据表名称吧?

试试这样搞法:

function 导入E(filename as string,tbname as string,sheetcnt as long)
    '参数:filename--Excel文件(带路径)
    '      tbname--数据表名
    '      sheetcnt--标签总数(标签名为Sheet开头)
    dim ssql as string
    dim i as long
    for i=1 to sheetcnt
          ssql="insert into " & tbname & " select * from [Excel 8.0;DATABASE=" & filename & "].[Sheet" & i &  "$]"
          CurrentDb.Execute ssql
    next
end function
作者: access_beginner    时间: 2012-12-11 16:04
todaynew 发表于 2012-12-11 11:53
第三个参数为数据表名称吧?

试试这样搞法:

不行啊版主。它貌似就是认不了这个excel的sheet名称。那个excel文件是这样来的:
1. 用户通过窗口选择一个文件
2. 将文件另存为一个excle,取名为 tmp_position.xls
3. 在这个tmp文件中加入另外两个sheet, 于是现在有了sheet1, sheet2, sheet3.
4. 需要导入3个sheet的数据。

不知道上面的步骤会不会导致这个错误啊
作者: todaynew    时间: 2012-12-11 16:25
本帖最后由 todaynew 于 2012-12-11 16:48 编辑
access_beginner 发表于 2012-12-11 16:04
不行啊版主。它貌似就是认不了这个excel的sheet名称。那个excel文件是这样来的:
1. 用户通过窗口选择一 ...

[attach]50902[/attach]

[attach]50903[/attach][attach]50903[/attach]


作者: todaynew    时间: 2012-12-11 17:09
本帖最后由 todaynew 于 2012-12-11 17:12 编辑

这样也可以:
   Dim i As Long
    Dim R As String
    For i = 1 To 3
        R = "Sheet" & i & "$"
        DoCmd.TransferSpreadsheet acImport, , "表1", Me.Application.CurrentProject.Path & "\表.xls", True, R
    Next
    Me.List0.Requery

注意核心语句写法:
DoCmd.TransferSpreadsheet acImport, , "table2", tmpFile, True, "sheet2$"
作者: access_beginner    时间: 2012-12-11 17:13
todaynew 发表于 2012-12-11 17:09
这样也可以:
   Dim i As Long
    Dim R As String

版主,我发现问题就是在于sheet1, sheet2. sheet3这里。
其实上面的方法可以,但是无论是哪个sheet, 执行语句的时候都只是把sheet(1) - 在工作簿里面的名字是sheet3 - 把这个表的数据导了三遍。不知道为什么会出这个问题。
作者: todaynew    时间: 2012-12-11 17:37
本帖最后由 todaynew 于 2012-12-11 17:44 编辑
access_beginner 发表于 2012-12-11 17:13
版主,我发现问题就是在于sheet1, sheet2. sheet3这里。
其实上面的方法可以,但是无论是哪个sheet, 执行 ...

呵呵,榆木脑袋!{:soso_e120:}5楼的答复不是告诉你了吗?
TransferSpreadsheet方法的第5个参数为导入范围,该参数为一个字符串。如果是整个sheet导入的话,可以将该参数写为页的名称,并在其后加一个$符号。比如"sheet2$"、"1月份表$"诸如此类均可。所以你的代码可修改为:
     Dim i As Long
     Dim R As String
     Dim tbname as string
     For i = 1 To 3
         R = "Sheet" & i & "$"
         tbname="table" & i
         DoCmd.TransferSpreadsheet acImport, , tbname, CurrentProject.Path & "\positions_tmp.xls", True, R
     Next

明白了吗?
作者: access_beginner    时间: 2012-12-12 10:42
todaynew 发表于 2012-12-11 17:37
呵呵,榆木脑袋!5楼的答复不是告诉你了吗?
TransferSpreadsheet方法的第5个参数为导入范 ...

成功了呃!之前木有仔细看5楼的吗,哈哈怎么漏过了。
就是因为"$"的关系。之前我自己 用过"!"说是无效的名称。。
原来应该是加双引号,然后在引号里面加"$"。
多谢版主!
作者: access_beginner    时间: 2012-12-17 14:57
todaynew 发表于 2012-12-11 17:37
呵呵,榆木脑袋!5楼的答复不是告诉你了吗?
TransferSpreadsheet方法的第5个参数为导入范 ...

版主,版主在吗?
我又遇到一个问题啊。用上面的方法有时候会报错误呃。
DoCmd.TransferSpreadsheet acImport, , "table", myFile, True, "Sheet3$"
错误内容为:
'Sheet3$' is not a valid name. Make sure that it does not include invalid characters or punctuation and that it is not too long.
而且经过研究表明,错误发生时都是在已经有excel文件打开的时候。如果有任何一个excel文件打开,那么跑这句话去导入code里面规定的文件就会报错。有什么办法可以解决的呢?
感谢版主指教!
作者: access_beginner    时间: 2012-12-17 15:13
todaynew 发表于 2012-12-11 17:37
呵呵,榆木脑袋!5楼的答复不是告诉你了吗?
TransferSpreadsheet方法的第5个参数为导入范 ...

好吧版主,已经解决了呃。写代码真的需要灵感啊。
我发现是因为在修改了myfile之后把myfile关掉,然后再用语句导入就没有这个问题了。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3