vba Excel to Access:零长度字符串到空数

时间:2015-06-19 20:57:37

标签: excel vba excel-vba

我在Excel的同一列中有两个值。我选择其中一个并执行以下操作:

Debug.Print IsNumeric(Selection), _
            VarType(Selection), _
            VarType(Trim(Selection)), _
            ">" & Selection.Value & "<", _
            Len(Trim(Selection)), _
            Len(Selection), _
            Selection.NumberFormat

然后我选择另一个并运行相同的调试。

我明白了:

  • True,5,8,&gt; 9.46979663546499&lt;,16,16,General
  • 错误,8,8,&gt;&lt;,0,0,一般

注意:该列多次出现

  1. 有人可以解释一下吗?我一直在vba'ing和Excel'ing很长一段时间,我仍然没有得到(详细)Excel格式化的数字以及如何最好地使用它们。我想我拥有它然后我总是偶然发现这样的新事物。
  2. 在这种情况下,我的目标是让MS Access自动理解这个列是双/数/浮点数/任何列,当我导入它时可以为NULL并且不会抛出错误。我必须通过在导入之前在Excel中格式化/更改它来实现这一点。 (部分原因是因为这对我的客户流程最有效,部分原因是因为我想最终了解这个...我不敢相信我还没有!)我有超过2000行要改变每一列这样一个解决方案一次格式化整个列将是最好的,而不是一次只有一个单元格。
  3. 谢谢!

2 个答案:

答案 0 :(得分:2)

IsNumeric为数字返回true,为空白返回false。我不确定这是不是意外,但MS不得不让它返回一个或另一个。逻辑是空白既不是数字也不是文本。

Vartype为数字返回Double(按预期方式)。如果我VarType一个空单元格,我得到vbEmpty(0),而不是8(Excel 2010 x86)。如果我在单元格中放入一个撇号,我会和你一样。

修剪()时,将其转换为文本。修剪的内容无关紧要,Trim函数只返回一个字符串,因此你总是得到VarType 8。

阅读有关混合数据类型http://dailydoseofexcel.com/archives/2004/06/03/external-data-mixed-data-types/的这篇文章。请务必阅读评论。

当Office程序导入时,它使用一些注册表项来确定数据类型。通常,它会读取字段的前8行以确定数据类型。如果它看到混合的数据类型,它会选择多数并转换或忽略其他所有内容。您可以更改注册表设置以查看超过8行或将所有内容默认为文本,但您无法告诉它将空单元格视为数字。

如果它只是忽略空单元格并占据其余部分,那将是很好的。但是“空单元”并不是Excel以外的概念,所以它并不让我感到惊讶。

我认为,正确的答案是创建一个Schema文件并将其放在与要导入的文件相同的目录中。请在https://msdn.microsoft.com/en-us/library/ms709353%28v=vs.85%29.aspx处阅读此内容。这实质上是将所有列数据类型设置在文件中。

我几乎每天都在Excel VBA中使用它 - 我使用VBA创建Schema.ini文件then use ADO to read in the file。我从来没有在Access中使用它,特别是通过UI导入。但值得一试。如果它不起作用,您可以在VBA和ADO中自己进行所有导入。

答案 1 :(得分:1)

首先,我会从逻辑上看每列应包含哪种类型的数据。有些数字不计算,因此应视为文本,特别是在(例如)具有前导零的项目编号的情况下。你肯定不想将它们转换为数字并丢失那些前导零,如果查询它们的任何东西都无法处理隐式转换,它通常会导致下游问题。另一个例子是数字长度超过15。 Excel会将第15位后的所有内容都变为零,因为它不是一个重要数字,但如果这是序列号(或类似数字),则表示您正在破坏数据。

了解每列应该是什么后,请使用text-to-columns。数字应该是一般的,日期应该是日期,其他一切都应该是文本。

http://www.excel-easy.com/examples/text-to-columns.html

Text-To-Columns优于此目的,因为它实际上会转换数据类型。如果使用格式化,则在编辑单元格之前不会应用格式。