2015-11-11 15 views
0

我分析在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+名称和日期范围配对,而不是像我在示例单元格中列出的那样仅配对两个?

+0

我们平均谈论多少组? –

+0

可能不超过10个具有日期范围的名称分组。为了给出一些背景,他们是共同基金经理以及他们任职期间的开始和结束日期。 – Pato

+0

@jeeped答案应该工作,一举一动。 –

回答

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

+0

这很好,但是OP的第三个想要分裂的日期呢。我只是好奇你将如何去做,因为你的代码总是比我想象的更紧凑。 –

+0

@ScottCraner - 是的,我应该完成最后的日期修剪/分割/转换。 – Jeeped

+0

这不是意味着批评,我会再次做到这一点不同,但我想的方法会有更多的线获得相同的结果。我喜欢学习以及帮助。我很感谢你的回应。 –

0
dim strSplit() as string 

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

是第1位:)那么同样将适用于每一个strSplit的,使用” “第2次和将日期在1和名称中的其他

分裂(”测试节目“”‘)给出了一个阵列(0)=’测试”(1)=‘查看’

它也可以在af中使用SUBSTITUTE和FIND/SEARCH完成ormula,但可能会变得棘手。