Bài tập về ADO căn bản. (2 người xem)

Liên hệ QC

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

Mình chưa từng quản trị dữ liệu nhưng mình nghĩ là làm được vì mình có đọc sách về ADO thấy họ truy cập và sửa dữ liệu trên SQL server với cấu trúc tương tự. Mình nghĩ tới việc là thử truy cập giữa các file excel khác nhau trên các thư mục khác nhau sau đó là truy cập file excel trên hai máy tính cùng mang LAN . Vấn đề quản trị dữ liệu mình sẽ tìm hiểu sau nhưng bài toán truy cập filex excel trên 2 thư mục khác nhau luôn gặp lỗi mà mình không nghĩ ra cách sửa. Nếu được bạn viết giúp mình code minh họa còn mình tự tìm hiểu các bài toán còn lại.
Truy cập trên Lan thì bạn xem Code minh họa trong "Excel Chat" nhé. Link tại chữ ký của tôi.
 
Ok. Mình tự làm được rồi. Nhìn code bạn đúng là hoa hết cả mắt vì bạn ít ghi chú thích quá.
 
Xin hỏi trong ADO bằng cách nào chúng ta lấy ra được tích của 2 trường
Mình đọc mãi mà không thấy cách tính phép nhân của 2 trường với nhau, hình như là không có phép nhân trong ADO

Giả sử ta có 2 trường DONGIA, SOLUONG tại CSDL nguồn, giờ muốn lấy ra dữ liệu là tích của 2 trường này thì làm cách nào?
 
Xin hỏi trong ADO bằng cách nào chúng ta lấy ra được tích của 2 trường
Mình đọc mãi mà không thấy cách tính phép nhân của 2 trường với nhau, hình như là không có phép nhân trong ADO

Giả sử ta có 2 trường DONGIA, SOLUONG tại CSDL nguồn, giờ muốn lấy ra dữ liệu là tích của 2 trường này thì làm cách nào?


Để sử dụng phép nhân trong ADO thì anh phải sử dụng tên cột giả định

Mã:
Select [DONGIA]*[SOLUONG] as [THANHTIEN] FROM [CSDL]
 
Để sử dụng phép nhân trong ADO thì anh phải sử dụng tên cột giả định

Mã:
Select [DONGIA]*[SOLUONG][COLOR=#ff0000] as [THANHTIEN][/COLOR] FROM [CSDL]
Không có màu đỏ nó vẫn ra, tuy nhiên nếu không có thì nó sẽ tự đặt tên cho tên cột đó.
 
Giờ mình có trường Item, Qty. Khi dùng Select distinct Item rồi thì làm sao cộng tổng của Item từ trường Qty? Biết là Sum nhưng chẳng biết Sum kiểu nào đây, viết sao cũng báo lỗi.
 
Ha ha, cũng giống như sách viết, vậy mà đọc sách không làm được, nhưng đọc code của HLMT thì viết xong chạy liền. Coi bộ HLMT có khiếu sư phạm nha.

Lúc này coi bộ anh tập "lấn sân" rồi. ADO rất đơn giản, nếu áp dụng linh hoạt sẽ giúp ích cho anh đáng kể đó.
 
Dùng mệnh đề GROUP BY là cách chính chắn của SQL chuẩn.

Nếu nhất định muốn dùng DISTINCT thì có thể làm như sau:

Select Distinct Item
, (Select Sum(Qty) From Bang Where Item = a.Item) As TongQty
From Bang As a
-- tuy cũng ra vậy nhưng vừa rắc rối vừa chạy chậm !
 
Dùng mệnh đề GROUP BY là cách chính chắn của SQL chuẩn.

Nếu nhất định muốn dùng DISTINCT thì có thể làm như sau:

Select Distinct Item
, (Select Sum(Qty) From Bang Where Item = a.Item) As TongQty
From Bang As a
-- tuy cũng ra vậy nhưng vừa rắc rối vừa chạy chậm !
Qua đây mình cũng khẳng định lại rằng, trong SQL cũng có nhiều phương án để thực hiện ý đồ của mình. Không nhất thiết chỉ theo 1 luật duy nhất để ra kết quả. Có thể đó là ý kiến cá nhân, có thể đa số mọi người không theo ngôn ngữ này vì cho rằng nó nhàm chán và đơn giản. Nhưng không hề nhàm chán và đơn giản tí nào phải không bạn?
 
Lấy dữ liệu và cập nhật dữ liệu mà không cần mở file

Xin chào mọi người
Mình có một bài tập lấy dữ liệu từ file đóng như sau:
Mình có file để tổng hợp là "TONG HOP.xlsm",
file cập nhật dữ liệu là "CAP NHAT DL NHIEU NOI TRONG SHEET.xls" và "CAP NHAT DL NHIEU SHEET.xls"

Xin mọi người giúp mã cập nhật dữ liệu với yêu cầu sau:

yêu cầu 1:
Từ file TONG HOP.xlsm đang mở lấy dữ liệu theo cột tên hàng và số lượng theo mã hàng từ các sheet trong file CAP NHAT DL NHIEU SHEET.xls với đường dẫn và tên file ở ô C3, B3 của file TONG HOP.xlsm

yêu cầu 2:
cũng giống yêu cầu 1 nhưng file cập nhật là file có nhiều vùng dùng làm cơ sở để cập nhật (file CAP NHAT DL NHIEU NOI TRONG SHEET.xls), A2:C29, E2:G29, I2:K29, M2:O34, Q2:S29 với đường dẫn và tên file ở ô C2, B2 của file TONG HOP.xlsm

Cám ơn mọi người rất nhiều
 

File đính kèm

...
Mình có một bài tập lấy dữ liệu từ file đóng như sau:
...
yêu cầu 1:
...
yêu cầu 2:
...

thắc mắc: bạn học cái gì mà có bài tập hắc thế?
cỡ trình độ này đáng lẽ bạn phải biết tự làm và chỉ hỏi những chỗ bí thôi chứ chẳng lẽ muốn người ta làm giùm bài tập từ a đến z?
 
thắc mắc: bạn học cái gì mà có bài tập hắc thế?
cỡ trình độ này đáng lẽ bạn phải biết tự làm và chỉ hỏi những chỗ bí thôi chứ chẳng lẽ muốn người ta làm giùm bài tập từ a đến z?

Chào bạn VetMiNi
Mình đang tự học ADO để lấy dữ liệu file đóng, nhưng khi dùng câu lệnh SQl update dữ liệu từ nhiều sheet thì mình không biết cách nào, mà mình coi trong diễn đàn này hình như không thấy có tình huống nào như vậy hết, mình muốn đưa giả thiết đó lên đây hi vọng có bạn nào giúp được để học hỏi chỉ có vậy thôi
Cám ơn bạn VetMiNi đã phản hồi
 
Chào bạn VetMiNi
Mình đang tự học ADO để lấy dữ liệu file đóng, nhưng khi dùng câu lệnh SQl update dữ liệu từ nhiều sheet thì mình không biết cách nào, mà mình coi trong diễn đàn này hình như không thấy có tình huống nào như vậy hết, mình muốn đưa giả thiết đó lên đây hi vọng có bạn nào giúp được để học hỏi chỉ có vậy thôi
Cám ơn bạn VetMiNi đã phản hồi
Bạn nên nhờ từng phần một thôi... bạn nhờ một lúc quá nhiều yêu cầu thì khả năng giúp đỡ rất ít... mình tham gia GPE cũng đã lâu mình biết ít bạn nào làm hoàn chỉnh mọi yêu cầu cho một ai đó lắm(A-z) là vậy đó
Việc lấy dữ liệu nhiều file đóng ADO, VBA ..làm được hết ...tìm trên GPE nha
 
...
Mình đang tự học ADO để lấy dữ liệu file đóng, nhưng khi dùng câu lệnh SQl update dữ liệu từ nhiều sheet thì mình không biết cách nào, mà mình coi trong diễn đàn này hình như không thấy có tình huống nào như vậy hết, ...

Tự học thì đầu tiên hết nên học cách tìm trên diễn đàn.
Trên diễn đàn này có khá nhiều bài có phần lấy kết quả từ nhiều sheets, cũng có nhiều bài bàn về cách update dữ liệu, cái gì update được và cái gì không được.

Nếu bạn bí về câu lệnh truy vấn thì đưa nó lên và cho biết kết quả khác với dự định ra sao.
 
Chào các anh chị trên diễn đàn
Mình xem trên diễn đàn thấy tác giả Hai Lúa Miền Tây có code dùng ADO lấy dữ liệu và update dữ liệu, nhưng mình thấy khi update dữ liệu kiểu chuổi thì bị lỗi type mismatch vậy ta phải khai báo như thế nào để update được cả số lẫn chuổi

Lấy ví dụ của tác giả Hai Lúa Miền Tây (gửi theo file đính kèm)
Cảm ơn các anh chị rất nhiều
 

File đính kèm

Chào các anh chị trên diễn đàn
Mình xem trên diễn đàn thấy tác giả Hai Lúa Miền Tây có code dùng ADO lấy dữ liệu và update dữ liệu, nhưng mình thấy khi update dữ liệu kiểu chuổi thì bị lỗi type mismatch vậy ta phải khai báo như thế nào để update được cả số lẫn chuổi

Lấy ví dụ của tác giả Hai Lúa Miền Tây (gửi theo file đính kèm)
Cảm ơn các anh chị rất nhiều
Bạn chèn thêm một Field tại cột L với tên là TÊN HÀNG.
 
Bài 1:
Nhằm mục đích luyện tập và nâng cao kiến thức về ADO tôi xin mở topic này. Topic này chỉ dành cho những người mới học, bắt đầu học ADO như tôi tham gia.

Tôi có 2 Workbooks (A.xls và B.xls chung 1 folder): Wb A.xls có 1 sheet là sheet data dùng để chứa dữ liệu, wb B.xls là wb rỗng, trong đó có sheet1.

Xin hỏi là dùng ADO từ WB A.xls để copy toàn bộ dữ liệu của sheet data sang WB B.xls với sheet chứa dữ liệu là data
Lấy dữ liệu bài 1 của HLMT để test trường hợp sau
Mã:
Sub Trich_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
                        ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
    .Open
End With
    lsSQL = "SELECT GhiChu, TEN, STT, SoLuong FROM [Data$] " & _
            "WHERE GhiChu= 'x'"
    lrs.Open lsSQL, cnn, 3, 1
[a:d].Clear
    For i = 1 To lrs.Fields.Count
       Cells(1, i).Value = lrs.Fields(i - 1).Name
    Next
   
   ''''''''Bat dau doan 1''''''''''''''''''''''''''''''''''''''''''''''''''
[B]   Dim Arr(1 To 100, 1 To 4)[/B]
[B]   Dim k As Long[/B]
[B]        k = 1[/B]
[B]      While lrs.EOF = False[/B]
[B]           Arr(k, 1) = lrs.Fields(0)[/B]
[B]           Arr(k, 2) = lrs.Fields(1)[/B]
[B]           Arr(k, 3) = lrs.Fields(2)[/B]
[B]           Arr(k, 4) = lrs.Fields(3)[/B]
[B]           k = k + 1[/B]
[B]           lrs.MoveNext[/B]
[B]    Wend[/B]
[B]'Range("A2").Resize(k, 4) = Arr[/B]
''''''''''Ket Thuc Doan 1


   ''''''''Bat dau doan 2''''''''''''''''''''''''''''''''''''''''''''''


[B]  Range("A2").CopyFromRecordset lrs[/B]


   ''''''''Ket Thuc Doan 2'''''''''''''''''''''''''''''''''''''''''


lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
Xin cho hỏi là tại sau có đoạn 1 thì Range("A2").CopyFromRecordset lrs không hoạt động?
 
CopyFromRecordset chỉ copy từ record hiện tại thôi, nếu muốn copy từ đầu thì thêm lrs.MoveFirst vào.
 
Lấy dữ liệu bài 1 của HLMT để test trường hợp sau
Mã:
Sub Trich_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
                        ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
    .Open
End With
    lsSQL = "SELECT GhiChu, TEN, STT, SoLuong FROM [Data$] " & _
            "WHERE GhiChu= 'x'"
    lrs.Open lsSQL, cnn, 3, 1
[a:d].Clear
    For i = 1 To lrs.Fields.Count
       Cells(1, i).Value = lrs.Fields(i - 1).Name
    Next
   
   ''''''''Bat dau doan 1''''''''''''''''''''''''''''''''''''''''''''''''''
[B]   Dim Arr(1 To 100, 1 To 4)[/B]
[B]   Dim k As Long[/B]
[B]        k = 1[/B]
[B]      While lrs.EOF = False[/B]
[B]           Arr(k, 1) = lrs.Fields(0)[/B]
[B]           Arr(k, 2) = lrs.Fields(1)[/B]
[B]           Arr(k, 3) = lrs.Fields(2)[/B]
[B]           Arr(k, 4) = lrs.Fields(3)[/B]
[B]           k = k + 1[/B]
[B]           lrs.MoveNext[/B]
[B]    Wend[/B]
[B]'Range("A2").Resize(k, 4) = Arr[/B]
''''''''''Ket Thuc Doan 1


   ''''''''Bat dau doan 2''''''''''''''''''''''''''''''''''''''''''''''


[B]  Range("A2").CopyFromRecordset lrs[/B]


   ''''''''Ket Thuc Doan 2'''''''''''''''''''''''''''''''''''''''''


lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
Xin cho hỏi là tại sau có đoạn 1 thì Range("A2").CopyFromRecordset lrs không hoạt động?

Bạn hãy thử đưa cái đoạn đó lên trước cái Arr rồi chạy, sau đó say luận nhé.
 
Lần chỉnh sửa cuối:
đưa lên trước thì ok, và anh Hậu cũng đã giải thích nên có phần nào hiểu được cấu trúc của nó. Cảm ơn HLMT đã quan tâm.
 
Theo nguyên tắc CSDL, việc truy vấn phải tương đối dễ dàng. Nếu có sự rắc rối thì bảng và CSDL nên thiết kế lại cho phù hợp.
Đọc toàn topic thấy cái câu này của anh VetMini nói là hợp lý nhất. Xưa kia học CSDL thấy thiết kế các bảng là phức tạp nhất, sau khi thiết kế xong các bảng phù hợp thì công việc truy vấn bằng SQL rất đơn giản, tối đa truy vấn các phép kết cũng chỉ dừng lại là con số 4 bản.
 
Đọc toàn topic thấy cái câu này của anh VetMini nói là hợp lý nhất. Xưa kia học CSDL thấy thiết kế các bảng là phức tạp nhất, sau khi thiết kế xong các bảng phù hợp thì công việc truy vấn bằng SQL rất đơn giản, tối đa truy vấn các phép kết cũng chỉ dừng lại là con số 4 bản.

Chẳng lẻ hơn ba trăm bài còn lại chẳng hợp lý? Nếu bài nào không hợp lý bạn có thể cho biết để chúng tôi học hỏi thêm.
 
CÒn em đọc bài về DAO cũng không hiểu gì cả, hay bị ĐAO rồi?

Thật sự bạn không cần hiểu. Một trong những mục đích của LT Hướng Đối Tượng là giúp cho người ta tránh cái rắc rối này.
Nếu bạn tìm được bài có function hoặc sub gói trọn cách truy cập thì bạn chỉ cần nạp tham số (trước măt là tên file và câu truy vấn), function trả về cho bạn một recordset, bạn dùng lệnh copyfromrecordset đẩy nó nào worksheet.

Nếu người viết cái function kia viết chính chắn thì người sử dụng không cần phải biết nó dùng ADO hay DAO.
 
Thấy cái vụ ADO đã khó nhớ rồi lại thêm Vụ DAO nữa thật sự cùng muốn học lắm những cũng không biết bắt đầu từ đâu ....

Nếu được đề nghị Bạn nào đó cho xin một ví dụ về ADO Và 1 DAO để mình phân biệt đâu là DAO và đâu Là ADO....

xin cảm ơn
 
Nếu người viết cái function kia viết chính chắn thì người sử dụng không cần phải biết nó dùng ADO hay DAO.

Vấn đề nằm ở chỗ này nè!
Thường khi sưu tầm code trên mạng, đa phần là không vừa ý, phải sửa lại. Mà muốn sửa được thì bắt buộc phải HIỂU nó. Vậy là.. xong phim luôn
Bời vậy tôi thường cố gắng viết code sao cho đạt mức tổng quát nhất, để người dùng chỉ cần nạp thông số đầu vào là đủ (khỏi cần hiểu, khỏi cần sửa code)
 
Thấy cái vụ ADO đã khó nhớ rồi lại thêm Vụ DAO nữa thật sự cùng muốn học lắm những cũng không biết bắt đầu từ đâu ....

Nếu được đề nghị Bạn nào đó cho xin một ví dụ về ADO Và 1 DAO để mình phân biệt đâu là DAO và đâu Là ADO....

xin cảm ơn

DAO truy cập dữ liệu ở tầng lớp thấp hơn ADO (*). Vì vậy nếu đặt đúng chỗ thì DAO hiệu nghiệm hơn ADO. Ngược lại, vì ở tầng cao hơn nên ADO tổng quát hơn.

Làm cách nào để phân biệt? Chịu thua. Tôi nhìn cái đối tượng, nó bảo dao thì mình biết dao, búa thì mình biết búa.

(*) từ "tầng lớp thấp" là dịch từ "low level", trong thuât ngữ lập trình, tầng lớp được hiểu theo lớp vỏ củ hành, thấp chỉ có nghĩa là nó gần với cái lõi hơn, hoàn toàn không liên quan gì đến hay hoặc dở.
 
DAO truy cập dữ liệu ở tầng lớp thấp hơn ADO (*). Vì vậy nếu đặt đúng chỗ thì DAO hiệu nghiệm hơn ADO. Ngược lại, vì ở tầng cao hơn nên ADO tổng quát hơn.

Làm cách nào để phân biệt? Chịu thua. Tôi nhìn cái đối tượng, nó bảo dao thì mình biết dao, búa thì mình biết búa.

(*) từ "tầng lớp thấp" là dịch từ "low level", trong thuât ngữ lập trình, tầng lớp được hiểu theo lớp vỏ củ hành, thấp chỉ có nghĩa là nó gần với cái lõi hơn, hoàn toàn không liên quan gì đến hay hoặc dở.

Bạn nói về tầng? Mà là tầng gì? Tầng vật lý? Nếu là tầng vật lý thì nó nằm trong tầng thứ mấy trong 7 tầng?
 
Bạn nói về tầng? Mà là tầng gì? Tầng vật lý? Nếu là tầng vật lý thì nó nằm trong tầng thứ mấy trong 7 tầng?

1. Tầng thứ mấy thì có liên quan gì đến lập trình VBA?

2. ADO: Nếu cần phải xác định tính chất vật lý thì "tổng quát" làm quái gì nữa.
 
1. Tầng thứ mấy thì có liên quan gì đến lập trình VBA?

2. ADO: Nếu cần phải xác định tính chất vật lý thì "tổng quát" làm quái gì nữa.

Ậy tôi thấy bạn nói về tầng nên tôi giật mình mà hỏi bạn thế thôi, vì tầng low level thì tôi mới nghe.
 
Cho mình hỏi dùng câu lệnh nào (hàm nào) để lọc ra các dòng có giá trị của 1 cột bị trùng.
Ví dụ mình có dử liệu gồm 3 cột A, B, C mình muốn lọc ra các dòng có cột A xuất hiện từ 2 lần trở lên.
(Mình tìm mãi mà chưa tìm ra được cách giải quyết bằng câu lệnh SQL)
Mình cám ơn!
 
Lần chỉnh sửa cuối:
Cho mình hỏi dùng câu lệnh nào (hàm nào) để lọc ra các dòng có giá trị của 1 cột bị trùng.
Ví dụ mình có dử liệu gồm 3 cột A, B, C mình muốn lọc ra các dòng có cột A xuất hiện từ 2 lần trở lên.
(Mình tìm mãi mà chưa tìm ra được cách giải quyết bằng câu lệnh SQL)
Mình cám ơn!

Bạn thử như sau:
select A, count(A) from tablename group by A Having count(A)>2
 
Cho mình hỏi dùng câu lệnh nào (hàm nào) để lọc ra các dòng có giá trị của 1 cột bị trùng.
Ví dụ mình có dử liệu gồm 3 cột A, B, C mình muốn lọc ra các dòng có cột A xuất hiện từ 2 lần trở lên.
(Mình tìm mãi mà chưa tìm ra được cách giải quyết bằng câu lệnh SQL)
Mình cám ơn!

Bạn muốn lọc lấy cái gì?
Nếu chỉ muốn biết những dữ liệu A nào bị lặp lại thì dùng code bài #341 (hình như cần phải sửa >2 thành >1 hoặc >=2).
Nếu muốn lấy những dữ liệu khác trong dòng thì phải nói rõ hơn.
 
Bạn muốn lọc lấy cái gì?
Nếu chỉ muốn biết những dữ liệu A nào bị lặp lại thì dùng code bài #341 (hình như cần phải sửa >2 thành >1 hoặc >=2).
Nếu muốn lấy những dữ liệu khác trong dòng thì phải nói rõ hơn.
Cám ơn bác!
Mình muốn lọc ra các dòng có cột A bị lặp lại và lấy cả A, B, C luôn nhưng không muốn hiện COUNT(A) thì làm như thế nào?
Dạng như thế này:
select A, B, C from tablename group by A Having count(A)>1
 
Lần chỉnh sửa cuối:
Cám ơn bác!
Mình muốn lọc ra các dòng có cột A bị lặp lại và lấy cả A, B, C luôn nhưng không muốn hiện COUNT(A) thì làm như thế nào?
Dạng như thế này:
select A, B, C from tablename group by A Having count(A)>1
Có 2 vấn đề cần làm rõ:
- Lấy duy nhất 3 điều kiện A,B,C
Ví dụ:

[TABLE="class: grid, width: 500"]
[TR]
[TD]A[/TD]
[TD]B[/TD]
[TD]C[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]s[/TD]
[TD]c[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]s[/TD]
[TD]c[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]d[/TD]
[TD]e[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]a[/TD]
[TD]q[/TD]
[/TR]
[TR]
[TD]d[/TD]
[TD]d[/TD]
[TD]s[/TD]
[/TR]
[/TABLE]

Kết quả:

[TABLE="class: grid, width: 500"]
[TR]
[TD]A[/TD]
[TD]B[/TD]
[TD]C[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]s[/TD]
[TD]c[/TD]
[/TR]
[/TABLE]


- Chỉ lấy duy nhất cột A, loại bỏ điều kiện B,C
Ví dụ:

[TABLE="class: grid, width: 500"]
[TR]
[TD]A[/TD]
[TD]B[/TD]
[TD]C[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]a[/TD]
[TD]a[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]b[/TD]
[TD]c[/TD]
[/TR]
[TR]
[TD]b[/TD]
[TD]a[/TD]
[TD]c[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]a[/TD]
[TD]a[/TD]
[/TR]
[TR]
[TD]b[/TD]
[TD]a[/TD]
[TD]c[/TD]
[/TR]
[TR]
[TD]c[/TD]
[TD]s[/TD]
[TD]a[/TD]
[/TR]
[/TABLE]

Kết quả:

[TABLE="class: grid, width: 500"]
[TR]
[TD]A[/TD]
[TD]B[/TD]
[TD]C[/TD]
[/TR]
[TR]
[TD]a[/TD]
[TD]a[/TD]
[TD]a[/TD]
[/TR]
[TR]
[TD]b[/TD]
[TD]a[/TD]
[TD]c[/TD]
[/TR]
[/TABLE]
 
Cám ơn bác!
Là cái cuối đấy ạ, chỉ lấy điều kiện côt A bị lạp lại. Cột B, C không quan tâm.
 
Lần chỉnh sửa cuối:
Cám ơn bác!
Là cái cuối đấy ạ, chỉ lấy điều kiện côt A bị lạp lại. Cột B, C không quan tâm.
Bạn lấy bảng chính join với bảng kết quả ở bài 341 là được, không biết cách này có dài không:
Select TableName.* From TableName Inner Join (Select A,Count(A) From TableName Group By A Having Count(A)>1) As Qr On TableName.A=Qr.A
 
Nếu muốn liệt ra tất cả các dòng A thì dùng code bài #346

Nếu muốn liệt chỉ 1 dòng A, dòng nào cũng được thì dùng
Select A, MAX(B) , MAX(C) [C] From BANG Group By A Having Count(A) > 1
 
Nếu muốn liệt ra tất cả các dòng A thì dùng code bài #346

Nếu muốn liệt chỉ 1 dòng A, dòng nào cũng được thì dùng
Select A, MAX(B) , MAX(C) [C] From BANG Group By A Having Count(A) > 1



mình gửi file thực tế mọi người giúp mình nhe.
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi muốn tổng hợp dữ liệu từ file dữ liệu sang file thống kê, tôi có sử dụng kỹ thuật ADO để lấy, bình thường thì không sao, nhưng hôm nay tự nhiên tôi thấy dữ liệu lấy qua không hết ở một số cột
Trong file này tôi viết theo kiểu lấy nhiều file có nhiều sheet, nhưng tôi đã xóa bớt hết, chỉ để lại 1 file và 2 sheet lấy dữ liệu bị lỗi
Trong file này cột 6 và côt 7 bên sheet thống kê không lấy hết cột 6 và cột 7 ở các sheet trong bảng dữ liệu? xin cho hỏi trường hợp này bị lỗi gì? Xin chân thành cảm ơn
 

File đính kèm

Tôi muốn tổng hợp dữ liệu từ file dữ liệu sang file thống kê, tôi có sử dụng kỹ thuật ADO để lấy, bình thường thì không sao, nhưng hôm nay tự nhiên tôi thấy dữ liệu lấy qua không hết ở một số cột
Trong file này tôi viết theo kiểu lấy nhiều file có nhiều sheet, nhưng tôi đã xóa bớt hết, chỉ để lại 1 file và 2 sheet lấy dữ liệu bị lỗi
Trong file này cột 6 và côt 7 bên sheet thống kê không lấy hết cột 6 và cột 7 ở các sheet trong bảng dữ liệu? xin cho hỏi trường hợp này bị lỗi gì? Xin chân thành cảm ơn

ADO rất quan trọng kiểu dự liệu, Cột 6,7 của bạn có 2 kiểu dữ liệu xen kẽ Text và Number do đó sẽ dẫn tới bỏ sót. Bạn hãy chuẩn hóa kiểu dữ liệu và chạy Code xem sao.
 
Tôi muốn tổng hợp dữ liệu từ file dữ liệu sang file thống kê, tôi có sử dụng kỹ thuật ADO để lấy, bình thường thì không sao, nhưng hôm nay tự nhiên tôi thấy dữ liệu lấy qua không hết ở một số cột
Trong file này tôi viết theo kiểu lấy nhiều file có nhiều sheet, nhưng tôi đã xóa bớt hết, chỉ để lại 1 file và 2 sheet lấy dữ liệu bị lỗi
Trong file này cột 6 và côt 7 bên sheet thống kê không lấy hết cột 6 và cột 7 ở các sheet trong bảng dữ liệu? xin cho hỏi trường hợp này bị lỗi gì? Xin chân thành cảm ơn
Tôi thấy kiểu dữ liệu trong file nguồn vừa là chuổi và số. Điều này vẫn đến lỗi chăng?
 
Tôi thấy kiểu dữ liệu trong file nguồn vừa là chuổi và số. Điều này vẫn đến lỗi chăng?
cũng nghĩ đến khả năng đó, nhưng các sheet khác vẫn ok, không có vấn đề gì? mà chỉ có sheet này mới bị vậy thôi. cái này cũng đã xử lý xong là chuyển về 1 kiểu, nhưng muốn tìm hiểu tại sao nó lại bị như vậy? để phòng trường hợp sau. Cảm ơn hai lúa miền tây nhiều vì đã quan tâm
 
ADO rất quan trọng kiểu dự liệu, Cột 6,7 của bạn có 2 kiểu dữ liệu xen kẽ Text và Number do đó sẽ dẫn tới bỏ sót. Bạn hãy chuẩn hóa kiểu dữ liệu và chạy Code xem sao.
Tại sao tất cả các sheet khác lấy không bị gì? Mà sheet này lại bị? Mình chỉ muốn biết nguyên nhân thôi, còn cách sửa thì cũng đã sửa xong rồi.
 
Chuyện dữ liệu vừa số vừa chuỗi bị bỏ sót là bình thường. Bạn phải biết tính năng này của Excel để thiết kế bảng cho chuẩn, tránh những lỗi khó nhận ra.
May là tỉ lệ dòng lỗi lớn cho nên bạn nhân ra. Giả sử bạn copy vài ngàn dòng, trong đó chỉ có đôi ba dòng lỗi thì có thể bạn bị tình trạng dữ liệu sai mà không hay. Dùng ADO là con dao hai lưỡi mà.

Cách đay khoảng 1 tuần lễ, tôi mới vừa trả về báo cáo của tên nọ, cũng bị sai lý do tương tự.
 
đó có phải là nguyên lý không? tại sao có cái được cái không? đây là dữ liệu em tổng hợp từ nhiều nguồn nhập của nhà xe phương trang, mệt nỗi là mỗi người nhập một kiểu, nhiệm vụ của em là tìm ra sai xót.v..vv, nói chung là em có thể giải quyết ráo các vấn đề này, nhưng mà không hiểu tại sao nó lại như vậy thôi, chủ yếu là biết nguyên nhân hoạt động của nó
 
đó có phải là nguyên lý không? tại sao có cái được cái không? ...

Nguyên lý hay không thì hỏi cái thằng product manager của MS.
Việc cái được cái không dân chuyên chuyển dữ liệu ai cũng biết.
Cùng một đoạn code, đọc dữ liệu 2 files CSV có cấu trúc in hệt nhau, một cái đọc được từ đầu chí cuối, cái kia chỉ nhập được những dòng mà dữ liệu trong cột đó là dạng số, gặp dạng chữ thì nó lướt qua bỏ cả dòng. Sau khi chữa lại, nó đọc dữ liệu số, cứ chuỗi thì tuy không lướt qua dòng nhưng ô lại bị trống.
Muốn bảo đảm chỉ có cách là tách ra 2 cột riêng. Nếu không thì phải dùng cách bạo động:
- Nếu file xlsx thì vào registry sửa lại mặc định số dòng để xác định kiểu (mặc định là 8). Sửa lại là đọc từ đầu đến cuối.
- Nếu file CSV thì hơi chăm, cái này phải dùng một hàm đặc biệt duyệt file, đóng các chuỗi giữa 2 dấu nháy đôi.
 
Anh chị cho em hỏi có thể dùng ADO để kết nối file .DBF với excel để xử lý trên excel không ạ. Em gửi file anh chị xem giúp em. Cám ơn anh chị GPE
 

File đính kèm

có anh chị nào giúp tôi giải quyết ADO
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\DM.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
.Open
End With


lsSQL = "SELECT MSVT, HPVT, MA_NC " & _
"FROM [DM$] " & _
"WHERE [MHDM] = '& cells(3,2) & ' "

có gì sai mà sao thủ tục không chạy hàm WHERE [MHDM] = '& cells(3,2) & ' " này bị lỗi nhờ các cao thủ trên diễn đàn giải quyết hộ nếu bỏ thủ tục WHERE thì hàm chạy hết
 
có anh chị nào giúp tôi giải quyết ADO
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\DM.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
.Open
End With


lsSQL = "SELECT MSVT, HPVT, MA_NC " & _
"FROM [DM$] " & _
"WHERE [MHDM] = '& cells(3,2) & ' "

có gì sai mà sao thủ tục không chạy hàm WHERE [MHDM] = '& cells(3,2) & ' " này bị lỗi nhờ các cao thủ trên diễn đàn giải quyết hộ nếu bỏ thủ tục WHERE thì hàm chạy hết
Bạn xem lại cách nối chuổi nhé

lssql = "SELECT MSVT, HPVT, MA_NC " & _
"FROM [DM$] " & _
"WHERE [MHDM] = '" & Cells(3, 2) & "' "
 
thanhs bạn "WHERE [MHDM] = ' " & Cells(3, 2) & " ' " thủ tục mình chạy tốt rồi
 
trong thủ tục này
PHP:
With cnn
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                "Data Source=" & ThisWorkbook.Path & "\DM_A.xls" & _
                                ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
            .Open
      lsSQL1 = "SELECT MSDM, TENCV, DVTINH, VL, NC, MXD " & _
      "FROM [DG_A$] " '& _
       "WHERE [MHDM] = '" & Cells(3, 2) & "' "      'DG_A ten sheet can lay du lieu
      lrs1.Open lsSQL1, cnn, 3, 1

có thể dùng thêm COS có được không <LẤY DỮ LIỆU Ở NHIỀU BẢNG TÍNH>

With cnnA
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                "Data Source=" & ThisWorkbook.Path & "\DM_B.xls" & _
                                ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
            .Open
       End With 
     lsSQL2 = "SELECT MSDM, TENCV " & _
      "FROM [DG_B$] " '& _
       "WHERE [MHDM] = '" & Cells(3, 2) & "' "      'DG_B ten sheet can lay du lieu
      lrs2.Open lsSQL2, cnn, 3, 1
vì mình muốn lấy dữ liệu ở nhiều bảng tính đang đóng để lọc theo điều kiện cần tìm
nhờ các bạn giải quyết giúp mình
có cách nào hay và rút gọn lại được không
!$@!!
 
nhờ AE diễn đàn GE gỡ rối cho mục này

PHP:
Sub LayDL_ADO17() 
     Dim lsSQL As String, cnn As Object, lrs As Object 
     Dim sh As Worksheet 
     Dim lr As Long, j As Long, m As Long, k As Long, n As Long 
           Dim Arr As Variant, ExcelArr As Variant, i As Long, _            
                  c As Long, h As Long, r As Long, v As Long 
     Set cnn = CreateObject("ADODB.Connection") 
     Set lrs = CreateObject("ADODB.Recordset") 
     Set sh = Sheet5 
     n = 1 
     m = 7 
     lr = sh.Range("G" & Rows.Count).End(xlUp).Row 
               
     With cnn .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
                            "Data Source=" & ThisWorkbook.Path & "\DM.xls" & _ 
                             ";Extended Properties=""Excel 8.0;HDR=Yes;"";" 
           .Open 
     End With 
       For j = 7 To lr 
           If sh.Cells(j, 7) = "" Then 
                  Cells(m, 1) = n 
                  Cells(m, 2) = sh.Cells(j + 1, 7).Value 
           Else 
                  Cells(m, 1) = n 
                  Cells(m, 2) = sh.Cells(j, 7).Value 
 
lsSQL = "SELECT MSVT, HPVT, MA_NC " & _ 
         "FROM [DM$] " & _ 
         "WHERE [MHDM] = '" & Cells(m, 2) & "' " 

 lrs.Open lsSQL, cnn, 3, 1
       
      Arr = lrs.GetRows

        v = UBound(Arr, 1) + 1 
       h = UBound(Arr, 2) + 1 
   ReDim ExcelArr(1 To h, 1 To v): r = 0 
     For i = 1 To h 
         r = r + 1 
           For c = 1 To v 
               ExcelArr(r, c) = Arr(c - 1, i - 1) 
           Next c 
     Next i 
           Sheet5.Range("C" & m+1).Resize(h, v).Value = ExcelArr 

           k = sh.Range("C" & Rows.Count).End(xlUp).Row 
           m = k + 1 
           n = n + 1
 
     lrs.Close: Set lrs = Nothing 
     cnn.Close: Set cnn = Nothing 

     End If 
 Next j
End Sub

=>> khi chạy lấy dữ liệu thì chỉ được 1 vòng lặp còn chuyển sang vong 2 thì cos bị lỗi
lrs.Open lsSQL, cnn, 3, 1
kèm theo thông báo
Run - time error '3705 '
operation is not allowed when the object is open
 
Lần chỉnh sửa cuối:
Connection closed mất rồi.
 
chuyển ra ngoài for vẫn bị lỗi lrs.Open lsSQL, cnn, 3, 1
PHP:
Sub LayDL_ADO17()

For j = 7 To lr 
      
     If sh.Cells(j, 7) = "" Then

        <khối lệnh>  

lrs.Open lsSQL, cnn, 3, 1


 End If 

Next j 
      'chuyển ra ngoài for vẫn lỗi  lrs.Open lsSQL, cnn, 3, 1
lrs.Close: Set lrs = Nothing      
cnn.Close: Set cnn = Nothing


End Sub
 
' lô gic đơn giản
open connection
for...
open recordset
...
close recordset
next
close connection
set all objects to nothing
 
MÌNH ĐÃ LÀM ĐƯỢC RỒI
CHO COS NÀY VÀO TRONG FOR
PHP:
      Set cnn = CreateObject("ADODB.Connection")

      Set lrs = CreateObject("ADODB.Recordset")

             With cnn

            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _

                                "Data Source=" & ThisWorkbook.Path & "\DienBien2012\DMDB1776.xls" & _

                                ";Extended Properties=""Excel 8.0;HDR=Yes;"";"


           .Open

      End With
mình vừa học trên diễn đàn nên ko biết nhiều
THANKS CÁC BẠN ĐÃ GIÚP
 
Hy vọng người ta chừa mình ra.

đương nhiên là chừa anh Vetmini ra rồi , vì bài #363 và #365 chả dính dáng gì đến cách làm đã được chọn ở #366 cả , như 2 đường thẳng song song không có điểm chung vậy +-+-+-++-+-+-+

Theo em nghĩ thì đây là dạng truy vấn khi thỏa mãn giá trị nằm trong 1 tập (Select where column_name IN (,,) ) . Vậy thì cách làm duyệt vòng lặp qua các giá trị trong tập rồi gọi lệnh truy vấn (Select where column_name = '') có vẻ không hay nhỉ ? **~****~**
 
Cái ADO mà Excel dùng nó quản lý bộ nhớ hơi kém. Kết nối vài lượt là có khả năng bị tràn bộ nhớ. Nhất là khi kết nối với chính file chạy code.
Vì vậy rất ít khi ngừoi ta dùng vòng lặp để truy vấn nhiều lần.
 
Các bạn có cách nào hay hơn không
vì theo mình thì cứ sau mỗi lần duyệt nhớ 1 vòng là đóng nhớ và giải phóng nhớ
thì sẽ không tràn nhớ

PHP:
for 
  if
      Arr = Empty
      ExcelArr = Empty
      Set sh = Nothing
      
      lrs.Close: Set lrs = Nothing
      cnn.Close: Set cnn = Nothing      
   End If  

Next j

       'MsgBox "Done in " & Int(Timer - startTime) & " s."

Mình thấy tốc độ hơi chậm 3 s cho 6 dữ liệu điều kiện
khi mình mở vào file nguồn thì không mở được các bạn chỉ giúp hộ
các bạn có cách nào hay không chỉ cho mình với !$@!!
 
Lần chỉnh sửa cuối:
ODEDB có quản lý riêng của chúng. VBA gọi một ADO Object ra làm việc chứ đâu có nắm được code của ADO bao giờ. Khi ADO nhận lệnh close thì nó đồng ý flag là close thôi chứ nó có hứa nhả bộ nhớ ra ngay lập tức đâu. Khi nào nó thấy thuận tiện thì nó nhả.
 
Lần chỉnh sửa cuối:
Lọc các tên theo danh sách và Tính tổng

Chào Anh
Em mượn File cùa anh,em muốn lọc tất cà tên theo danh sách thay vì điều kiện or.
Trường hợp 2 lọc duy nhất và tính tổng.
 

File đính kèm

Chào Anh
Em mượn File cùa anh,em muốn lọc tất cà tên theo danh sách thay vì điều kiện or.
Trường hợp 2 lọc duy nhất và tính tổng.

Code sẽ như sau nhé bạn (Data trong cùng WB)

[GPECODE=sql]

Sub LocDuyNhat()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[I2].CopyFromRecordset .Execute("Select distinct TEN From [Sheet1$B1:B12]")
End With
End Sub


Sub Tinh_Tong()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Sheet1$B1:C12] Group By Ten")
End With
End Sub


[/GPECODE]
 
Code sẽ như sau nhé bạn (Data trong cùng WB)

[GPECODE=sql]

Sub LocDuyNhat()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[I2].CopyFromRecordset .Execute("Select distinct TEN From [Sheet1$B1:B12]")
End With
End Sub


Sub Tinh_Tong()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Sheet1$B1:C12] Group By Ten")
End With
End Sub

[/GPECODE]
Code này lấy dữ liệu trên file B em muốn cập nhật dữ liệu trên file A
Em muốn 2 trường hơp sau:
1.Lấy tất cả dữ liệu file A theo điều kiện ở cột I mà không tính tổng
2.Lấy tất cả dữ liệu file A theo điều kiện ở cột I và tính tổng
Anh viết lại dùm em nha.
Em Cám ơn Anh rất nhiều.
 
Lần chỉnh sửa cuối:
Code này lấy dữ liệu trên file B em muốn cập nhật dữ liệu trên file A
Em muốn 2 trường hơp sau:
1.Lấy tất cả dữ liệu file A theo điều kiện ở cột I mà không tính tổng
2.Lấy tất cả dữ liệu file A theo điều kiện ở cột I và tính tổng
Anh viết lại dùm em nha.
Em Cám ơn Anh rất nhiều.

Bạn chỉnh lại như sau:

[GPECODE=sql]
Sub LocDuyNhat()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
'Neu du lieu la file A.xls trong cung thu muc
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[I2].CopyFromRecordset .Execute("Select distinct TEN From [Data$]")
'Neu data trong cung WB
'.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
'Sheet1.[I2].CopyFromRecordset .Execute("Select distinct TEN From [Sheet1$B1:B12]")
End With
End Sub


Sub Tinh_Tong()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
'Neu du lieu la file A.xls trong cung thu muc
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Data$] Group By Ten")
'Neu data trong cung WB
'.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
'Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Sheet1$B1:C12] Group By Ten")
End With
End Sub


[/GPECODE]
 
Bạn chỉnh lại như sau:

[GPECODE=sql]
Sub LocDuyNhat()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
'Neu du lieu la file A.xls trong cung thu muc
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[I2].CopyFromRecordset .Execute("Select distinct TEN From [Data$]")
'Neu data trong cung WB
'.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
'Sheet1.[I2].CopyFromRecordset .Execute("Select distinct TEN From [Sheet1$B1:B12]")
End With
End Sub


Sub Tinh_Tong()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
'Neu du lieu la file A.xls trong cung thu muc
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Data$] Group By Ten")
'Neu data trong cung WB
'.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
'Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Sheet1$B1:C12] Group By Ten")
End With
End Sub
[/GPECODE]

Em muốn lọc tất cả danh sách theo điều kiện tại cột I thay vì hàm or cứ mỗi lần thêm điều kiện là bổ sung hàm or tiếp.
Mã:
Private Sub CommandButton1_Click()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
                        ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
    .Open
End With
'lay het du lieu co trong sheet Data o file A.xls
    lsSQL = "SELECT * " & "FROM [Data$]" & _
    "WHERE [COLOR=#ff0000]TEN= '" & Sheet1.Range("I2") & "'or TEN= '" & Sheet1.Range("I3") & "'or TEN = '" & Sheet1.Range("I4") & "'"[/COLOR]
    lrs.Open lsSQL, cnn, 3, 1
With Sheet1
   .[A2:D1000].ClearContents
   .[A2].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
 
Em muốn lọc tất cả danh sách theo điều kiện tại cột I thay vì hàm or cứ mỗi lần thêm điều kiện là bổ sung hàm or tiếp.
Mã:
Private Sub CommandButton1_Click()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\A.xls" & _
                        ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
    .Open
End With
'lay het du lieu co trong sheet Data o file A.xls
    lsSQL = "SELECT * " & "FROM [Data$]" & _
    "WHERE [COLOR=#ff0000]TEN= '" & Sheet1.Range("I2") & "'or TEN= '" & Sheet1.Range("I3") & "'or TEN = '" & Sheet1.Range("I4") & "'"[/COLOR]
    lrs.Open lsSQL, cnn, 3, 1
With Sheet1
   .[A2:D1000].ClearContents
   .[A2].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub

Vậy thì dùng code sau nhé:
[GPECODE=sql]
Sub LayDuLieu()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[O2].CopyFromRecordset .Execute("Select * From [Data$] where ten IN (select TEN from [" & ThisWorkbook.FullName & "].[sheet1$I1:I13])")
End With
End Sub


[/GPECODE]
 
Vậy thì dùng code sau nhé:
[GPECODE=sql]
Sub LayDuLieu()
Dim v As String
v = Application.Version
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & ";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
Sheet1.[O2].CopyFromRecordset .Execute("Select * From [Data$] where ten IN (select TEN from [" & ThisWorkbook.FullName & "].[sheet1$I1:I13])")
End With
End Sub

[/GPECODE]
Hay quá cám ơn Anh nhiều.
 
Chào Anh
Em làm được lọc dữ liệu theo điều kiện và tính tổng theo code của anh
nhưng em muốn lấy tất cả cột
Em không upload file được bị phần mềm "Cyberoam"của Cty chặn
Em upload link fshare.
https://www.fshare.vn/file/T2KF7CV4MKNB
Mã:
Private Sub CommandButton1_Click()
Dim v As String
Sheet1.Range("O2:R1000").ClearContents
    v = Application.Version
    With CreateObject("ADODB.Connection")
    '--------------------------------------------------------------------------------------
     'Neu du lieu la file A.xls trong cung thu muc
    '.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & _
    '";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
        'Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Data$] Group By Ten")
    '-------------------------------------------------------------------------------------------
     'Neu data trong cung WB
        .Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & _
        ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
        'Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Sheet1$B1:C12] Group By Ten")
[COLOR=#ff0000]        Sheet1.[P2].CopyFromRecordset .Execute("Select STT,TEN,Ghichu, sum(SoLuong) From [Sheet1$B1:C12] where ten IN (select TEN from [" & ThisWorkbook.FullName & "].[sheet1$I1:I13])Group By Ten")[/COLOR]
    End With
End Sub
 
Lần chỉnh sửa cuối:
Chào Anh
Em làm được lọc dữ liệu theo điều kiện và tính tổng theo code của anh
nhưng em muốn lấy tất cả cột
Em không upload file được bị phần mềm "Cyberoam"của Cty chặn
Em upload link fshare.
https://www.fshare.vn/file/OSMID2X83EJ7

Mã:
Private Sub CommandButton1_Click()
Dim v As String
Sheet1.Range("O2:R1000").ClearContents
    v = Application.Version
    With CreateObject("ADODB.Connection")
    '--------------------------------------------------------------------------------------
     'Neu du lieu la file A.xls trong cung thu muc
    '.Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & _
    '";Data Source=" & ThisWorkbook.Path & "\A.xls;Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
        'Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Data$] Group By Ten")
    '-------------------------------------------------------------------------------------------
     'Neu data trong cung WB
        .Open "Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & _
        ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0")
        'Sheet1.[P2].CopyFromRecordset .Execute("Select TEN, sum(SoLuong) From [Sheet1$B1:C12] Group By Ten")
[COLOR=#ff0000]        Sheet1.[P2].CopyFromRecordset .Execute("Select STT,TEN,Ghichu, sum(SoLuong) From [Sheet1$B1:C12] where ten IN (select TEN from [" & ThisWorkbook.FullName & "].[sheet1$I1:I13])Group By Ten")[/COLOR]
    End With
End Sub

Phần group bạn group có 1 trường đó là TEN, trong khi đó cần Group là STT, TEN, GhiChu. Vậy phải sửa lại là Group By STT, TEN, GhiChu
Lưu ý dữ liệu cột STT và ghi chú khi group có đúng yêu cầu hay không. Vì giống nhau nó mới group lại.
 
Phần group bạn group có 1 trường đó là TEN, trong khi đó cần Group là STT, TEN, GhiChu. Vậy phải sửa lại là Group By STT, TEN, GhiChu
Lưu ý dữ liệu cột STT và ghi chú khi group có đúng yêu cầu hay không. Vì giống nhau nó mới group lại.

Cám ơn Anh rất nhiều
 
Em thực hiện copy từ file Book1 nhưng bị các lỗi sau như file đính kèm ạ:
- Cột 1: số liệu thập phân bị mất và thay bằng số nguyên bị nhân lên 10^x lần.
- Cột 2: số liệu copy ra không phải dạng số (đặc biệt các số 0 bị thành "-" dẫn đến nếu ko xử lý tiếp kết quả copy này mà dùng tính toán ngay sẽ gây lỗi).
- Cột 3: vẫn cùng dạng lệnh vba tương tự như vậy, cột nguồn cùng định dạng với nguồn của cột 2 nhưng lại ra kết quả dạng số (khác với kết quả ở cột 2)!!
Xin giúp đỡ giải đáp tại sao và chỉnh sửa để lệnh copy đúng số liệu ạ, xin cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Có thời kỳ tui quậy ADO diết mà khi ngủ mê tui nghe thấy ai đó nói nhỏ vào tai tui vầy nè ai đó nghe xem có trúng hông nha ...--=0

Nếu dòng đầu trống thì không lấy text chỉ lấy số ...--=0+-+-+-+...còn nữa kỳ sau nói tiếp
 
Lần chỉnh sửa cuối:
Có thời kỳ tui quậy ADO diết mà khi ngủ mê tui nghe thấy ai đó nói nhỏ vào tai tui vầy nè ai đó nghe xem có trúng hông nha ...--=0

Nếu dòng đầu trống thì không lấy text chỉ lấy số ...--=0+-+-+-+...còn nữa kỳ sau nói tiếp

Em tay mơ mới học thôi nên vẫn chưa hiểu ý anh -+*/ Mong kỳ sau của anh để được giải đáp -\\/.
 
Có thời kỳ tui quậy ADO diết mà khi ngủ mê tui nghe thấy ai đó nói nhỏ vào tai tui vầy nè ai đó nghe xem có trúng hông nha ...--=0

Nếu dòng đầu trống thì không lấy text chỉ lấy số ...--=0+-+-+-+...còn nữa kỳ sau nói tiếp
Nếu dữ liệu không chuẩn thì nên khai báo IMEX của nó nhé.
 
Các anh cho em hỏi có thể lấy dữ liệu bằng sql từ sheet thứ 2 trong file excel không ạ
 
Lười thế. Nếu chịu khó đọc bài một chút thì đã biết có được hay không.
Can ban la e khong co thoi gian, Sang 5h30 e phải đi làm rồi, tối 9h30 e mới về đến nhà. Bác biết chỉ giúp e, hoặc cho e link để e xem cho nhanh, e biết cách là dùng name range, nhưng nó bị giới hạn < 20k dòng
 
Can ban la e khong co thoi gian, Sang 5h30 e phải đi làm rồi, tối 9h30 e mới về đến nhà. Bác biết chỉ giúp e, hoặc cho e link để e xem cho nhanh, e biết cách là dùng name range, nhưng nó bị giới hạn < 20k dòng

Dùng Name được tối đa 65536 dòng nhé.
 
Vâng anh Tuân! Nhưng dữ liệu của em là vài trăm ngàn dòng, có cách nào lấy dữ liệu từ sheet thứ 2 trở đi mà k dùng name không a

Nếu dữ liệu > 65k dòng thì em dùng tên sheet làm nguồn. Dòng đầu tiên của sheet phải là dòng tiêu đề. Bây giờ em làm câu lệnh như sau:
SELECT * FROM [TÊN SHEET$]
 
Nếu dữ liệu > 65k dòng thì em dùng tên sheet làm nguồn. Dòng đầu tiên của sheet phải là dòng tiêu đề. Bây giờ em làm câu lệnh như sau:
SELECT * FROM [TÊN SHEET$]
Cảm ơn a.Tuân nhiều ạ (bây giờ em mới đi làm về). em test dòng đâu tiên của sheet không phải là dòng tiêu đề vẫn ok a tuân ạ
 
Mã:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\addin a-tools\excel-for-internet\demo.xlsx;
Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";
Nói thật là e mới tìm hiểu về vấn đề nay được vài ngày, trong code trên em hiểu mỗi đoạn Data Source=c:\addin a-tools\excel-for-internet\demo.xlsx, còn những khai báo còn lại em chữa rõ lắm, tuy nhiên em không dám hỏi a về vấn đề này nữa, e sẽ tự tìm hiểu sau. A cho em hỏi thêm vấn đề này thôi: nếu tên field dạng như này: check q'ty, hoăc có chứa dấu cách thì có cách nào để sử dụng 'select check q'ty from[gpe] ' không ạ. Vì với một số trường có tên đặc thù nếu đổi tên field về dạng viết liền không dấu, không dấu cách thì người đọc rất khó hiểu ( ngoài ra còn có tiến hàn nữa ạ) . Thank!
 
Nói thật là e mới tìm hiểu về vấn đề nay được vài ngày, trong code trên em hiểu mỗi đoạn Data Source=c:\addin a-tools\excel-for-internet\demo.xlsx, còn những khai báo còn lại em chữa rõ lắm, tuy nhiên em không dám hỏi a về vấn đề này nữa, e sẽ tự tìm hiểu sau. A cho em hỏi thêm vấn đề này thôi: nếu tên field dạng như này: check q'ty, hoăc có chứa dấu cách thì có cách nào để sử dụng 'select check q'ty from[gpe] ' không ạ. Vì với một số trường có tên đặc thù nếu đổi tên field về dạng viết liền không dấu, không dấu cách thì người đọc rất khó hiểu ( ngoài ra còn có tiến hàn nữa ạ) . Thank!
Nên tránh đặt tên field là những ký tự đặc biệt để tránh rắc rối sau này. Trường hợp của bạn thì nên thêm 2 dấu [] vào nha. VD: select Col1, [Col 2], [check q'ty] from table
 
Nói thật là e mới tìm hiểu về vấn đề nay được vài ngày, trong code trên em hiểu mỗi đoạn Data Source=c:\addin a-tools\excel-for-internet\demo.xlsx, còn những khai báo còn lại em chữa rõ lắm, tuy nhiên em không dám hỏi a về vấn đề này nữa, e sẽ tự tìm hiểu sau. A cho em hỏi thêm vấn đề này thôi: nếu tên field dạng như này: check q'ty, hoăc có chứa dấu cách thì có cách nào để sử dụng 'select check q'ty from[gpe] ' không ạ. Vì với một số trường có tên đặc thù nếu đổi tên field về dạng viết liền không dấu, không dấu cách thì người đọc rất khó hiểu ( ngoài ra còn có tiến hàn nữa ạ) . Thank!

Tên trường coi như một biến, một NAME nên càng ngắn gọn càng dễ dùng, giảm lỗi soạn thảo. Nếu trường hợp buộc phải sử dụng tên cột có dấu hay có ký tự đặc biệt thì khi đưa tên cột (tên trường) vào câu lệnh SQL bạn cho nó vào trong [ TÊN CỘT]. Ví dụ.

SELECT [TÊN CỘT] FORM [TÊN SHEET$] WHERE [TÊN CỘT]='abc'

Bạn muốn học về SQL, ngoài ví dụ thực hành trên đây bạn có thể xem 2 video hướng dẫn ngôn ngữ SQL trong loạt video "Tạo báo cáo động trong Excel" của tôi trên youtube sẽ nhanh nắm bắt hơn nữa.
 
Xin lưu ý thêm là trong cửa sổ VBE chưa hỗ trợ Tiếng Việt có dấu hay Tiếng Hàn như bạn đề cập, nếu muốn truy vấn được thì phải tạo list bên ngoài sheet và nối chuổi nó vào.
 
Tên trường coi như một biến, một NAME nên càng ngắn gọn càng dễ dùng, giảm lỗi soạn thảo. Nếu trường hợp buộc phải sử dụng tên cột có dấu hay có ký tự đặc biệt thì khi đưa tên cột (tên trường) vào câu lệnh SQL bạn cho nó vào trong [ TÊN CỘT]. Ví dụ.

SELECT [TÊN CỘT] FORM [TÊN SHEET$] WHERE [TÊN CỘT]='abc'

Bạn muốn học về SQL, ngoài ví dụ thực hành trên đây bạn có thể xem 2 video hướng dẫn ngôn ngữ SQL trong loạt video "Tạo báo cáo động trong Excel" của tôi trên youtube sẽ nhanh nắm bắt hơn nữa.
Cảm ơn a Tuân nhiều! Em cũng đã biết đến a và xem 1 số video hd của a, e sẽ cố gắng tìm hiểu để tránh đưa ra những câu hỏi ngớ ngẩn
 

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

Back
Top Bottom