Giúp em lọc dữ liệu theo ngày tháng từ CSDL SQL bằng VBA
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
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
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 ạ
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.
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.
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.
www.giaiphapexcel.com/diendan/threads/gi%C3%BAp-em-l%E1%BB%8Dc-d%E1%BB%AF-li%E1%BB%87u-theo-ng%C3%A0y-th%C3%A1ng-t%E1%BB%AB-csdl-sql-b%E1%BA%B1ng-vba.103837/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học