vba Excel访问:零长度的string为空数字

我有两个值在Excel中的同一列。 我select其中一个并运行以下内容:

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

然后我select其他并运行相同的debugging。

我得到这个:

  • 真,5,8,> 9.46979663546499 <,16,16,一般
  • 假,8,8,>,<,0,0,一般

注意:该列有两个出现

  1. 有人可以解释这个吗? 我一直在vba'ing和Excel'ing很长一段时间,我仍然没有得到(详细)Excel的数字格式,以及如何最好地与他们合作。 我想我已经有了,我总是偶然发现一些新的东西。
  2. 在这种情况下,我的目标是让MS Access自动理解,这个列是一个double / number / float /无论什么列,当我导入它可以是NULL,而不是抛出错误。 在导入之前,我必须通过在Excel中格式化/更改它来实现此目的。 (部分原因是因为这将最适合我的客户端进程,部分是因为我想最终解决这个问题……不能相信我还没有!)我有超过2000行来更改每列,所以解决scheme一次格式化整个列将是最好的,而不是一次一个单元格。

谢谢!

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

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

修剪()某件东西时,将其转换为文本。 不pipe你修剪什么,修剪function只返回一个string,所以你总是会得到VarType 8。

阅读此混合数据types的文章http://dailydoseofexcel.com/archives/2004/06/03/external-data-mixed-data-types/ 。 确保你阅读了评论。

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

这将是很好,如果它会简单地忽略空单元格,并采取其余的大部分。 但是“空单元格”不是Excel以外的概念,所以它并不令我感到惊讶。

对于你来说,我认为正确的答案是创build一个Schema文件并把它放在你要导入的文件所在的同一个目录中。 阅读有关它在https://msdn.microsoft.com/en-us/library/ms709353%28v=vs.85%29.aspx这实质上是在文件中设置所有的列数据types&#x3002;

我几乎每天都在Excel VBA中使用它 – 我使用VBA创buildSchema.ini文件, 然后使用ADO读入文件 。 我从来没有在Access中使用过,特别是通过UI导入。 但值得一试。 如果它不起作用,你可以在VBA和ADO中完成所有的导入。

首先,我将从逻辑上看每列应包含哪些types的数据。 一些数字不能被计算,因此应该被视为文本,特别是在(例如)具有前导零的项目编号的情况下。 你绝对不想把这些数字转换成数字,并丢失那些前导零,如果查询它们不能处理隐式转换,它通常会导致下游问题。 另一个例子是数字长度超过15。 Excel会将第15位后的所有内容都变成零,因为它不是一个有意义的数字,但是如果这是一个序列号(或者类似的东西),那么就是破坏了数据。

一旦你了解每一列应该是什么,使用文本到列。 数字应该是一般的,date应该是date,其他的都应该是文本。

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

Text-To-Columns对于这个目的是优越的,因为它实际上将转换数据types。 如果使用格式化,则在编辑单元格之前不会应用格式。