Giúp em lọc dữ liệu theo ngày tháng từ CSDL SQL bằng VBA

Liên hệ QC

hoangson8768

Thành viên mới
Tham gia
20/6/10
Bài viết
48
Được thích
1
Em có macro lấy dữ liệu từ CSDL, nhưng em không biết làm thế nào để khi Click vào 1 Button thì nhập ngày tháng vào để truy suất dữ liệu từ code SQL đó. Ví dụ em đang để " Where CONVERT(VARCHAR(10),T1.NGAY_DK,101) BETWEEN '04/22/2015' AND '04/22/2015'" để lấy dữ liệu ngày 22/04. Các thầy giúp em với
 

File đính kèm

Em có macro lấy dữ liệu từ CSDL, nhưng em không biết làm thế nào để khi Click vào 1 Button thì nhập ngày tháng vào để truy suất dữ liệu từ code SQL đó. Ví dụ em đang để " Where CONVERT(VARCHAR(10),T1.NGAY_DK,101) BETWEEN '04/22/2015' AND '04/22/2015'" để lấy dữ liệu ngày 22/04. Các thầy giúp em với
PHP:
Sub Recordset2Range()
    Dim cnn As Connection
    Dim rst As Recordset
    Dim sSQL As String
    Dim rCount&
        
    Set cnn = GetConnXLS(ThisWorkbook.FullName)
    
    On Error GoTo lbEndSub
    
    sSQL = "SELECT * FROM KHO WHERE Ngay =#" & Range("C2").Value & "#  "
    Set rst = New Recordset
    rst.Open sSQL, cnn
    Range("A4:T65536").ClearContents
    rCount = Range("A4").CopyFromRecordset(rst)
    
lbEndSub:
    If rst.State = adStateOpen Then
        rst.Close
    End If
    Set rst = Nothing
    If cnn.State = adStateOpen Then
        cnn.Close
    End If
    Set cnn = Nothing
    If Err.Number <> 0 Then
        MsgBox Err.Number & " - " & Err.Description, vbCritical
    End If
End Sub
Function GetConnXLS(ByVal cFileName As String, _
                    Optional ByVal InformErrMSG As Boolean = False) As ADODB.Connection


    On Error GoTo LOI:


    'Open the ADO connection to the Excel workbook
    Dim oConn As ADODB.Connection
    Dim Ext As String, ConnStr As String


    Set oConn = New ADODB.Connection
    Ext = GetFileExt(cFileName)
    
    If Len(Ext) = 3 And Left(Ext, 2) = "xl" Then
        ConnStr = "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                 cFileName & _
                ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
    Else
        ConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
                 cFileName & _
                ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";" 'Co the bo ;IMEX=1
    End If
    
    'Cach 1
    'oConn.Open "Provider=MSDASQL.1;Persist Security Info=true;" & _
     "Extended Properties=""DSN=Excel Files;DBQ=" & cFileName & ";DefaultDir=" & _
     GetPathFile(cFileName) & _
     ";DriverId=790;FIL=excel 8.0;HDR=YES;MaxBufferSize=2048;PageTimeout=5;"""


    'Cach 2: Khong dung duoc so sanh LIKE, SUM(IIF(...)
    'oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Data Source=" & cFileName & ";" & _
     "Extended Properties=""Excel 8.0;HDR=NO;"""
    'Cach 3 khong can qua DSN
    'ConnStr = "ODBC;DBQ=" & cFileName & ";DefaultDir=" & GetPathFile(cFileName) & ";Driver={Microsoft Excel Driver (*.xls)};DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;ReadOnly=0;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"
    oConn.Open ConnStr
    Set GetConnXLS = oConn
LOI:
    If Err.Number <> 0 Then
        Set oConn = Nothing
        If InformErrMSG Then
            MsgBox "GetConnXLS" & ": " & Err.Number & " - " & Err.Description, vbCritical
        End If
    End If
End Function
Function GetFileExt(ByVal cFile As String) As String
        '<EhHeader>
        On Error GoTo GetNameFile_Err
        '</EhHeader>
        Dim p As Integer
        p = InStrRev(cFile, ".")
        If p > 0 Then
            GetFileExt = Mid(cFile, p + 1, Len(cFile) - p)
        End If
        '<EhFooter>
        Exit Function


GetNameFile_Err:
        MsgBox Err.Description & vbCrLf & _
               "in GetFileExt" & _
               "at line " & Erl, _
               vbExclamation + vbOKOnly, "Application Error"
        '</EhFooter>
End Function
Bạn chép code trên vào
Ở C2 của sheet2 bạn đánh ngày 22/04/2015 rồi chạy thử nhé, chúc bạn thành công
 

File đính kèm

Lần chỉnh sửa cuối:
Em có macro lấy dữ liệu từ CSDL, nhưng em không biết làm thế nào để khi Click vào 1 Button thì nhập ngày tháng vào để truy suất dữ liệu từ code SQL đó. Ví dụ em đang để " Where CONVERT(VARCHAR(10),T1.NGAY_DK,101) BETWEEN '04/22/2015' AND '04/22/2015'" để lấy dữ liệu ngày 22/04. Các thầy giúp em với
Dùng hàm convert để chuyển đổi giá trị số sang dạng ngày rồi tiến hành lọc.
Lưu ý lọc ngày thì phải định dạng chuổi điều kiện ngày đúng chuẩn mới ra được.
 
Em đánh ngày khác thì không ra kết quả ,chỉ có ngày 22/04 là ra kết quả ,lỗi ở đâu vậy ạ
 
Ko biết bạn định dạng thế nào, máy mình định dạng dd/mm/yyyy. Ở C2 đánh 22 or 23/04/2015 ra hết, ko thấy vấn đề gì . bạn thử lại xem sao

Lưu ý là định dạng lọc ngày trong SQl Server không giống như trong Excel, có thể ra kết quả không chính xác.
 
Em có macro lấy dữ liệu từ CSDL, nhưng em không biết làm thế nào để khi Click vào 1 Button thì nhập ngày tháng vào để truy suất dữ liệu từ code SQL đó. Ví dụ em đang để " Where CONVERT(VARCHAR(10),T1.NGAY_DK,101) BETWEEN '04/22/2015' AND '04/22/2015'" để lấy dữ liệu ngày 22/04. Các thầy giúp em với

Trong code của bạn có 2 điều mà không bao giờ người ta làm trên SQL Server:

1. BETWEEN 2 trị giống nhau. Nếu between thì trị 1 phải nhỏ hơn trị 2. Khi 2 trị giống nhau thì dùng = quách cho gọn. Tuy nhiên cái này nó không sai nhưng trông rất buồn cười

2. So sánh ngày mà dùng dạng MM/dd/yyyy rất dễ bị sai. Luôn luôn người ta dùng dạng yyyyMMdd, tức là dùng covert dạng 112
CONVERT(VARCHAR(10),T1.NGAY_DK,112) = '20150422'

Nếu ngày 22/4 mà được trong khi ngày khác không được là do một trong 2 lý do trên.
 
Trong code của bạn có 2 điều mà không bao giờ người ta làm trên SQL Server:

1. BETWEEN 2 trị giống nhau. Nếu between thì trị 1 phải nhỏ hơn trị 2. Khi 2 trị giống nhau thì dùng = quách cho gọn. Tuy nhiên cái này nó không sai nhưng trông rất buồn cười

2. So sánh ngày mà dùng dạng MM/dd/yyyy rất dễ bị sai. Luôn luôn người ta dùng dạng yyyyMMdd, tức là dùng covert dạng 112
CONVERT(VARCHAR(10),T1.NGAY_DK,112) = '20150422'

Nếu ngày 22/4 mà được trong khi ngày khác không được là do một trong 2 lý do trên.

vấn đề em phải để BETWEEN '04/22/2015' AND '04/22/2015'" là để em lọc từ ngày x đến ngày y chứ không phải em lọc 1 ngày :)
để em kiểm tra lại cái convert rồi báo cáo kết quả cho các bác :)
 
vấn đề em phải để BETWEEN '04/22/2015' AND '04/22/2015'" là để em lọc từ ngày x đến ngày y chứ không phải em lọc 1 ngày :)
để em kiểm tra lại cái convert rồi báo cáo kết quả cho các bác :)

Nếu dùng để lọc từ này x đến ngày y thì cách lọc này SAI
Muốn so sánh ngày theo dạng chuỗi thì phải đặt năm trước tháng.
 
Web KT

Bài viết mới nhất

Back
Top Bottom