我正在从一个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: "-"]'
答案 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。