如何设置代码以动态分隔多次?

时间:2015-11-11 23:56:06

标签: excel vba excel-vba delimiter

我正在分析从网站上提取的一些数据,现在它在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个名称和日期范围配对,而不仅仅是我在示例单元格中列出的两个?

2 个答案:

答案 0 :(得分: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列的下一个空白行。

答案 1 :(得分:0)

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)="显示"

也可以在公式中使用SUBSTITUTE和FIND / SEARCH来完成,但是跟踪可能会很棘手。