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

438*_*427 2 excel vba

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

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

所以我搜索了SO并找到了这个答案用一个字符串替换另一个字符,这表明我可以使用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
Run Code Online (Sandbox Code Playgroud)

它给出了错误:

Microsoft VBScript runtime error: Type mismatch: 'substitute'
Run Code Online (Sandbox Code Playgroud)

我如何更改.-

更新

我也尝试过这个:

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
Run Code Online (Sandbox Code Playgroud)

但是这给出了错误:

Microsoft VBScript compilation error: Cannot use parentheses when calling a Sub
Run Code Online (Sandbox Code Playgroud)

因此我试过:

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
Run Code Online (Sandbox Code Playgroud)

但是这给出了错误:

Microsoft VBScript runtime error: Type mismatch: '[string: "-"]'
Run Code Online (Sandbox Code Playgroud)

Ral*_*lph 8

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

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

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

让所有人感到悲伤让我们看看两个小例子:

(1)进入到细胞中执行以下操作:11.12.2013.有可能Excel会将其识别为日期并将其转换为数字41,619.然而,你会看到约会.这是因为Excel自动将该单元格的格式更改GeneralDate.但是如果你改变那个单元格的格式,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"
Run Code Online (Sandbox Code Playgroud)

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

myOutputSheet.Cells(6+r, 2).Value2  = Format(myInputSheet.Cells(6+r, 2).Value2, "dd-mm-yyyy")
Run Code Online (Sandbox Code Playgroud)

当你在源文件中有文本时,它可能会变得有点复杂.如果你不介意它保留文本而你真的只想更改.for a -那么你可以使用Replace上面评论中的建议:

myOutputSheet.Cells(6+r, 2).Value  = Replace(myInputSheet.Cells(6+r, 2).Value, ".", "-")
Run Code Online (Sandbox Code Playgroud)

但是,如果您在源文件中有文本并且想要在目标文件中保存日期,那么您可以要求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")
Run Code Online (Sandbox Code Playgroud)

你可能现在,我有时用已经认识.Value和somethimes .Value2在上面的代码片断.有关这方面的更多信息,您可能需要阅读以下内容:.text,.value和.value2之间的区别是什么?

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