Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 日期变量未正确插入值_Vba_Ms Access_Excel_Ms Project - Fatal编程技术网

Vba 日期变量未正确插入值

Vba 日期变量未正确插入值,vba,ms-access,excel,ms-project,Vba,Ms Access,Excel,Ms Project,我有一个宏,可以打开MS Project文件并将内容本身复制到Access表中。我是通过Excel创建的,因为之后我需要进行一些查询,并将结果复制到一些单元格中 下面的代码创建或删除表: Dim dbX As DAO.Database If Err.Number = 0 Then dbX.Execute ("DROP TABLE " & dbName & ";") End If dbX.Execute ("CREATE TABLE " & dbName &am

我有一个宏,可以打开MS Project文件并将内容本身复制到Access表中。我是通过Excel创建的,因为之后我需要进行一些查询,并将结果复制到一些单元格中

下面的代码创建或删除表:

Dim dbX As DAO.Database

If Err.Number = 0 Then
    dbX.Execute ("DROP TABLE " & dbName & ";")
End If

dbX.Execute ("CREATE TABLE " & dbName & " ([ID] INTEGER, [TaskID] INTEGER, [Milestone] TEXT(3), [TaskName] TEXT(255), " & _
        "[pComplete] TEXT(10), [Start] DATE, [Finish] DATE, [BaselineStart] DATE, [BaselineFinish] DATE, " & _
        "[ActualStart] DATE, [ActualFinish] DATE);")
Err.Clear
这将使用项目字段填充表格:

dBquery = "INSERT INTO " & tName & "(ID, TaskID, Milestone, TaskName, pComplete, Start, Finish, BaselineStart, BaselineFinish, " & _
            "ActualStart, ActualFinish)" & _
            " VALUES (" & t.ID & ", " & t.UniqueID & ", '" & t.GetField(pjTaskMilestone) & "', '" & t.Name & "', '" & t.GetField(pjTaskPercentComplete) & _
            "', " & RetrieveDate(t.Start) & ", " & RetrieveDate(t.Finish) & ", " & RetrieveDate(t.BaselineStart) & ", " & _
            RetrieveDate(t.BaselineFinish) & ", " & RetrieveDate(t.ActualStart) & ", " & RetrieveDate(t.ActualFinish) & ");"

    dB.Execute dBquery
    RefreshDatabaseWindow
此函数用于检索日期字段:

Function RetrieveDate(D As Variant) As Variant
    If D = "NA" Then
        RetrieveDate = "NULL"
    Else
        RetrieveDate = "#" & D & "#"
    End If
End Function
我遇到的问题是,当代码发现不明确的日期时,使用美国格式,因此当我尝试运行查询时,结果是不正确的。 例如,这里我有一个任务及其日期和所有内容:

无论我使用何种日期格式,它都会旋转日期,或者只是不将日期插入数据库。 例如,在此表中,日期以十进制格式插入。数据库中的相同任务是:

在上图中,我们可以看到更少的字段,因为我刚刚获取了所需的字段。 因此,例如,如果我在同一任务中查询以“dd/mm/yyyy”格式检索日期,我会得到:

SELECT FORMAT(Start, "dd/mm/yyyy"), FORMAT(Finish, "dd/mm/yyyy")
FROM ow18_072014
WHERE TaskID = 202;
我尝试将格式转换为yyyy/mm/dd,但日期未粘贴到表中。
我尝试过的另一个转换是从Project更改日期格式,但现在Access会毫无意义地更改某些日期:在MS Project中等于2014年6月20日的日期在MS Access中变为2013年11月15日。

您没有给我们太多信息,将来,如果您希望人们真正有机会帮助您,你必须在你的问题上付出更多的努力:给我们一些你尝试过的代码,一些数据示例,等等

无论如何,问题在于默认情况下,Access将文字日期解释为mm/dd/yyyy,除非它是明确的,如2014年12月25日

有两种方法可以解决这个问题:如果您传递了一个临时的访问日期,请改用yyyy/mm/dd ISO格式,因为它是明确的,并且可以在每个语言环境中使用

或者,将日期转换为十进制值,并将其传递到Access日期字段,例如CDecmyDate,将传递类似于41851.3465625的内容到Access,并且它将工作。

任务对象的GetField方法返回字符串值。对于日期字段,它以用户选择的格式或应用程序对象的DefaultDateFormat属性设置的格式返回值

最简单的解决方案是使用Task对象的显式属性,而不是GetField方法

将SQL语句修改为以下内容:

dBquery = "INSERT INTO " & t.Name & "(ID, TaskID, Milestone, TaskName, pComplete, Start, Finish, BaselineStart, BaselineFinish, " & _
            "ActualStart, ActualFinish)" & _
            " VALUES (" & t.ID & ", " & t.UniqueID & ", '" & t.Milestone & "', '" & t.Name & "', '" & t.PercentComplete & _
            "', " & RetrieveDate(t.Start) & ", " & RetrieveDate(t.Finish) & ", " & RetrieveDate(t.BaselineStart) & ", " & _
            RetrieveDate(t.BaselineFinish) & ", " & RetrieveDate(t.ActualStart) & ", " & RetrieveDate(t.ActualFinish) & ");"

在这里发布您的代码,这样我们就可以显示您的错误。我确信,在没有可能解释的日期(如1998年12月24日)的情况下,如1998年12月24日,它会按照您的要求工作,而对于其他日期(如1998年11月10日),它会选择默认值,我认为这可能是美国模式mm/dd/aa,也就是1998年10月11日。我也这么认为,但最奇怪的是,这种模式并不总是如此。它有时会旋转日期,但这不是代码错误,因为宏只是打开MS Project并将值本身插入表中。我想这是某种日期格式的问题,但尽管我已经多次修改了日期格式以避免这个错误,但我完全无法正确插入日期。无论如何,我可以粘贴代码,如果你想日期和数字是踩在喷气式SQL作为美国格式。通常这意味着您必须像这样使用smth:sql=sql&formatDateTimeValue,mm\/dd\/yyywell,但实际上我不认为问题与访问配置有关,所以我没有附加任何。我将编辑这篇文章,向您展示我面临的问题。我想知道的另一个问题是:如果我将日期存储为浮点数,我是否能够使用月份或现在等函数进行查询?也许我不清楚,您只使用十进制值作为在SQL查询中使用日期的方式,而不必使用日期文字。。。。在表中存储日期的字段仍必须定义为日期。这只是一个技巧,可以避免将日期格式定义为字符串文字的问题。但无论如何,我已经实现了按您所说的存储日期值,并且它继续以美式格式存储它们,但使用其十进制值。我不知道我自己是否足够清楚……我认为你们需要在你们的问题中创建具体的数据示例。问题或你的评论中没有任何东西可以解释你的结果。它仍然没有正确地确定日期。。。我已经用你的代码运行了宏,日期也被旋转了。我不知道如何修复它;尝试不同的格式。例如:RetrieveDate=&FormatD,yyyy/mm/dd&。