使用VBA在Access表中插入当前月份的每个日期记录

时间:2016-05-29 09:27:16

标签: vba ms-access access-vba ms-access-2010

我是VBA编程新手。我设计了一个表格,里面有一个按钮。单击此按钮后,我想在具有一个日期列的表中插入记录。虚拟记录的数量应该等于当月的天数。如果月份是2016年5月,则记录将插入日期为2016年5月1日, 2/5/2016 ....... 2016年5月31日那样。

提前致谢。

Private Sub Command0_Click()
    Dim strQuery As String
    Dim currDateTime As Date
    currDateTime = Now()
    strQuery = "INSERT INTO tbl_ShipOrders (IDate ) VALUES (" & currDateTime & " )"
    CurrentDb.Execute (strQuery)
End Sub

4 个答案:

答案 0 :(得分:2)

以下表达式将为您提供一个整数,即当月的天数:

Day(DateSerial(Year(Date()), Month(Date())+1, 0))

这是下个月的第二天,也就是当月的最后一天。如果从12月搬到1月,这个表达式仍然有效。

将其存储在变量中,例如lastDay,然后使用循环For x = 1 To lastDay执行插入。

在循环中,这个表达式

DateSerial(Year(Date()), Month(Date()), x)

将为您提供日期2016年5月5日,2016年2月5日,2016年5月31日。

插入时,您还应该使用日期分隔符#围绕日期。将其与日期yyyy-mm-dd的ISO格式相结合(这样几个月就不会被解释为几天):

VALUES (#" & Format(dtValue, "yyyy-mm-dd") & "#)"

其中dtValue是您刚使用之前的DateSerial表达式形成的日期。

答案 1 :(得分:1)

您可以创建一个包含每个可能日期数的表

[DayOfMonth]

dd
--
 1
 2
 3
...
30
31

然后只使用这样的查询为当月的每一天生成一行

SELECT DateSerial(Year(Date()), Month(Date()), dd) AS IDate
FROM DayOfMonth
WHERE Month(DateSerial(Year(Date()), Month(Date()), dd)) = Month(Date())

将其用作INSERT查询

INSERT INTO tbl_ShipOrders (IDate)
SELECT DateSerial(Year(Date()), Month(Date()), dd) AS IDate
FROM DayOfMonth
WHERE Month(DateSerial(Year(Date()), Month(Date()), dd)) = Month(Date())

答案 2 :(得分:0)

请参阅下面的代码并阅读评论:

Option Explicit

Sub Command0_Click()
Dim startDate As Date
Dim endDate As Date
Dim curDate As Date

'get first day from current date
startDate = GetFirstDayInMonth(Date)
'get last day from startDate
endDate = GetLastDayInMonth(startDate)
'loop through the dates
For curDate = startDate To endDate
    'here call the procedure to insert data
Next

End Sub

'function to return first date in the month
Function GetFirstDayInMonth(dCurDate As Date) As Date

    GetFirstDayInMonth = DateSerial(Year(dCurDate), Month(dCurDate), 1)

End Function

'return last date in the month
Function GetLastDayInMonth(dCurDate As Date) As Date

    GetLastDayInMonth = DateSerial(Year(dCurDate), Month(dCurDate) + 1, 1 - 1)

End Function

答案 3 :(得分:0)

这是一个花哨的查询,它将返回一个月的日期:

SELECT DISTINCT 
    10 * Abs([Deca].[id] Mod 10) + Abs([Uno].[id] Mod 10) AS Id, 
    DateAdd("d",[Id], DateSerial(Year(DateOfMonth), Month(DateOfMonth), 1)) AS [Date]
FROM 
    msysobjects AS Uno, 
    msysobjects AS Deca
WHERE 
    (10*Abs([Deca].[id] Mod 10) + Abs([Uno].[id] Mod 10)) < Day(DateSerial(Year(DateOfMonth), Month(DateOfMonth)+1, 0))

那就是说,我会写一个循环,使用VBA将记录添加到记录集,而不是你的慢速SQL调用。