【问题标题】:Telling Excel VBA TextToColumns NOT to split by spaces告诉 Excel VBA TextToColumns 不要用空格分隔
【发布时间】:2023-09-21 23:08:01
【问题描述】:

我在 Excel 2003 中使用 VBA。 这是我遇到的问题的最简单示例。 我只想用 commas 将字符串拆分为行中的单元格。

在单元格 A1 中,我有以下字符串:

A B,C

在 VBA 中,如果我说 Range("A1").TextToColumns Comma:=True,Space:=False,它会达到我的预期。单元格 A1 为 A B,单元格 B1 为 C

但如果我有这个字符串:

A B C,D

如果我使用Range("A1").TextToColumns Comma:=True,Space:=False,它会被SPACES分割!单元格 A1 是 A,单元格 B1 是 B,单元格 C1 是 C,D (?!)

为什么TextToColumns 有多个空格时会自动按空格分隔,即使我明确告诉它不要这样做?这是一个已知的错误? 除了自己手动将字符串解析成列之外,是否有解决方法?

【问题讨论】:

  • 这个问题很有趣,因为它暴露了一个可能的 Excel-VBA 错误。

标签: excel vba csv


【解决方案1】:

您希望将 DataType 显式设置为 xlDelimited,否则 Excel 会假定您的数据排列在固定宽度的列中,并且 Excel 对这些列的宽度的初始猜测是空格所在的位置 - 忽略您使用的任何分隔符在参数列表中选择。

尝试以下操作,您会看到它重现了您的结果:

Range("A1").TextToColumns DataType:=xlFixedWidth

这与省略 DataType 参数的结果相同:

Range("A1").TextToColumns

请注意,Excel 文档在这方面是错误的:它说xlDelimited 是默认值,但显然xlFixedWidth 是现实中的默认值。

所以,长话短说,你想要的是这样的:

Range("A1").TextToColumns DataType:=xlDelimited, Comma:=True, Space:=False

编辑 看起来比 Excel 文档多一点可能是错误的。这实际上闻起来像 Excel-VBA 中的错误。请参阅下面的 cmets 中的讨论。

【讨论】:

  • 啊哈,xlDelimited 是我想要的!谢谢!
  • 这当然可以解决问题,但我认为这不是全部。如果我省略 DataType 并且 don't 使用命名参数,我会得到预期的行为。此外,帮助说 re Comma “...True to have DataType be xlDelimited and to have the comma be a delimiter...”,这让我认为将逗号设置为 True 会强制 xlDelimited。显然情况并非如此。似乎命名参数设置的默认值与不使用命名参数时不同。对我来说听起来像是一个错误。
  • 确实是错误,我实际上认为它比您描述的更糟糕和更奇怪。请参阅下面我对 JP 答案的第二条评论。带回家的消息可能是使用命名参数(非命名参数显然会导致不可预知的行为),并且永远不要假设默认值会起作用,因此请指定尽可能多的命名参数以使您的测试正常工作。
  • 经过更多测试后,我真正需要的唯一参数(至少对于我的目的而言)是 DataType:=xlDelimited 。不再需要显式设置逗号和空格。完美!
  • 很好。但是为了让你的代码保持可读性,我建议你明确地设置一些东西,这样下一个阅读你的代码的人(也许明年你)就知道它的意图是什么了。
【解决方案2】:

ConsecutiveDelimiter 设置为True

Range("A1").TextToColumns ,,,True,,,True,False

【讨论】:

  • 但这并没有什么区别……发帖前你测试了吗?!
  • 我的错,现在正在修复代码。是的,我确实对其进行了测试,但我没有使用命名参数。我尝试将其转换为命名参数显然失败了。
  • 嗯,这个高度不可读的语句确实“起作用”,尽管没有合理的解释为什么 - 将参数列表转换为命名参数使其起作用。 .. 闻起来像 Excel 错误,而不是推荐的答案。附言尽管我最初很想投反对票。
  • 这可能就是我使用命名参数发布它时失败的原因。无法解释。为您的答案 +1,反正更好。
  • 感谢任何人因为 Excel 的最终问题,而不是我的代码问题。