【问题标题】:Excel VBA extract date from CSV txtExcel VBA 从 CSV txt 中提取日期
【发布时间】:2017-11-01 11:16:59
【问题描述】:

我无法从 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 或操作系统日期设置如何,都可以提取全文

感谢您的意见

【问题讨论】:

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

标签: excel vba csv


【解决方案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), "'", "")

【讨论】:

    【解决方案2】:

    如果您包含“Microsoft VBScript 正则表达式 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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多