Excel VBA从CSV文本中提取日期

Excel VBA从CSV文本中提取日期,excel,vba,csv,Excel,Vba,Csv,我在从CSV中提取此文本时遇到问题,与它显示的完全一样。SO上发布了类似的问题,但与我的要求不符: 我想从这一行中摘录2017年1月31日: 4,'31 January 2017','Funds Received/Credits',56,,401.45, 目前,VBA认为它是1月31日,没有年份。我已经尝试将.NumberFormat应用于单元格常规、文本、日期 解决方案要求: 无需用户操作-仅使用VBA与文件交互,而不使用文件>导入>向导 与VBA Excel 2003兼容 无论Excel或

我在从CSV中提取此文本时遇到问题,与它显示的完全一样。SO上发布了类似的问题,但与我的要求不符:

我想从这一行中摘录2017年1月31日:

4,'31 January 2017','Funds Received/Credits',56,,401.45,
目前,VBA认为它是1月31日,没有年份。我已经尝试将.NumberFormat应用于单元格常规、文本、日期

解决方案要求:

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

您可以使用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), "'", "")
如果不需要单引号,请添加如下替换函数:

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), "'", "")

如果包含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)

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

编辑你的问题以显示你的VBA代码。braX的答案是最简单、最直接的,并且给出了准确的期望结果,所以我选择了它。对我的问题进行进一步的故障排除后发现,Excel实际上给出了正确的结果——我将输出与错误的行进行了比较。掌心!