2

我正在使用 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”。

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

现在,当我双击单元格时,光标在其中闪烁并按回车键,执行格式并将格式更改为正确的格式(即使对于 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

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

4

5 回答 5

3

使用Format()功能

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

结果是2012-07-17

于 2012-07-02T16:04:12.710 回答
3

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

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

希望这可以帮助..:)

于 2012-11-27T06:36:19.013 回答
1
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”。

于 2012-07-05T11:56:22.620 回答
1

请改用格式(“mm/dd/yyyy”)。

于 2012-07-06T12:44:01.713 回答
1

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

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

例如:

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

debug.print date1

我认为这对您不再有用(一年多前发布!)但我刚刚遇到了同样的问题,这对我有用,也许它会帮助其他人。

于 2013-12-20T11:01:29.363 回答