2015-06-19 66 views
2

我有两个值在Excel中的同一列。我选择其中一个并运行以下命令:vba Excel访问:零长度字符串为空数

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

然后,我选择其他并运行相同的调试。

而且我得到这个:

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

注:该列中多次出现两个

  1. 有人能解释一下吗?我一直在vba'ing和Excel'很长一段时间,但我仍然没有(详细)Excel的数字格式,以及如何最好地与他们合作。我想我有它,然后我总是偶然发现这样的新事物。
  2. 在这种情况下,我的目标是让MS Access自动理解这个列是一个double/number/float/whatever列,当我导入并且不会抛出错误时它可以是NULL。在导入之前,我必须通过在Excel中格式化/更改它来实现此目的。 (部分原因是因为这对我的客户端流程来说效果最好,部分原因是我最终想到了这个问题......不能相信我还没有!)我有超过2000行来更改每列,所以解决方案一次格式化整个列的做法是最好的,而不是一次一个单元格。

谢谢!

+0

你期望输出看起来像什么?你选择的是什么? –

+0

S O - 我想知道如何使用VBA和格式或转换使数据类型(VarType(Trim(Selection)))在Excel中相同。 N8确实“解决”了问题,但我仍然对原始问题没有更好的理解。如果您有任何意见,那就太棒了! – mountainclimber

+0

你如何将它导入到Access? Via Access'导入过程?复制和粘贴? VBA? –

回答

2

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

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

当你修剪()的东西,你将其转换为文本。不管你修剪什么,修剪功能只返回一个字符串,所以你总是会得到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中自己完成所有的导入操作。

+0

我正在研究使用schema.ini文件。它会在Excel文件上工作,还是需要将其转换为文本文件?您每天使用哪些信息创建架构文件?你有可以分享的代码示例吗?我发现这个链接,但它看起来很旧:https://support.microsoft.com/en-us/kb/155512 – mountainclimber

+1

你一定需要将它保存为txt或csv,或任何纯文本。 Schema.ini与文本文件驱动程序一起工作,所以它不适用于二进制文件(或者Excel压缩的xmls文件)。按照上面段落中的链接。它明确说明了我的工作。但是,如果您遇到困难,请在此处发布另一个问题,并使用VBA和ADO标记,我一定会看到它。 –

1

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

一旦您了解每个列应该是什么,请使用文本到列。数字应该是一般的,日期应该是日期,其他的都应该是文本。

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

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

+0

n8 - 解决了这个问题,非常感谢。它有一个令我很失望的问题,那就是我有1350列和文本到列,每次只有一列。我想我会自动化它。但是,它没有解决我所遇到的一般Excel数据格式问题/问题。如果有人想在这上面发笑,那会很棒。有趣的是,在对列进行文本处理之后,导入的数据可以正常访问,但上面的Debug.Prints没有改变!是的,我对我的数据类型有很多想法,但是我想要的具体类型对于回答具体问题并不重要,所以我没有提及它。 Thx再次! – mountainclimber

+1

很高兴工作!迪克也有一些有趣的观点,我可能会在某些时候使用我自己。我通常只使用Excel作为“转储到”而不是“读取”,这主要是因为您遇到的问题类型。 –

+0

我改变了Dick K答案的“答案”,因为这一直不成功。我看到的一个案例是,当我的前10个值是空白,第11-13个值是短文本,并且该字段出现错误和双倍。 – mountainclimber