无法在VBA,Excel 2012中正确格式化日期

时间:2012-07-02 14:17:12

标签: excel vba date excel-2010

我正在使用Excel 2010中的VBA脚本,该脚本根据事件的日期从MySQL数据库中获取某些事件。数据库中的日期存储在“yyyy-mm-dd hh:mm:ss”中。我的用户将使用从即日开始的范围来过滤他们感兴趣的事件。为了使它们更容易,我使用两个日历控件(mscal.ocx)作为范围 - Calendar1表示from,Calendar2表示to。我编写了两个简单的子程序,以确保每次点击日历都会自动更新我从中获取查询字符串数据的单元格,如下所示:

Private Sub Calendar1_Click()

Dim date1, datetime1, time1 As Date

Cells(29, 10) = CDbl(Calendar1.Value)
Cells(29, 10).NumberFormat = "yyyy-mm-dd"
Cells(30, 10).NumberFormat = "hh:mm:ss"
Cells(31, 11).NumberFormat = "yyyy-mm-dd hh:mm:ss"

date1 = Cells(29, 10)
time1 = Cells(30, 10)
datetime1 = date1 & " " & time1
Cells(31, 10) = datetime1


Cells(29, 10).Select

End Sub

Private Sub Calendar2_Click()

Dim date2, datetime2, time2 As Date

Cells(29, 11) = CDbl(Calendar2.Value)
Cells(29, 11).NumberFormat = "yyyy-mm-dd"
Cells(30, 11).NumberFormat = "hh:mm:ss"
Cells(31, 11).NumberFormat = "yyyy-mm-dd hh:mm:ss"

date2 = Cells(29, 11)
time2 = Cells(30, 11)
datetime2 = date2 & " " & time2
Cells(31, 11) = datetime2


Cells(29, 11).Select
End Sub

而且,它几乎完成了我想要它做的事情,这改变了日历控件给出的格式,即dd / mm / yyyy到yyyy-mm-dd。是的,差不多,因为它只在日期值介于1到12之间有效,然后我的日期时间单元格正确显示为“yyyy-mm-dd hh:mm:ss”。对于13到31天的值,我的日期时间单元格没有格式化,而是显示为“dd / mm / yyyy hh:mm:ss”。

现在,值得注意的是,Cell 29,10和29,11始终具有正确的格式(yyyy-mm-dd),无论日期如何,问题在于细胞31,11和31,10。

现在,当我双击单元格,让光标在其中闪烁并按Enter键时,格式化将被执行并且格式将更改为正确的格式(即使是13到31之间的日期值)。然而,这样做的目的是尽可能地自动化所有内容,因此这不是真正的解决方案。如果需要,我可以附加文件,因为我确实认为它适用于某些值而不适用于其他值听起来有点荒谬。

请帮忙!

编辑::

好的,再次感谢您的快速回答,我检查了您的解决方案,并且我有点回到开始。使用

Private Sub CommandButton1_Click()

Dim date1, date2, datetime1, datetime2, time1, time2, time3 As Date

date1 = Cells(29, 10)
time1 = Cells(30, 10)
datetime1 = Format(date1, "dd/mm/yyyy") & " " & Format(time1, "hh:mm:ss")
Cells(31, 10) = datetime1

End Sub

效果很好,但仅当日期值为1到12时才有效,例如,对于单元格值

日期

  

2012-09-12

时间

  

15:00:00

答案是我想要的,这是

日期时间

  

2012-09-12 15:00:00

但是,只要我将日期值设置为高于12,即13到31,它就会停止正常工作(是的,我知道这听起来有多荒谬),而我得到的结果是:

日期时间

  

13/09/2012 15:00:00

任何建议都非常感谢......

5 个答案:

答案 0 :(得分:2)

使用Format()函数

Format("17/07/2012", "yyyy-mm-dd")

结果为2012-07-17

答案 1 :(得分:1)

我知道我已经太迟了,但我认为你需要区分月份(MM)和分钟(mm)......所以试试这个......

Format(yourDateObj, "yyyy/MM/dd hh:mm:ss");

希望这有助于......:)

答案 2 :(得分:0)

Private Sub testje()

Dim date1, date2, datetime1, datetime2, time1, time2 As Date

date1 = Cells(1, 1)
time1 = Cells(1, 2)
datetime1 = Format(date1, "dd/mm/yyyy") & " " & Format(time1, "hh:mm:ss")

Cells(2, 1) = datetime1

End Sub

似乎工作。 .. 否则,将Excel中的范围格式设置为自定义,定义为“dd / mm / yyyy uu:mm:ss”。

答案 3 :(得分:0)

尝试格式化(“mm / dd / yyyy”)。

答案 4 :(得分:0)

如果要将日期时间作为查询的一部分传递给SQL,则在VBA内不要将其作为日期变暗。 而是尝试Dim as String。

然后,您应该可以使用此处建议的功能将字符串格式化为所需的格式。

所以例如:

Dim date1 As String
date1 = Cells(29, 10)
date1 = Format(Date1, "yyyy-MM-dd hh:mm:ss")

debug.print date1

我认为这对你来说已经不再适用了(一年多前发布过!)但是我遇到了同样的问题,这对我有用,也许会帮助别人。