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

Long text (> 255 chars) truncated while importing and adding to existing table in MS Access 2013

我正在尝试使用以下 VBA 代码导入 excel 电子表格。在引入它之前,我还删除了 table.

的当前内容
DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True

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

Access 截断内容是否有原因?

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

有什么方法可以导入 excel 电子表格而无需截断字段?

这是我通常用来解决这类数据类型问题的快速技巧。 (假设你的 Excel 文件不是怪物):

  1. 在Excel中,首先在开头添加一个空列(A),其次select你的整个sheet(点击左上角),然后然后 CTRL-C

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

  3. 从 table

  4. 中删除所有行
  5. 重复从 Excel 到 table

  6. 的 copy/paste 操作

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

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

  1. 手动创建 Access Table: 我在 Access 2013 中手动创建了 table 结构并为每个字段定义了每种数据类型。在我想要导入 >255 个字符的字段上,我将此字段数据类型设置为 "Long text" 并将格式选择为 "Rich text".

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

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

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

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

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

在我的例子中,长文本是从 Excel 导入到 Access 2016,但无法完全看到。

只需从 table 中的格式 属性 中删除“@”,就可以在 table 中看到完整的字段。

同样,删除显示长文本的表单文本框上的“@”,可以在表单上看到完整的字段。

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

所以在我原来的传递中,我将来自链接 Excel table 的数据附加到我的访问 table 中。这没有用,因为它截断了长文本。所以我所做的是从追加查询中删除长文本字段,运行所有其他字段的追加

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

所以,现在我可以对长文本字段为空的记录进行更新,并保持具有长文本的记录不变。这样就进入了整个长文本。

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

更新很好。追加不好

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

在工作表 #1 上,删除 A 列的 long-text 行,仅保留 short-text 行。

在工作表 #2 上,删除 A 列的 short-text 行,仅保留 long-text 行。

现在对工作表 1 使用传输电子表格命令,然后对工作表 #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 多次测试,并且效果很好。诀窍是在两个工作表中划分具有混合 short-text 和 long-text 行的列。 所有其他程序员都失败了,因为他们中的大多数人都忽略了 VBA 无法处理包含短文本和长文本的混合列这一事实。