从CSV txt

时间:2017-11-01 11:16:59

标签: excel vba csv

我无法从CSV中提取此文本,就像它看起来一样。在SO上发布了类似的问题,但它们不符合我的要求:

我想提取" 2017年1月31日"从这一行:

4,'31 January 2017','Funds Received/Credits',56,,401.45,

目前,VBA认为" 1月31日"没有一年。我尝试将.NumberFormat应用于单元格(一般,文本,日期)。

解决方案要求:

  1. 无需用户操作 - 仅使用VBA与文件交互(不使用文件>导入>向导)
  2. 与VBA Excel 2003兼容
  3. 无论Excel或操作系统日期设置如何,都会提取全文
  4. 感谢您的想法

2 个答案:

答案 0 :(得分:0)

您可以使用split函数,使用逗号作为分隔符,如下所示:

sResult = Split("4,'31 January 2017','Funds Received/Credits',56,,401.45, ", ",")(1)

如果你不想要单引号,那么添加如下的替换函数:

sResult = Replace(Split("4,'31 January 2017','Funds Received/Credits',56,,401.45, ", ",")(1), "'", "")

答案 1 :(得分:0)

如果包含“Microsoft VBScript Regular Expressions 5.5”参考,则可以设置一个模式,如果找到它,将提取整个日期。例如:

Dim tstring As String
Dim myregexp As RegExp
Dim StrMatch As Object
tstring = 'Line from the CSV, or entire CSV as one string
Set myregexp = New RegExp
myregexp.Pattern = "\d{1,2} [A-Z]{3,9} \d{4}"
Set StrMatch = myregexp.Execute(tstring)

您可以从此方法中获益,CSV中的所有日期将立即被拉出,比逐行拆分要快得多。此外,可以使用

访问日期
DateStr = StrMatch.Item(index)

对于整个字符串行,或者可以设置子字符串以获取字符串的特定部分(例如月,日,年)。

myregexp.Pattern = "\(d{1,2}) ([A-Z]{3,9}) (\d{4})"
Set StrMatch = myregexp.Execute(tstring)
DateStr = StrMatch.Item(index1).SubMatches(index2)

它是一个非常强大的工具,带有一组简单的符号用于开发模式。我强烈建议你熟悉它来操纵大字符串。