MS Access VBA acImport工作表名称,包含空格和范围

问题描述 投票:2回答:6

我正在使用名为“Go”的按钮构建一个表单,以从excel文件导入特定Excel工作表的特定范围。另一个子/函数负责在名为text_filepathdata的字段中的表单上使用文件名。

我发现工作表名称中的空格有问题,但可以通过使用特殊报价来解决。

Dim sheetname As String
sheetname = "'Commit Volumes!'"
DoCmd.Transferspreadsheet acImport, acSpreadsheetTypeExcel12, _
    "lcl_ImportedFile", text_filepathdata, True, sheetname

这是有效的,但由于特殊报价,我不能指定工作表名称以外的范围...(即“'提交卷!A6:Z5000'”不起作用,两者的连接也不起作用像“'Commit Volumes'”和“A6:Z5000”这样的作品

我尝试了各种引用和连接,但唯一有效的方法是:

sheetname = "'Commit Volumes!'"
sheetname = "'Commit Volumes$'"
sheetname = "CommitVolumes!A6:Z5000"

无法修改Excel工作表,因为它来自另一个系统,并且必须将文件(更新后)上载回该系统。

这是我的代码:

Private Sub button_Go_Click()
On Error GoTo Err_button_Go_Click

Dim sheetname As String
sheetname = "'Commit Volumes!'"

If IsNull(text_filepathdata) Or text_filepathdata = "" Then
    MsgBox "Please browse and select a valid file to import.", _
        vbCritical, "Invalid File"
Else
    DoCmd.OpenForm "f_PleaseWait_Processing", acNormal, , , acFormReadOnly, acWindowNormal
    If ifTableExists("lcl_ImportedFile") = True Then
        DoCmd.DeleteObject acTable, "lcl_ImportedFile"
    End If
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12,_
        "lcl_ImportedFile", text_filepathdata, True, sheetname

'Call module to process the imported data
        Call MainProcess
    End If

Exit_button_Go_Click:
    Exit Sub

Err_button_Go_Click:
    MsgBox Err.Number & " - " & Err.Description
    Resume Exit_button_Go_Click

End Sub

我根据问题得到两个不同的错误消息。

如果我得到的名称中有一个空格:运行时错误3129:无效的SQL语句;预期'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE'。

如果该名称有问题,否则我得到:运行时错误3011:Microsoft Access数据库引擎找不到对象“Commit Volumes $ A1:Z5000”。确保对象存在,并正确拼写其名称和路径。如果“Commit Volumes $ A1:Z5000”不是本地对象,请检查您的网络连接或联系服务器管理员。

任何帮助将不胜感激!

法案

我试过的变化:

sheetname = "'Commit Volumes'!A6:Z5000"; 
sheetname = "'Commit Volumes!'A6:Z5000" 
sheetname = "'Commit Volumes$'A6:Z5000" 
sheetname = "'Commit Volumes'$A6:Z5000" 
sheetname = "'Commit Volumes'$A$6:$Z$5000" 
sheetname = "'Commit Volumes!'$A$6:$Z$5000" 
sheetname = "'Commit Volumes$'$A$6:$Z$5000"
vba import access-vba spreadsheet ms-access-2010
6个回答
1
投票

如果文件以已知的\ set格式从其他系统导出,则可以通过索引而不是名称来引用它:

例如:片材(1),片材(2)。然后添加范围。


0
投票

这就是你需要的:

'Commit Volumes'!A6:Z5000

如果工作表名称带有空格或短划线,则excel会在工作表名称周围放置单引号,而不是在整个引用周围。

所以:

sheetname = "'Commit Volumes'!A6:Z5000"

0
投票

使用sheetname =“Commit Volumes $”没有范围,似乎通过将表字段名称与excel列标题匹配起作用


0
投票

我遇到过同样的问题。

最后我发现你可以使用:

sheetname =“Commit Volumes!A6:Z5000”示例DoCmd.TransferSpreadsheet acImport,acSpreadsheetTypeExcel9,“table name”,_ filetoimport,False,“Commit Volumes!A6:Z5000”

问候!


0
投票

我尝试了上面提出的解决方案,不幸的是它在我的情况下不起作用:当工作表的名称中有空格时,Access的导入方法确实不喜欢它。

我做了一个解决方法:在代码中将工作表重命名为短而无空格,例如:从“Data Q1 2016”到“WS1”。这样,您可以将值“WS1 $”传递给导入函数的Range参数,Access将导入给定工作表的使用范围

导入第二个工作表时,我再次使用代码并将其重命名为“WS2”......依此类推。

总结:在代码运行时将工作表重命名为没有空格的短名称,并在末尾添加'$'符号以使其获取使用的范围。


0
投票

我遇到了同样的问题。当我创建一个范围字符串变量并将其传递给DoCmd.TransferSpreadsheet例程时,Access更改了“!”字符到“$”并给了我一个错误。如果我将字符串常量传递给DoCmd.TransferSpreadsheet例程的Range参数,则Access不会更改字符。换句话说,运行以下代码,...

Dim strFilename As String
Dim strRange As String
Dim strTableName As String

strFilename = "YourWorkbookName.xlsx"
strRange = "Sheet5!A1:Z99"
strTableName = "tblImport"

DoCmd.TransferSpreadsheet _
  TransferType:=acImport, _
  SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
  TableName:=strTableName, _
  FileName:=strFilename, _
  HasFieldNames:=True, _
  Range:=strRange

...给了我3011运行时错误。

但是,当我将工作表名称和地址分成两个单独的变量并将它们传递给例程时,Access很高兴。换句话说,当我运行代码时,......

Dim strAddress As String
Dim strFilename As String
Dim strSheetName As String
Dim strTableName As String

strAddress = "A1:Z99"
strFilename = "YourWorkbookName.xlsx"
strSheetName = "Sheet5"
strTableName = "tblImport"

DoCmd.TransferSpreadsheet _
  TransferType:=acImport, _
  SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
  TableName:=strTableName, _
  FileName:=strFilename, _
  HasFieldNames:=True, _
  Range:=strSheetName & "!" & strAddress

...我没有收到任何错误,Sheet5表中的数据已正确导入tblImport。

应该注意的是,Sheet5不是工作簿的第一张,而strAddress中没有“$”字符。

快乐的编码。

© www.soinside.com 2019 - 2024. All rights reserved.