2015-05-21 46 views
2

在工作表中,我将一些旧数据存储为管道分隔的字符串。将存储的管道分隔字符串转换回日期,从中删除逗号(小数点分隔符)

用于存储数据的功能是这样的:

target_cell.Offset(0, i) = Join(Application.WorksheetFunction.Transpose(source_range(i).Resize(, 1)), "|") 

的正常工作,并产生一个字符串,看起来像这样:现在

42145,5416666662|42145,6249999996|42145,2083333329|42144,8333333329|42145,9999999996 

,有时,我想有一个看看我的旧数据,并因此尝试将其写入工作表。我的代码行这部分看起来是这样的:

temp_arr = Split(source_cell.Offset(0, i), "|", -1, vbTextCompare) 
    target_range(i).Resize(, 1) = Application.WorksheetFunction.Transpose(temp_arr) 
    For Each c In target_range(i).Resize(, 1) 
    If Not IsEmpty(c) Then 
     c = CDate(c) 
     c.NumberFormat = "dd. mmm kl. hh" 
    End If 
    Next 

但是,我上线c = CDate(c)溢出错误,当我看着表,我觉得值是​​,421456249999996等,换句话说,看起来这些逗号已经从将它们写回工作表的方式中的某些值中删除了。

你们有没有人知道在这个过程中的哪一步删除逗号,以及我能做些什么来避免这种情况?

回答

2

逗号是越来越剥离因为Excel可能会错误地假定它是一个千位分隔符

编辑#1

使用你的数据,我跑:

Sub ytrewq() 
    Dim s As String, D As Date 
    s = "42145,5416666662" 
    s = Replace(s, ",", ".") 
    Range("A1").Value = s 
    D = CDate(Range("A1").Value) 
    MsgBox D 
End Sub 

,并得到:

enter image description here

我只是不知道这是否会为工作你的地区。

+0

有什么办法可以避免它被剥离?或者我应该重新插入单元格左边的5个字符(我认为大多数日期应该在40000年)?除非有人在这里提出了另一个好的解决方案,我认为这可能就是我所追求的。 – eirikdaude

+1

@eirikdaude **您必须试验**由于我的区域设置,我无法复制您的问题。 –

+0

我已经做了一些,已经;)会看到我能弄清楚,但。 – eirikdaude

0

变化c = CDate(c)c = CDate(c.Text)

+0

没有。 'CDate(c)'正在利用该范围的*默认值* - 由于'c.Text'是'421455416666662',所以会溢出。 –

+0

我假设c.Text会包含逗号? – Jeanno

+0

再次阅读OP ;-) –

1

您可以处理运行时错误6 /溢出:

On Error GoTo ErrHandler 
    Dim value As String  

    For Each c In target_range(i).Resize(, 1) 
     If Not IsEmpty(c) Then 
      value = c.value 
      c.Value = CDate(value) 
      c.NumberFormat = "dd. mmm kl. hh" 
     End If 
    Next 

CleanExit: 
    Exit Sub 'Function? 
ErrHandler: 
    If Err.Number = 6 Then 'overflow 
     value = Left$(value, 5) & "," & Right$(value, Len(value) - 5) 
     Resume 
    Else 
     MsgBox "Unhandled error: " & Err.Description 
     Resume CleanExit 
    End If 

该处理器假定唯一可能的溢出错误是因为你指定的valueDate溢出的原因转换。可能不理想。它也假定区域设置,并且数字日期有5位数。其中应该是是这种情况,除非您的数据是真的是旧的。

+0

是的,我认为这会工作,几乎完成插入到我的模块,当我看到加里的学生的更新下面,我喜欢,因为它需要在模块中更少的代码 - 我只是用逗留期间,当我写他们存储。 – eirikdaude

+0

加里的答案解决了问题的根源。这只是一个黑客的解决办法。你接受了正确的答案;-) –

相关问题