我在Excel的同一列中有两个值。我选择其中一个并执行以下操作:
Debug.Print IsNumeric(Selection), _
VarType(Selection), _
VarType(Trim(Selection)), _
">" & Selection.Value & "<", _
Len(Trim(Selection)), _
Len(Selection), _
Selection.NumberFormat
然后我选择另一个并运行相同的调试。
我明白了:
注意:该列多次出现
谢谢!
答案 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优于此目的,因为它实际上会转换数据类型。如果使用格式化,则在编辑单元格之前不会应用格式。