【问题标题】:How do I set up code to dynamically delimit multiple times?如何设置代码以多次动态分隔?
【发布时间】:2015-11-11 23:56:06
【问题描述】:

我正在分析从网站中提取的一些数据,现在它在 Excel 的单个单元格中采用如下格式,例如:

[2015-08-01--2010-01-01], Jerry Smith; [2009-12-31--2000-01-01], John Brown

所有这些都位于 A1 中。

我想先用分号分隔它,然后转置信息,然后将两个日期时间段分隔成列,这样我上面列出的示例的最终结果就变成了一个 2x3 单元格分组列是 1. 开始日期 2. 结束日期 3. 名称

我玩过一些 VBA 代码,但我很沮丧,因为我什至不知道如何编写用分号分隔的第一步。

这是我目前使用的:

    Sub CommandButton1_Click()
Selection.TextToColumns _
  Destination:=Range("A1"), _
  DataType:=xlDelimited, _
  TextQualifier:=xlDoubleQuote, _
  ConsecutiveDelimiter:=False, _
  Tab:=False, _
  Semicolon:=True, _
  Comma:=False, _
  Space:=False, _
  Other:=False, _
  OtherChar:=False, _

  End Sub

我知道这是用分号分隔的不正确的第一步,那么我需要做些什么来修复它以及如何处理我描述的后续步骤?

另外,我怎样才能正确编写代码,以便它可以适应 3+ 名称和日期范围配对,而不是像我在示例单元格中列出的那样只有两个?

【问题讨论】:

  • 我们平均要讨论多少个分组?
  • 可能不超过 10 个具有日期范围的名称分组。为了提供一些背景信息,他们是共同基金经理,他们的任期开始和结束日期。
  • @jeeped 答案应该可以工作,一站式完成。

标签: vba excel delimiter


【解决方案1】:

使用变体数组首先在分号上Split,然后在逗号上分割每个部分。日期被拆分/解析为实际日期,并应用单元格编号格式来重新创建原始字符串日期的格式。

Sub CommandButton1_Click()
    Dim v As Long, vTMPs As Variant, vVALs As Variant, vDTs As Variant
    With ActiveSheet
        'split on semi-colon (e.g. Chr(59))
        vTMPs = Split(.Cells(1, 1).Value2, Chr(59))
        For v = LBound(vTMPs) To UBound(vTMPs)
            Debug.Print vTMPs(v)
            'split each piece on the comma
            vVALs = Split(vTMPs(v), Chr(44))
            'stuff it underneath and split the dates
            With .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
                vDTs = Split(Mid(Trim(vVALs(LBound(vVALs))), 2, Len(Trim(vVALs(LBound(vVALs)))) - 2), "--")
                .Cells(1, 1) = DateSerial(Left(vDTs(0), 4), Mid(vDTs(0), 6, 2), Right(vDTs(0), 2))
                .Cells(1, 2) = DateSerial(Left(vDTs(1), 4), Mid(vDTs(1), 6, 2), Right(vDTs(1), 2))
                .Resize(1, 2).NumberFormat = "yyyy-mm-dd"
                .Offset(0, 2) = Trim(vVALs(UBound(vVALs)))
            End With
        Next v
    End With
End Sub

最终拆分的每个元素都放入A列的下一个空白行中。

【讨论】:

  • 这很好,但是 OP 的第三个愿望呢,拆分日期。我只是好奇你会怎么做,因为你的代码总是比我想象的更紧凑。
  • @ScottCraner - 是的,我应该完成最后的日期修剪/拆分/转换。
  • 这并不意味着批评,我会再次做不同的,但我想的方法是多行几行以获得相同的结果。我喜欢学习,也喜欢帮助。感谢您的回复。
  • 不用担心。不要把我的简洁误认为是顺从。我写 cmets 就像写代码一样;用尽可能少的词。 :)
  • 我明天将花一些时间来回顾一下,以尝试了解它是如何工作的。非常感谢您发布此消息,我没想到会这么快得到答复。我不想用我极其有限的知识浪费你的时间,但我很好奇。我正在使用的代码是在正确的轨道上还是完全错误的?
【解决方案2】:
dim strSplit() as string

strSplit =split(range("a1").value,";")
range("b1").value=strsplit(0)
range("b2").value=strSplit(1)

是第 1 位 :) 然后同样适用于每个 strSplit,第二次使用“,”,日期在 1,名称在另一个

split("test show"," ") 给出一个数组 (0)="test" (1)="Show"

也可以在公式中使用 SUBSTITUTE 和 FIND/SEARCH 来完成,但很难跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多