Lấy giữ liệu từ sheet đang đóng bằng code Ado (1 người xem)

  • Thread starter Thread starter lhthai
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

lhthai

Thành viên thường trực
Tham gia
1/9/07
Bài viết
309
Được thích
27

File đính kèm

Chào Các Anh
Hiện tại mình đang dùng code lấy giữ liệu trong bài sau:
http://www.giaiphapexcel.com/forum/showthread.php?75143-Bài-tập-về-ADO-căn-bản/page7
Nay muốn bổ sung thêm điều kiện khi gõ ngày cột B3 thì lộc giữ liệu những ngày mình cần.
Các anh chị xem file dinh kèm.
Nếu đơn giản kiểu dữ liệu cột Ngay của bạn như file đính kèm thì có thể dùng code sau:

Mã:
Sub Copy3()
    Dim cnn As Object, lrs As Object
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    Set lrs = cnn.Execute("SELECT GhiChu, TEN, STT, SoLuong ,Ngay FROM [Data$] " & _
                          "WHERE GhiChu = 'C3' and Ngay=" & Sheet1.Range("B3"))
    Sheet1.Range("A6").CopyFromRecordset lrs


End Sub
 
Upvote 0
Nếu đơn giản kiểu dữ liệu cột Ngay của bạn như file đính kèm thì có thể dùng code sau:

Mã:
Sub Copy3()
    Dim cnn As Object, lrs As Object
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    Set lrs = cnn.Execute("SELECT GhiChu, TEN, STT, SoLuong ,Ngay FROM [Data$] " & _
                          "WHERE GhiChu = 'C3' and Ngay=" & Sheet1.Range("B3"))
    Sheet1.Range("A6").CopyFromRecordset lrs


End Sub
Cám ơn Anh nhiều
Anh cho em hỏi thêm 3 đoạn code của em có thể gộp lại thành 1 code được không anh.
 
Upvote 0
Đưa cái điều kiện lọc cột ghichu ra ngoài sheet giống như lọc ngay là được.
Em mới tìm hiểu cách sử dụng Ado này thôi nên chưa biết cách xử lý.
Giả sử nếu File A có nhiều sheet giống nhau mình lọc tất cà các sheet đó để lấy giữ liệu được không anh.
Nếu được Anh có thể viết để em học hỏi thêm.
Cám ơn anh rất nhiều.
 
Upvote 0
@HLMT: đề bài này chỉ đơn giản copy recordset, ta có thể làm code mở và copy trực tiếp, không cần phải qua khai báo gì cả. bình thường ta chỉ lấy recordset khi cần phải duyệt nó.

Mã:
Sub Copy5()
[COLOR=#008000]' đơn giản code của HLMT bên trên[/COLOR]
    With CreateObject("ADODB.Connection")
    .Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    Sheet1.Range("A6").CopyFromRecordset .Execute("SELECT GhiChu, TEN, STT, SoLuong ,Ngay FROM [Data$] " & _
                          "WHERE GhiChu = 'C3' and Ngay=" & Sheet1.Range("B3"))
    End With
End Sub
 
Upvote 0
@HLMT: đề bài này chỉ đơn giản copy recordset, ta có thể làm code mở và copy trực tiếp, không cần phải qua khai báo gì cả. bình thường ta chỉ lấy recordset khi cần phải duyệt nó.

Mã:
Sub Copy5()
[COLOR=#008000]' đơn giản code của HLMT bên trên[/COLOR]
    With CreateObject("ADODB.Connection")
    .Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    Sheet1.Range("A6").CopyFromRecordset .Execute("SELECT GhiChu, TEN, STT, SoLuong ,Ngay FROM [Data$] " & _
                          "WHERE GhiChu = 'C3' and Ngay=" & Sheet1.Range("B3"))
    End With
End Sub

nhân topic này xin được hỏi các thầy : nếu cột ngày tháng là số định dạng chuẩn dd/MM/yyyy thì câu truy vấn ra sao
 
Upvote 0
Em mới tìm hiểu cách sử dụng Ado này thôi nên chưa biết cách xử lý.
Giả sử nếu File A có nhiều sheet giống nhau mình lọc tất cà các sheet đó để lấy giữ liệu được không anh.
Nếu được Anh có thể viết để em học hỏi thêm.
Cám ơn anh rất nhiều.
Nhưng tôi chưa hiểu bạn nói giống nhau là giống như thế nào? Tôi trả lời có thể được là vì chưa nhìn thấy được dữ liệu của bạn. Có thể dùng Union All để gộp hết các sheet rồi đưa điều kiện lọc vào để lấy kết quả.
 
Upvote 0
Upvote 0
Nhưng tôi chưa hiểu bạn nói giống nhau là giống như thế nào? Tôi trả lời có thể được là vì chưa nhìn thấy được dữ liệu của bạn. Có thể dùng Union All để gộp hết các sheet rồi đưa điều kiện lọc vào để lấy kết quả.
Em bổ sung file để anh hiểu.
 

File đính kèm

Upvote 0
Em bổ sung file để anh hiểu.
Thử như sau thử nhé:
Mã:
Sub Copy3()
    Dim cnn As Object, lrs As Object
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    Set lrs = cnn.Execute("select * from (SELECT GhiChu, TEN, STT, SoLuong ,Ngay FROM [Sheet1$] union all select GhiChu, TEN, STT, SoLuong ,Ngay FROM [Sheet2$]  union all select GhiChu, TEN, STT, SoLuong ,Ngay FROM [Sheet3$]) " & _
                          "WHERE GhiChu = 'C3' and Ngay=" & Sheet1.Range("B3"))
    Sheet1.Range("A6").CopyFromRecordset lrs




End Sub
 
Upvote 0
Cám ơn Anh nhiều.
Anh viết dùm em đoạn code này luôn nha.
Thì bạn thay cái C3 = 1 nơi nào đó trên sheet mà bạn gõ điều kiện là được ví dụ tôi để ở cell B2.

Mã:
Sub Copy3()
    Dim cnn As Object, lrs As Object
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    Set lrs = cnn.Execute("select * from (SELECT GhiChu, TEN, STT, SoLuong ,Ngay FROM [Sheet1$] union all select GhiChu, TEN, STT, SoLuong ,Ngay FROM [Sheet2$]  union all select GhiChu, TEN, STT, SoLuong ,Ngay FROM [Sheet3$]) " & _
                          "WHERE GhiChu = '" & [COLOR=#ff0000]Sheet1.Range("B2") [/COLOR]& "' and Ngay=" & Sheet1.Range("B3"))
    Sheet1.Range("A6").CopyFromRecordset lrs


End Sub
 
Upvote 0
Xin cho hỏi là: Nếu WHERE GhiChu = 'C3' . Giá trị C3 này mình gõ ngoài trang tính như cái trường ngày thì phải sửa lại đoạn trên nư thế nào. ví dụ mình gõ tại Sheet1.Range("B2")

Gõ ngoài trang tính cho linh động khi lọc.
Xem lại cách làm ở bài #13 nha bạn
 
Upvote 0
Upvote 0
Chào Các Anh Chị
Em sử dụng thử chức năng trên thanh menu của Excel
DATA\Existing Connections
Tại tab Connection Properties muốn sử dụng điều kiện lộc như Ghi chú C1 và Ngày cột B thì sữa như sao.Em copy nguyên đoạn code sau vào command text thì báo lổi.
Mã:
"SELECT GhiChu, TEN, STT, SoLuong ,Ngay FROM [Data$] " & _
                          "WHERE GhiChu = 'C1' and Ngay=" & Sheet1.Range("B3"))
ADO.jpg
 

File đính kèm

Upvote 0
Hiện tại đang sử dụng code lấy dữ liệu 3 sheet của file TH01 vào file TOTAL
Mình muốn lấy tất cả dữ liệu trong các file (TH01,TH02,TH03..) vào file TOTAL thì cần bổ sung điều kiện như thế nào nhờ các anh chỉ giúp.
Mã:
Private Sub CommandButton2_Click()
Dim cnn As Object, lrs As Object
Dim shName, I As Long
    Sheet1.Range("A6:H1000").ClearContents
    Set cnn = CreateObject("ADODB.Connection")
    shName = Array("1-10", "11-20", "21-31")
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\TH01.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    For I = 0 To UBound(shName)
    Set lrs = cnn.Execute("SELECT * FROM [" & shName(I) & "$] " & _
                           "WHERE CODE = '" & Sheet1.Range("B3") & "'")
  
    Sheet1.Range("A6500").End(xlUp)(2).CopyFromRecordset lrs
  Next I
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dùng ADO để lấy dữ liệu từ nhiều sheet của nhiều file đang đóng?

Gửi các Anh chi!
Mình học hòi từ 1 đoạn code của bạn Hai Lúa Miền Tây để lấy dữ liệu tử nhiều sheet của 1 file đang đóng và cho vào 1 sheet của 1 file đang mở.
Nay mình muốn lấy dữ liệu từ nhiều file đang đóng cho vào sheet của file đang mở nhưng không biết chính sửa thế nào cho đúng,
Mong các anh chị giúp đỡ!
Chình sữa thêm 1 chút nhưng không biết sai chỗ nào.
Mã:
Private Sub CommandButton3_Click()
Dim cnn As Object, lrs As Object
Dim shName, I As Long, Fname
    Sheet1.Range("A6:H1000").ClearContents
    Fname = Array("TH01.xls", "TH02.xls", "TH03.xls")
    Set cnn = CreateObject("ADODB.Connection")
    shName = Array("1-10", "11-20", "21-31")
 '-----------------------------------------------------------------------------------
 'Tao ket noi CSDL
 For I = 0 To UBound(Fname)
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\" & Fname(I) & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
Next I
'-----------------------------------------------------------------------------------
For I = 0 To UBound(shName)
    Set lrs = cnn.Execute("SELECT * FROM [" & shName(I) & "$] " & _
                           "WHERE CODE = '" & Sheet1.Range("B3") & "'")
 '-----------------------------------------------------------------------------------
  'Copy ket qua vao sheet
    Sheet1.Range("A6500").End(xlUp)(2).CopyFromRecordset lrs
Next I
'-----------------------------------------------------------------------------------
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
 

File đính kèm

Upvote 0
Gửi các Anh chi!
Mình học hòi từ 1 đoạn code của bạn Hai Lúa Miền Tây để lấy dữ liệu tử nhiều sheet của 1 file đang đóng và cho vào 1 sheet của 1 file đang mở.
Nay mình muốn lấy dữ liệu từ nhiều file đang đóng cho vào sheet của file đang mở nhưng không biết chính sửa thế nào cho đúng,
Mong các anh chị giúp đỡ!
Chình sữa thêm 1 chút nhưng không biết sai chỗ nào.
Mã:
Private Sub CommandButton3_Click()
Dim cnn As Object, lrs As Object
Dim shName, I As Long, Fname
    Sheet1.Range("A6:H1000").ClearContents
    Fname = Array("TH01.xls", "TH02.xls", "TH03.xls")
    Set cnn = CreateObject("ADODB.Connection")
    shName = Array("1-10", "11-20", "21-31")
 '-----------------------------------------------------------------------------------
 'Tao ket noi CSDL
 For I = 0 To UBound(Fname)
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\" & Fname(I) & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
Next I
'-----------------------------------------------------------------------------------
For I = 0 To UBound(shName)
    Set lrs = cnn.Execute("SELECT * FROM [" & shName(I) & "$] " & _
                           "WHERE CODE = '" & Sheet1.Range("B3") & "'")
 '-----------------------------------------------------------------------------------
  'Copy ket qua vao sheet
    Sheet1.Range("A6500").End(xlUp)(2).CopyFromRecordset lrs
Next I
'-----------------------------------------------------------------------------------
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
http://www.giaiphapexcel.com/forum/...t-đang-đóng-bằng-code-Ado&p=677850#post677850
 
Upvote 0
Hiện tại đang sử dụng code lấy dữ liệu 3 sheet của file TH01 vào file TOTAL
Mình muốn lấy tất cả dữ liệu trong các file (TH01,TH02,TH03..) vào file TOTAL thì cần bổ sung điều kiện như thế nào nhờ các anh chỉ giúp.
Mã:
Private Sub CommandButton2_Click()
Dim cnn As Object, lrs As Object
Dim shName, I As Long
    Sheet1.Range("A6:H1000").ClearContents
    Set cnn = CreateObject("ADODB.Connection")
    shName = Array("1-10", "11-20", "21-31")
    cnn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & ThisWorkbook.Path & "\TH01.xls" & _
               ";Extended Properties=""Excel 8.0;HDR=Yes;"";")
    For I = 0 To UBound(shName)
    Set lrs = cnn.Execute("SELECT * FROM [" & shName(I) & "$] " & _
                           "WHERE CODE = '" & Sheet1.Range("B3") & "'")
  
    Sheet1.Range("A6500").End(xlUp)(2).CopyFromRecordset lrs
  Next I
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
May mắn thì trúng, trật thì thôi vậy. ADO không phải dễ xơi đâu. Chưa am tường VBA mà chọc vào ADO coi chừng tẩu hoả và dữ liệu sai tè le cho coi.
PHP:
Sub CopyAll()
Dim cnn As Object, lrs As Object
Dim Path As String, I As Long, j As Long, Fname(), shName()
Fname = Array("TH01.xls", "TH02.xls", "TH03.xls")
shName = Array("1-10", "11-20", "21-31")
Set cnn = CreateObject("ADODB.Connection")
For I = 0 To UBound(Fname)
   Path = ThisWorkbook.Path & "\" & Fname(I)
   For j = 0 To UBound(shName)
      cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & _
      "Data Source=" & Path & " ;Extended Properties=""Excel 8.0;HDR=Yes;"";")
      Set lrs = cnn.Execute("SELECT * FROM [" & shName(I) & "$] " & _
      "WHERE CODE = '" & Sheet1.Range("B3") & "'")
      Sheet1.Range("A65536").End(3)(2).CopyFromRecordset lrs
      cnn.Close
   Next
   Set lrs = Nothing
Next
Set cnn = Nothing
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom