使用替换更改日期格式或替换

时间:2016-05-08 14:18:50

标签: excel vba

我正在从一个excel文件中读取数据并将数据写入另一个excel文件。

我的问题是来源的日期格式为dd.mm.yyyy,目的地的格式为dd-mm-yyyy

所以我搜索了SO并找到了这个答案Replacing one character with another in a string,这表明我可以使用substitute

所以我尝试了这段代码:

For r = 1 To 10 
    myOutputSheet.Cells(6+r, 1).Value  = myInputSheet.Cells(r, 1).Value 'Date
    myOutputSheet.Cells(6+r, 1).Value  = substitute(myOutputSheet.Cells(6+r, 1), ".", "-")
Next

它给出错误:

Microsoft VBScript runtime error: Type mismatch: 'substitute'

如何更正将.更改为-

  

更新

我也尝试了这个:

For r = 1 To 10 
    myOutputSheet.Cells(6+r, 1).Value  = myInputSheet.Cells(r, 1).Value 'Date
    replace(myOutputSheet.Cells(6+r, 1), 2, 1, "-")
    replace(myOutputSheet.Cells(6+r, 1), 4, 1, "-")
Next

但这会产生错误:

Microsoft VBScript compilation error: Cannot use parentheses when calling a Sub

因此我尝试了:

For r = 1 To 10 
    myOutputSheet.Cells(6+r, 1).Value  = myInputSheet.Cells(r, 1).Value 'Date
    replace myOutputSheet.Cells(6+r, 1), 2, 1, "-"
    replace myOutputSheet.Cells(6+r, 1), 4, 1, "-"
Next

但是会出错:

Microsoft VBScript runtime error: Type mismatch: '[string: "-"]'

1 个答案:

答案 0 :(得分:8)

首先,您应该知道Excel中的所有日期和时间都存储为数字,而显示为作为日期。

因此,如果这样显示,则数字42,000可以是日期。这是1899年12月31日之后的第42,000天。那将是2014年12月27日。

这是事情变得复杂的地方:日期不是作为数字存储,而是作为Excel中的文本存储。然后,对于Excel用户来说,单元格中可能存在日期,而事实上(对于Excel的理解)只有文本。虽然用户不可能仅通过查看单元格来区分两者之间的区别,但真正的区别在于您无法在纯文本日期执行和日期操作。

让所有人感到难过,让我们看看两个小例子:

(1)输入以下单元格:11.12.2013。有可能Excel会将其识别为日期并将其转换为数字41,619。然而,你会看到约会。这是因为Excel会自动将该单元格的格式从General更改为Date。但是,如果您将该单元格的格式更改为General,那么您将看到上述数字。

(2)现在,在单元格中输入以下内容:2015-14-11。再一次,Excel很可能不会将其识别为日期,而是将其存储为纯文本。当您查看该单元格的数字格式时,您可能仍会看到General,如果您明确将其更改为Number,则仍会看到2015-14-11

现在你可以更好地与@vacip上面的评论联系起来。他/她试图找出您的源文件中是否确实存在日期(存储为数字),或者此文件中只有文本可能表明它包含日期。

如果Excel在源文件中识别出这些日期,那么只需更改单元格的.NumberFormat即可轻松更改格式。从本质上讲,您可能需要查看源文件并检查是否可以将这些日期显示为数字(1899年12月31日之后的日期)。

如果是这种情况,那么您应该可以将数字格式更改为dd-mm-yyyy,并且您已全部设置完毕。但是,如果要将文本存储在目标文件中或者要在其中保存日期,则再次重要。如果您想在那里存储日期并在源文件中将它们作为日期,那么我建议如下:

myOutputSheet.Cells(6+r, 2).Value2  = myInputSheet.Cells(6+r, 2).Value2
myOutputSheet.Cells(6+r, 2).NumberFormat = "dd-mm-yyyy"

但是,如果您坚持将13.11.2013转移到目标文件中,那么您将需要使用以下内容(在源文件中确实存在可识别日期的情况下):

myOutputSheet.Cells(6+r, 2).Value2  = Format(myInputSheet.Cells(6+r, 2).Value2, "dd-mm-yyyy")

当你在源文件中有文本时,它可能会变得有点复杂。如果您不介意它保留文字而您真的只想更改.的{​​{1}},那么您可以按照以上评论中的建议使用-:< / p>

Replace

但是,如果您在源文件中有文本并且想要在目标文件中保存日期,那么您可以要求Excel尝试使用myOutputSheet.Cells(6+r, 2).Value = Replace(myInputSheet.Cells(6+r, 2).Value, ".", "-") 进行转换,并提前检查单元格的内容是否可以可能被视为CDate的日期:

IsDate

您现在可能已经认识到我在上面的代码段中有时使用了myOutputSheet.Cells(6+r, 2).Value2 = Iif(IsDate(myInputSheet.Cells(6+r, 2).Value, CDate(myInputSheet.Cells(6+r, 2).Value), "no recognizable date") 和某些.Value。有关详细信息,您可能需要阅读以下内容:What is the difference between .text, .value, and .value2?

BTW:时间也存储为数字。事实上,他们被保存为一天中的一小部分。因此,数字0.5相当于半天,那将是中午12:00。同时,早上9点是0.375和18点或下午6点相当于0.75。