长文本 (> 255 个字符) 在 MS Access 2013 中导入并添加到现有表时被截断



我正在尝试使用以下VBA代码导入Excel电子表格。在引入它之前,我还删除了表格的当前内容。

DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True

rebate_prog表已经将字段定义为长文本(根据我的理解,这是旧的备忘录字段),应该能够存储> 255 个字符。

Access 会截断内容是否有原因?

我尝试过的一些事情,但没有成功:

    按截
  • 断字段的长度降序对导入文件进行排序 - 因为如果 excel 只查看前几行,它将导入为长文本。
  • 尝试将表属性中"设计视图"下字段的"文本格式"更新为纯文本格式,但由于某种原因,Access 不允许我进行更改。

有没有办法在不截断字段的情况下导入 excel 电子表格?

这是我通常针对此类数据类型问题做的快速技巧。(假设您的 Excel 文件不是怪物):

  1. Excel中,首先在开头添加一个空列(A),然后选择整个工作表(单击左上角),然后按Ctrl-C

  2. 在 Access 中,使用"表"按钮创建新表。单击左上角以选择所有内容(应该只有一个单元格),然后单击 Ctrl-V您的数据在那里,您的列已创建。检查长文本所在的列,它可能是短文本,并且您的数据被截断。进入表格的设计模式,将字段更改为 LongText/Memo,将格式更改为富文本(以确保它在 254 个字符后不会隐藏)并保存表格。

  3. 删除表格中的所有行

  4. 将复制/粘贴操作从 Excel 重复到您的表格

您的文本不应再被截断,您可以使用此表或其结构副本在 APPEND 模式下进行进一步的 VBA 导入

找到了解决此问题的方法。可能还有其他解决方案,但这个似乎对我有用。以下是我所做的事情的一步一步:

  1. 手动创建访问表:我在 Access 2013 中手动创建表结构,并为每个字段定义每种数据类型。在我想导入>255个字符的字段中,我将此字段数据类型设置为"长文本",并将格式选择为"富文本"。

注意:我为此表创建的结构与我打算导入的文件中的结构完全相同。

  1. 根据字符长度对导入文件进行排序:接下来,我使用LEN()函数在导入文件中添加了一个新字段LEN(<Cell in the long text field>)。然后使用此字段按降序对所有记录进行排序并保存文件。我必须这样做,因为导入时的 Access 会查看顶部几行以确定需要从列导入多少数据(我在浏览了几个论坛后了解到这一点)。

备注:您还可以创建一个VBA代码,该代码在导入之前按降序为您进行排序,但我尚未执行。如果您这样做,请在此处分享代码!

  1. 导入!:最后,使用我在下面提供的代码截断我们手动创建的表,并将 excel 中的内容插入到表中。

DoCmd.RunSQL ("DELETE * FROM REBATE_PROG") DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True

就我而言,长文本已从Excel导入Access 2016,但无法完全看到。

只需从表中的 Format 属性中删除"@",即可在表中看到完整的字段。

同样,删除显示长文本的表单文本框上的"@",允许在表单上看到完整的字段。

这是我所做的。我隔离了长文本字段,以便我可以使用更新而不是追加来添加它。

因此,在我的原始传递中,我将链接的 Excel 表中的数据追加到我的访问表中。这不起作用,因为它截断了长文本。所以我所做的是从追加查询中删除长文本字段,并为所有其他字段运行追加

现在,我的新记录对于该长文本字段具有 Null,而我的现有记录具有长文本。(我需要这样做,因为长文本可能已更改,如果当前长文本与现有长文本不匹配,我需要稍后在加载路由中进行更新。(这就是我发现这个的方式))

因此,现在我可以对长文本字段为 Null 的记录进行更新,并保留具有长文本的记录不变。这将进入整个长文本。

稍后,当我对已更改的文本进行第二次更新时,数据库将看到实际更改,而不是由于追加截断而获得的错误更改。

更新很好。追加是 Bad

这个问题有一个非常简单易行的解决方案。例如,工作表 #1 中列 A 的某些行包含短文本,同一列的某些行包含长文本。将工作表 #1 的副本作为工作表 #2。

在工作表 #1 上,删除 A 列的长文本行并仅保留短文本行。

在工作表 #2 上,删除 A 列的短文本行并仅保留长文本行。

现在对工作 1 使用传输电子表格命令,然后对 woeksheet #2 使用传输电子表格命令。

Call DoCmd.TransferSpreadsheet( _
    acImport, _
    acSpreadsheetTypeExcel12Xml, _
    strTableName, _
    strFullPathOfWorkbook, _
    True, _
    "WorkSheet_1!A1:Z1000)
Call DoCmd.TransferSpreadsheet( _
    acImport, _
    acSpreadsheetTypeExcel12Xml, _
    strTableName, _
    strFullPathOfWorkbook, _
    True, _
    "WorkSheet_2!A1:Z1000)

我已经测试了这个解决方案100多次,它运行良好。诀窍是在两个工作表中划分具有混合短文本和长文本行的列。所有其他程序员都失败了,因为他们中的大多数人忽略了 VBA 无法处理包含短文本和长文本的混合列这一事实。

最新更新