Nhờ mọi người giúp em code lây dữ liệu từ sql server về excel theo điều kiện

Liên hệ QC

khanhhero

Thành viên hoạt động
Tham gia
28/7/11
Bài viết
144
Được thích
36
PHP:
Sub cnn_data()
ActiveSheet.Range(Range("a5"), Range("a5").End(xlDown)).EntireRow.ClearContents

Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strcnn As String
Dim sqlstr As String
strcnn = "Driver={SQL Server}; Server=server1; database=BO2015; UID=sa; PWD=123"
cnn.Open strcnn
sqlstr = "select * from GT9000 where tranmonth = '1' and tranyear = '2016' "
rs.Open sqlstr, strcnn
ActiveSheet.Range("A5").CopyFromRecordset rs
rs.Close
cnn.Close
Set cnn = Nothing
End Sub

Như tiêu đề, công việc em thường sử dụng nhiều table từ sql để lấy dữ liệu về excel để xử lý, em có thể dùng query excel, nhưng nếu nhiều sheet thì phải refresh nhiều lần hơi tốn thời gian nên e muốn viết code cho nhanh hơn. Như ở phần code chọn điều kiện WHERE tranmonth = ? and tranyear = ?, em muốn thay bằng giá trị định sẵn: range("A1") = tranmonth, range("a2") = tranyear thì phải viết code như thế nào vậy mọi người?

Cám ơn mọi người nhiều!
 
Lần chỉnh sửa cuối:
sqlstr = "select * from GT9000 where tranmonth = 'theMonth' and tranyear = 'theYear' "
sqlstr = Replace(Replace(sqlstr, "theMonth", range("A1").Value), "theYear", range("A2").Value)

 
sqlstr = "select * from GT9000 where tranmonth = 'theMonth' and tranyear = 'theYear' "
sqlstr = Replace(Replace(sqlstr, "theMonth", range("A1").Value), "theYear", range("A2").Value)

Em cảm ơn bác VetMini rất nhiều, code chạy rất ok ạ. Bác cho em hỏi thêm một tí xíu nữa là như câu lệnh trên là chỉ dùng được với định dạng text, nếu là định dạng số hoặc ngày tháng thì mình sử dụng câu lệnh thay thế nào ạ?
 
Gặp đinh dạng số (giả sử 2 trường tranmonth và tranyear là số) thì bỏ các dấu nháy đơn ra khỏi câu này
sqlstr = "select * from GT9000 where tranmonth = 'theMonth' and tranyear = 'theYear' "

Vậy là:
sqlstr = "select * from GT9000 where tranmonth = theMonth and tranyear = theYear "
sqlstr = Replace(Replace(sqlstr, "theMonth", range("A1").Value), "theYear", range("A2").Value)
 
Gặp đinh dạng số (giả sử 2 trường tranmonth và tranyear là số) thì bỏ các dấu nháy đơn ra khỏi câu này
sqlstr = "select * from GT9000 where tranmonth = 'theMonth' and tranyear = 'theYear' "

Vậy là:
sqlstr = "select * from GT9000 where tranmonth = theMonth and tranyear = theYear "
sqlstr = Replace(Replace(sqlstr, "theMonth", range("A1").Value), "theYear", range("A2").Value)

anh ơi nếu chỉ có 1 cột mang kiểu Date thì truy vấn sao để lấy hết các ngày trong tháng theMonth và năm theYear vậy ? %#^#$%#^#$
 
Nếu vậy bạn có thể viết câu lệnh "where day_column_name = between firstday and endday"

Bạn gõ dư dấu =

Vả lại, cách trên không ổn. Làm sao bạn biết endday của tháng là ngày nào? 30, 31, 28 hay 29

Mỗi phiên bản của SQL có cahcs sử sự Date khác nhau. Trong T-SQL (phiên bản của SQL Server) dùng hàm YEAR, MONTH; hoặc hàm DATEPART

sqlstr = "select * from GT9000 where MONTH(tranDate) = theMonth and YEAR(tranDate) = theYear "
 
A cho em hỏi thử đoạn code dưới của em bị sai chỗ nào vậy anh, em thấy báo sai chỗ FROM mà ko biết cách viết như thế nào cho đúng nữa, e tay ngang nên toàn đắp chỗ này chút, chỗ kia chút ko ah hic hic

PHP:
sqlstr = "SELECT WT2007.InventoryID, WT2007.UnitID, WT2007.ConvertedAmount," & _
 "WT2007.Notes , WT2007.TranMonth, WT2007.TranYear, WT2007.DebitAccountID, WT2007.CreditAccountID," & _
  "WT2007.WareHouseID01, IV1322.InventoryName, WT2006.VoucherTypeID, WT2006.VoucherNo, WT2007.Ana01ID," & _
  "WT2006.WareHouseID2 * FROM DessoleNT_BO2015.dbo.IV1322 IV1322, DessoleNT_BO2015.dbo.WT2006 WT2006," & _
  "DessoleNT_BO2015.dbo.WT2007 WT2007 WHERE IV1322.InventoryID = WT2007.InventoryID AND WT2007.VoucherID = WT2006.VoucherID "
 
Tên bảng hoặc tên trường nếu có dấu cách thì nên bao quanh chúng bàng cặp dấu móc []
 
A cho em hỏi thử đoạn code dưới của em bị sai chỗ nào vậy anh, em thấy báo sai chỗ FROM mà ko biết cách viết như thế nào cho đúng nữa, e tay ngang nên toàn đắp chỗ này chút, chỗ kia chút ko ah hic hic

PHP:
sqlstr = "SELECT WT2007.InventoryID, WT2007.UnitID, WT2007.ConvertedAmount," & _
 "WT2007.Notes , WT2007.TranMonth, WT2007.TranYear, WT2007.DebitAccountID, WT2007.CreditAccountID," & _
  "WT2007.WareHouseID01, IV1322.InventoryName, WT2006.VoucherTypeID, WT2006.VoucherNo, WT2007.Ana01ID," & _
  "WT2006.WareHouseID2 * FROM DessoleNT_BO2015.dbo.IV1322 IV1322, DessoleNT_BO2015.dbo.WT2006 WT2006," & _
  "DessoleNT_BO2015.dbo.WT2007 WT2007 WHERE IV1322.InventoryID = WT2007.InventoryID AND WT2007.VoucherID = WT2006.VoucherID "


có tên trường tùm lum rồi còn "*" gì nữa ta ?
 
Hú hồn, ai đó bị số Tây chứ hong phải mình.
 
Mọi người cho em hỏi nếu em viết "where voucherdate between 'first_day' and 'end_day'" thì làm cách nào để thay thế "first_day" và "end_day" bằng sheet1.range("A1") và sheet2.range("A2") vậy, nếu dùng câu lệnh replace của bác VetMini thì nó sẽ ko hiểu vì nếu viết sheet1.range("A1").value nó sẽ ko hiểu đó là ngày mà nó hiểu là number, hic hic.
 
Hú hồn rồi, dại gì dây dưa nữa.
 
Web KT

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

Back
Top Bottom