Excel 使用“替换”或“替换”更改日期格式

Excel 使用“替换”或“替换”更改日期格式,excel,vba,Excel,Vba,我从一个excel文件中读取数据,然后将数据写入另一个excel文件 我的问题是源的日期格式为dd.mm.yyyy,目标的日期格式必须为dd-mm-yyyy 因此,我搜索了某某并找到了这个答案,这表明我可以使用替换 所以我尝试了以下代码: For r = 1 To 10 myOutputSheet.Cells(6+r, 1).Value = myInputSheet.Cells(r, 1).Value 'Date myOutputSheet.Cells(6+r, 1).Val

我从一个excel文件中读取数据,然后将数据写入另一个excel文件

我的问题是源的日期格式为
dd.mm.yyyy
,目标的日期格式必须为
dd-mm-yyyy

因此,我搜索了某某并找到了这个答案,这表明我可以使用
替换

所以我尝试了以下代码:

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'
Microsoft VBScript compilation error: Cannot use parentheses when calling a Sub
Microsoft VBScript runtime error: Type mismatch: '[string: "-"]'
如何将
更改为
-

更新

我也试过这个:

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: 'substitute'
Microsoft VBScript compilation error: Cannot use parentheses when calling a Sub
Microsoft VBScript runtime error: Type mismatch: '[string: "-"]'
因此,我尝试:

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: 'substitute'
Microsoft VBScript compilation error: Cannot use parentheses when calling a Sub
Microsoft VBScript runtime error: Type mismatch: '[string: "-"]'

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

因此,如果显示为42000,则该数字可能是一个日期。这是1899年12月31日之后的第42000天。那将是2014年12月27日

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

让我们来看两个小例子:

(1) 在单元格中输入以下内容:
11.12.2013
。Excel可能会将其识别为日期,并将其转换为数字41619。然而,你会看到一个日期。这是因为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).Value  = Replace(myInputSheet.Cells(6+r, 2).Value, ".", "-")
但是,如果源文件中有文本,并且希望在目标文件中保存日期,则可以要求Excel尝试使用
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
,有时使用
.Value2
。有关这方面的更多信息,您可能需要阅读以下内容:


顺便说一句:时间也存储为数字。事实上,它们被保存为一天的分数。所以,数字0.5等于半天,也就是中午12点。同时,上午09:00为0.375,18:00或下午6点等于0.75。

日期是实际日期,还是字符串看起来像日期?(您确实了解其中的区别,不是吗?)
.Value2
参数给了您什么?@vacip我对VBA很陌生,但我认为它们只是字符串。不要这样想。:)检查value2属性。如果它返回一个数字(例如42498),那么它们就是实际日期。或者尝试在Excel中手动将其格式化为其他日期格式。如果什么都没发生,它们就是字符串,如果它们有反应,它们就是日期。使用“替换”而不是“替换”,它应该可以工作。同时,谷歌“date excel”并阅读和理解。按照@Ralph巧妙的解释,完成date-number-string-value-value2问题后,请记住1)如果要使用
Substitute
excel函数,则必须键入
WorksheetFunction.Substitute(…)
2)
Replace
VBA函数返回一个字符串,以便像
myOutputSheet.Cells(6+r,1)那样使用它。Value=Replace(myInputSheet.Cells(r,1),“,”,“-”
感谢您的详细解释。我将尝试你的不同建议,以了解它们是如何工作的。到目前为止+1-谢谢。哇。解释得很好。