将存储的,以管道分隔的字符串转换回日期,从中剥离逗号(十进制分隔符)

时间:2015-05-21 17:49:34

标签: excel vba excel-vba

在我正在制作的工作表中,我将一些旧数据存储为以管道分隔的字符串。

存储数据的功能如下:

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)上收到溢出错误,当我查看工作表时,我找到的值是421455416666662421456249999996等,换句话说,它看起来这些逗号已经从将它们写回工作表的某个地方的值中删除了。

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

3 个答案:

答案 0 :(得分: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

我只是不知道这是否适用于您所在的地区。

答案 1 :(得分: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位数字。应该是这种情况,除非您的数据 真的 旧。

答案 2 :(得分:0)

c = CDate(c)更改为c = CDate(c.Text)