Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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和SQL两个雇用日期之间的员工_Sql_Excel_Ms Access_Vba - Fatal编程技术网

提取VBA和SQL两个雇用日期之间的员工

提取VBA和SQL两个雇用日期之间的员工,sql,excel,ms-access,vba,Sql,Excel,Ms Access,Vba,我设计了一个宏,可以从工作簿数据库中提取两个日期之间雇佣的所有员工 不幸的是,当我运行查询时,我得到了一个错误消息 错误: 条件表达式中的数据类型不匹配 我不知道如何解决这个问题 我的区域设置: 短日期:年月日 长日期:dddd,d.MMMM.yyyy 每周第一天:星期一 代码如下: Public Sub HIREDATE() Application.ScreenUpdating = False Dim cnStr As String Dim rs As ADODB.Recordset Dim

我设计了一个宏,可以从工作簿数据库中提取两个日期之间雇佣的所有员工

不幸的是,当我运行查询时,我得到了一个错误消息

错误: 条件表达式中的数据类型不匹配

我不知道如何解决这个问题

我的区域设置:

短日期:年月日 长日期:dddd,d.MMMM.yyyy 每周第一天:星期一

代码如下:

Public Sub HIREDATE()
Application.ScreenUpdating = False

Dim cnStr As String
Dim rs As ADODB.Recordset
Dim query As String
Dim fileName As String
Dim pom1 As String
Dim x As String, w, e, blad As String, opis As String
Set w = Application.FileDialog(msoFileDialogFilePicker)
With w
.AllowMultiSelect = False

    If .Show = -1 Then
    fileName = w.SelectedItems(1)
    Else
    Exit Sub
    End If

End With

    cnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source=" & fileName & ";" & _
               "Extended Properties=Excel 12.0"

On Error GoTo Anuluj
x = InputBox("Wprowadz dwie daty od do oddzielając je przecinkiem -- Przykład 01.01.2015,01.05.2015")



       strg = ""

       k = Split(x, ",")
                e = Application.CountA(k)
        For m = LBound(k) To UBound(k)

            If e = 1 Then
            strg = strg & " [DEU1$].[Last Start Date] = '" & k(m) & "';"
            Exit For
            ElseIf e = 2 And e Mod 2 = 0 Then
            strg = " [DEU1$].[Last Start Date] BETWEEN '" & CDate(k(m)) & "' AND '" & CDate(k(m + 1)) & "';"
            Exit For
            End If

        Next m

On Error GoTo opiszblad

    Set rs = New ADODB.Recordset

query = "SELECT [Emplid], [First Name]+ ' ' +[Last Name] From [DEU1$] WHERE" & strg

    rs.Open query, cnStr, adOpenUnspecified, adLockUnspecified

    Cells.Clear

Dim cell As Range, i As Long

    With Range("A3").CurrentRegion
    .Select
        For i = 0 To rs.Fields.Count - 1
            .Cells(1, i + 1).Value = rs.Fields(i).Name
        Next i


    Range("A4").CopyFromRecordset rs
    .Cells.Select

    .EntireColumn.AutoFit
    End With

    rs.Close
Application.ScreenUpdating = True

Exit Sub

Anuluj:

Exit Sub

opiszblad:
e = Err.Number
blad = Err.Source
opis = Err.Description
opisbledu = MsgBox(e & " " & blad & " " & opis, vbInformation, "Błąd")
Exit Sub
End Sub

您需要为日期和验证用户输入正确格式化的字符串表达式:

If e = 1 And IsDate(k(m)) Then
    strg = strg & " [DEU1$].[Last Start Date] = #" & Format(DateValue(k(m)), "yyyy\/mm\/dd") & "#;"
    Exit For
ElseIf e = 2 And e Mod 2 = 0 And IsDate(k(m + 1)) Then
    strg = " [DEU1$].[Last Start Date] BETWEEN #" & Format(DateValue(k(m)), "yyyy\/mm\/dd") & "# AND #" & Format(DateValue(k(m + 1)), "yyyy\/mm\/dd") & "#;"
    Exit For
End If

嗨,古斯塔夫,你说得对。我已将代码更改为:对于m=LBound(k)到UBound(k)d=CDate(k(m))dd=CDate(k(m+1)),如果e=1和IsDate(d),则strg=strg&“[DEU1$]”。[最后开始日期]=”和格式(日期值(k(m)),“yyyyy\/mm\/dd”)和“;”退出ElseIf e=2和e Mod 2=0和IsDate(d),然后退出strg[DEU1$][最后开始日期]介于#“&Format(DateValue(d),“yyyy\/mm\/dd”)和#和#“&Format(DateValue(dd),“yyyy\/mm\/dd”)和“#”之间,如果效果良好,则退出结束!好的,但是现在IsDate是没有意义的,因为IsDate(aDateValue)总是正确的。更糟糕的是,如果k(m)持有一个不可解析的字符串,代码现在将失败。由于您只能从InputBox获取文本,因此在尝试转换为日期值之前,首先应检查IsDate。