Excel VBA将日期插入单元格会产生不正确的格式

时间:2018-02-05 01:00:17

标签: excel excel-vba vba

希望有人可以帮助我解决一个有趣的问题。使用以下Excel VBA代码更新工作表中具有日期的单元格。格式化为" DD / MM" YYYY"我的本地电脑也设置为此。

Dim SelectedDate As String
SelectedDate = "05/02/2018"
Sheets("CONTROL").Range("F36").NumberFormat = "dd/mm/yyyy"
Sheets("CONTROL").Range("F36").Value = Format(SelectedDate,"dd/mm/yyyy")

MsgBox Format(SelectedDate,"dd/mm/yyyy") ' Returns 05/02/2018 - Correct

MsgBox Sheets("CONTROL").Range("F36").Value ' Returns 02/05/2018 - Incorrect

任何帮助都会得到很大的帮助。

3 个答案:

答案 0 :(得分:1)

很容易与Excel,VBA和日期格式混淆。在VBA和/或工作表中使用字符串而不是日期时更容易。如果将输出格式化为明确的日期,将更容易弄清楚发生了什么:例如:dd-mmm-yyyy。

  • 您正在输入F36中的字符串。 VBA是US Centric,认为字符串代表May 2, 2018
  • 要使字符串的解释与Windows短日期格式相同,您可以使用日期值功能,并将您的条目视为日期,而不是字符串。

所以代码的一个替代方案是:

Sub marine()
Dim SelectedDate As Date
SelectedDate = DateValue("05/02/2018") 'will convert to 5-Feb-2018
Sheets("CONTROL").Range("F36").NumberFormat = "dd/mm/yyyy"
Sheets("CONTROL").Range("F36").Value = SelectedDate

MsgBox Format(SelectedDate, "dd/mm/yyyy") 

MsgBox format(Sheets("CONTROL").Range("F36").Value,"dd/mm/yyyy")
End Sub

答案 1 :(得分:0)

Value属性只是定义了底层值的可视化表示方式,但它并没有改变底层值本身。而不是打印Text属性,使用MsgBox Sheets("CONTROL").Range("F36").Text (其中包含基础值的格式化表示):

Value

或者,如果您想坚持单元格的MsgBox Format(Sheets("CONTROL").Range("F36").Value, "dd/mm/yyyy") 属性,则必须按如下方式打印它:

σ rownum() > 0 and rownum() ≤ 1 τ price desc π price Serves

答案 2 :(得分:0)

步骤1:如果要在单元格中获取日期值,请选择NumberFormat属性的日期格式。

Sheets("CONTROL").Range("F36").NumberFormat = "dd/mm/yyyy"

步骤2:为避免将日期视为美国日期,请使用.FormulaLocal而不是.Value

Sheets("CONTROL").Range("F36").FormulaLocal = SelectedDate