Tìm kiếm và lấy dữ liệu ở file không mở? (2 người xem)

Liên hệ QC

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

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Dear all,
Tôi đang muốn lấy dữ liệu vào các vùng có dấu hỏi chấm vào trong file có tên : LayDuLieu
Câu hỏi cụ thể cũng đã nằm trong file kèm này.
và nguồn dữ liệu để lấy nằm trong file có tên: Data
đk:2 file này cùng nằm chung trong 1 thư mục

Rất mong nhận được sự giúp đỡ của các bạn,
Thanks you very much
 

File đính kèm

Ado là code lười biến khá đơn giản, chỉ cần biết mấy quy tắc truy vấn và biết kết nối xem như là xong( đủ xài) học cái môn này khó nhất là thiết CSDL, mà trên diễn đàn hầu như không ai đụng đến, xem như phần khó này bỏ qua, như vậy ADO học để ứng dụng trên đây rất đơn giản

Đã muón nói chuyện căn bản thì nói cho đúng căn bản.
ADO là đối tượng dùng để lấy dữ liệu. Nó có thể lấy dữ liệu bất cứ loại nào, miễn là ở dạng bảng (cột và hàng ngăn nắp).
Vì một bảng trong Excel có thể xếp theo cột và hàng ngăn nắp cho nên MS cho phép ADO đọc bảng Excel qua công cụ Access. Lưu ý, từ "công cụ Access", tôi sẽ giải thích sau.
Khi nói "dùng ADO để lấy dữ liệu ở file đang đóng" chỉ có nghĩa là file cần phải mở bằng Excel. Chứ trên thực tế, khi kết nối thì ADO vẫn phải mở nó ra để đọc.
Vì kết nối vào file Excel được truy vấn qua công cụ Access cho nên lệnh truy vấn bắt buộc phải dùng ngôn ngữ SQL của Access. Tôi nhấn mạnh diểm này là vì Access SQL không phải là ngôn ngữ tiêu chuẩn chung. Bạn nào nói dùng cái này để học SQL là học sai đường.

Nếu bạn dùng ADO để lấy dữ liệu từ các dạng CSDL khác thì phải theo luật của loại csdl đó. Ví dụ bạn truy vấn MS SQL Server thì phải dùng t-SQL, truy vấn Oracle thì phải dùng SQL-Plus.
 
Upvote 0
Đọc hoài mà hok có hiểu cái đoạn đỏ đỏ. Bạn doveandrose có thể giải thích thêm tí hok? Thấy có F tưởng là (Fields) gì đó. Mà lại có thêm chữ b.F nữa? khó hiểu quá. b. ở đây là lệnh gì vậy?
Với lại bạn giải thích trong code của bạn đoạn nào là xác định cột cần lấy dữ liệu ở file Data vậy? Nhìn đỏ con mắt mà hok có hiểu... Hic hic...món này khó nuốt quá ạ!

Cảm ơn!

chữ b là tên 1 cái bảng (đã đặt) và f20 , f21 , f22 ... là tên các cột (đã đặt) trong câu truy vấn
bài này nói là sử dụng những phép truy vấn đơn giản , nhưng để viết được những cái đơn giản ấy thì phải có chút nội công , bằng chứng là rượu mời chưa chắc người ta đã uống ....
qua cách hỏi của bạn thì tôi biết bạn chưa đi được đến chỗ đó đâu , nên việc giải thích lúc này là bất khả thi , thông cảm
những cái này với người sử dụng excel bình thường cũng khó học vì nó có giống VBA đâu . bạn không cần phải gấp , cứ những cái đơn giản nhất từ từ đi lên .
 
Upvote 0
Đọc hoài mà hok có hiểu cái đoạn đỏ đỏ. Bạn doveandrose có thể giải thích thêm tí hok? Thấy có F tưởng là (Fields) gì đó. Mà lại có thêm chữ b.F nữa? khó hiểu quá. b. ở đây là lệnh gì vậy?
Với lại bạn giải thích trong code của bạn đoạn nào là xác định cột cần lấy dữ liệu ở file Data vậy? Nhìn đỏ con mắt mà hok có hiểu... Hic hic...món này khó nuốt quá ạ!

Cảm ơn!
Hình như kỳ kỳ. Nếu bắt đầu từ trường 1 sao là
b.f20..... Nếu không tính tiêu đề thì File Data phải bắt đầu từ cột 3
chứ....nhỉ?
Tại tác giả code theo trường phái code lệnh SQL trưc tiếp cho nên hơi khó đọc code.
Theo trường phái của tôi thì viết cái câu SQL mẫu rồi dùng hàm replace thay thế các tham số vào. Chủ trương là dễ đọc và dễ xem giải thuật của câu lệnh.

Trong code dưới đây, bạn để ý tôi bôi đỏ đậm hai dấu ngoặc. Cặp ngoặc ấy dùng để gói một câu sub query con. Cái kết quả của câu subquery con này được đặt tên là b (cũng bôi đỏ đậm). Bên trong cái subquery con này, các trường lấy ra được đặt tên lại là f20, f21, ...Với cách đặt tên này, bên ngoài subquery, các trường này được nhắc tới bằng tên chúng được đặt. Tiền tố b với dấu chấm đi trước chúng (b.f20) chỉ là tiền tố xác định tầm vực. Như vậy, b.F20 có nghĩa là "cái trường được đặt tên là f20 trong cái subquery tên là b"

chú thêm: sở dĩ tác giả đặt tên f20, f21,... là vì các trường này là kết quả của hàm Sum, bắt buộc phải đăt tên là vì chính chúng không có tên.
Sở dĩ tác giả đặt tên b cho subquery con là vì theo luật chung, subquery phải được đặt tên để có cơ sở mà làm tiền tố cho các trường của chúng.

Mã:
Public Sub hello()
Dim cn As Object
Set cn = CreateObject("adodb.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Data.xls" & _
    ";Extended Properties=""Excel 12.0;HDR=NO;ReadOnly=true"";"
With Sheet1
    .Range("G9").CopyFromRecordset cn.Execute("select [COLOR=#ff0000][B]b.[/B][/COLOR][COLOR=#0000ff]f20[/COLOR],[COLOR=#ff0000][B]b.[/B][/COLOR][COLOR=#0000ff]f21[/COLOR],[COLOR=#ff0000][B]b.[/B][/COLOR][COLOR=#0000ff]f22[/COLOR],[B][COLOR=#ff0000]b.[/COLOR][/B][COLOR=#0000ff]f23[/COLOR],[B][COLOR=#ff0000]b.[/COLOR][/B][COLOR=#0000ff]f24[/COLOR] from " & _
    " [" & ThisWorkbook.FullName & ";hdr=no;ReadOnly=true].[Sheet1$F9:F] a " & _
    " left join [COLOR=#ff0000][B]([/B][/COLOR] select f1,sum(fG) [COLOR=#0000ff]as f20[/COLOR],sum(fH) [COLOR=#0000ff]as f21[/COLOR],sum(fI) [COLOR=#0000ff]as f22[/COLOR],sum(fJ) [COLOR=#0000ff]as f23[/COLOR],sum(fK) [COLOR=#0000ff]as f24[/COLOR] " & _
    " from (select f1,iif(f2='" & .[G7] & "',f3,null) as fG, " & _
    " iif(f2='" & .[H7] & "',f3,null) as fH, iif(f2='" & .[I7] & "',f3,null) as fI, " & _
    " iif(f2='" & .[J7] & "',f3,null) as fJ, iif(f2='" & .[K7] & "',f3,null) as fK " & _
    " from [Sheet1$C3:E]) group by f1 [B][COLOR=#ff0000]) b[/COLOR][/B] on a.f1 = b.f1")
End With
cn.Close
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi, thỉnh thoảng cái browser của tôi có vấn đề khi mark up. Đã sửa
 
Upvote 0
Ado là code lười biến khá đơn giản, chỉ cần biết mấy quy tắc truy vấn và biết kết nối xem như là xong( đủ xài) học cái môn này khó nhất là thiết CSDL, mà trên diễn đàn hầu như không ai đụng đến, xem như phần khó này bỏ qua, như vậy ADO học để ứng dụng trên đây rất đơn giản

Không phải lười biếng thầy ạ, mà ADO chỉ là công cụ, SQL mới là ngôn ngữ mọi người cần học khi muốn vận dụng uyển chuyển vào dữ liệu Excel, thường là người từ Excel sang thì lại không quen với SQL thì thấy nó khó thôi. Còn SQL sinh ra để giúp dễ dàng truy xuất và xử lý cơ sở dữ liệu.
lưu ý chủ topic: không có code nào có thể lấy dữ liệu của file đóng nhé. Mọi người hay nhầm khái niệm ADO giúp mở file đóng là sai, vì kiểu gì cũng phải mở (kết nối) file mới lấy được dữ liệu (chỉ có không mở bằng Excel mà thôi)
 
Lần chỉnh sửa cuối:
Upvote 0
Mấy bài đơn giản này có cần phải vác vây búa to thế không?
Nghiên cứu chi mấy thứ đó rồi cũng cho vào quên lãng. Dùng ADO thì đúng rồi nhưng chỉ cần cách phổ thông. Lấy ra mảng dữ liệu rồi muốn xử kiểu gì mà không được. Dùng Dic thỉ chỉ là nhấp nháy là có kết quả.

Xin cảm ơn bạn rất nhiều vì đã tham gia vào chủ để của tôi,
Nếu bạn có cách nào đơn giản hơn mong được bạn chỉ dẫn ạ, thật là mấy hôm nay trong chủ đề này tôi đã nghe nhiều về ADO quá mà muốn xem nó như thế nào đến lúc thấy rồi thì không hiểu được một chữ nào cả,, hix đến cả những cao thủ mà tồi ngưỡng mộ cũng còn nêu ra nhiều câu hỏi bỡ ngỡ thì quả thực đối với tôi nó xa với quá.
Nên tôi cũng không dám hỏi gì khi thấy ADO cả mà hỏi thì cũng không biết hỏi gì nữa..
Rất mong được bạn giúp đỡ cho bài viết này,
Có nhiều bài viết sẽ khiến cho tôi có thêm nhiều sự lựa chọn và trước hết tôi sẽ chọn những gì đơn giản nhất để cho tôi dễ vận dụng và chủ động hơn.
******************

Tôi thấy vui vì mới một ngày không vào mà đã có rất nhiều bài viết trong chủ đề này, hiện tại kiến thức của tôi về lập trình mới chỉ là con số 0 nên cũng không thể đáp lại hết được những bài viết của các bạn được rất mong được các bạn thông cảm.
Nếu không phiền tôi rất mong nhận được nhiều sự hỗ trợ của các bạn. Thậm trí cả những bạn cũng đang chưa biết gì về lập trình như tôi có thể tham gia chủ đề này để học hỏi qua đó hi vọng tôi sẽ hiểu thêm được 1 chút ít về lĩnh vực nào đó.

Trân trọng và cảm ơn các bạn thật nhiều.
 
Upvote 0
em nghiên cứu mà chưa có làm được , anh giúp em với
==================================
sử dụng những truy vấn đơn giản là đủ rồi
Mã:
Public Sub hello()
Dim cn As Object
Set cn = CreateObject("adodb.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Data.xls" & _
    ";Extended Properties=""Excel 12.0;HDR=NO;ReadOnly=true"";"
With Sheet1
    .Range("G9").CopyFromRecordset cn.Execute("select b.f20,b.f21,b.f22,b.f23,b.f24 from " & _
    " [" & ThisWorkbook.FullName & ";hdr=no;ReadOnly=true].[Sheet1$F9:F] a " & _
    " left join (select f1,sum(fG) as f20,sum(fH) as f21,sum(fI) as f22,sum(fJ) as f23,sum(fK) as f24 " & _
    " from (select f1,iif(f2='" & .[G7] & "',f3,null) as fG, " & _
    " iif(f2='" & .[H7] & "',f3,null) as fH, iif(f2='" & .[I7] & "',f3,null) as fI, " & _
    " iif(f2='" & .[J7] & "',f3,null) as fJ, iif(f2='" & .[K7] & "',f3,null) as fK " & _
    " from [Sheet1$C3:E]) group by f1) b on a.f1 = b.f1")
End With
cn.Close
End Sub

Bạn doveandrose ơi cảm ơn bạn rất nhiều!^^ ADO thứ thiệt đó sao?.. hix khủng khiếp quá cứ tưởng tiếng Thái hay tiếng Lào **~**-+*/ ...

Mấy cái b.f1..... Là truy xuất các trường từ bảng b, ví dụ b.f1 là truy xuất cột đầu tiên, b.f3 là truy xuất cột thứ 3, tui thì không khoái mấy cái f đó, tôi khoái gọi tên hơn

Bạn doveandrose ơi như bạn phihndhsp gọi theo tên có đơn giản và dễ hiểu không vậy.
Nếu còn cách viết cũng dùng ADO gì đó mà dễ hiểu hơn mong bạn chỉ dẫn cho ạ .. Bạn doveandrose ơi... -\\/.-\\/.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn doveandrose ơi cảm ơn bạn rất nhiều!^^ ADO thứ thiệt đó sao?.. hix khủng khiếp quá cứ tưởng tiếng Thái hay tiếng Lào **~**-+*/ ...



Bạn doveandrose ơi như bạn phihndhsp gọi theo tên có đơn giản và dễ hiểu không vậy.
Nếu còn cách viết cũng dùng ADO gì đó mà dễ hiểu hơn mong bạn chỉ dẫn cho ạ .. Bạn doveandrose ơi... -\\/.-\\/.

xin lỗi chúng tôi đã cố gắng hết sức ...
mình code cho chạy đúng theo yêu cầu của bạn là cảm thấy mừng rồi , chứ bây giờ còn phải đi code làm sao cho người không biết gì về VBA có thể hiểu được nữa thì mình chưa đủ khả năng .
 
Upvote 0
xin lỗi chúng tôi đã cố gắng hết sức ...
mình code cho chạy đúng theo yêu cầu của bạn là cảm thấy mừng rồi , chứ bây giờ còn phải đi code làm sao cho người không biết gì về VBA có thể hiểu được nữa thì mình chưa đủ khả năng .

doveandrose thương mến!
Bạn nói xin lỗi, tôi cảm thấy rất áy láy.
Người phải nói lời xin lỗi là tôi mới phải, tôi đã làm khó bạn rồi.. xin lỗi bạn nhiều nhiều.

Qua những lời này tôi đã hiểu khó khăn phần nào từ bạn rồi , ngay cả những người mà trong mắt của tôi họ là người có kiến thức rất chuyên sâu trong lĩnh vực này mà còn nói là mù tịt và muốn giải thích nữa là.. theo tôi hiểu sự khó khăn này là nếu muốn giải thích 1 vấn đề dù là rất nhỏ nhưng sẽ kéo theo một lô một lốc những chuỗi vấn đề khác như thuật toán gì đó, rồi là cú pháp , đại loại là sẽ phải nói lại từ đầu rất dài và rất dài ... có phải như vậy không ạ?

Tôi mới tiếp xúc nên đôi khi hỏi hơi kỳ cục và khó chịu mong bạn và mọi người đừng để ý bạn,
Tôi muốn hỏi và muốn học rất nhiều thứ nữa từ bạn và mọi người.
Rất mong bạn và mọi người thường xuyên theo dõi và trợ giúp cho tôi.

Buổi tối vui vẻ bạn nhé!
Trân trọng cảm ơn bạn thật nhiều.
 
Upvote 0
Không phải lười biếng thầy ạ, mà ADO chỉ là công cụ, SQL mới là ngôn ngữ mọi người cần học khi muốn vận dụng uyển chuyển vào dữ liệu Excel, thường là người từ Excel sang thì lại không quen với SQL thì thấy nó khó thôi. Còn SQL sinh ra để giúp dễ dàng truy xuất và xử lý cơ sở dữ liệu.
...

(A)DO là Data Object. Mục đích của đối tượng là che đi những phần phức tạp, giúp cho công việc dễ dàng, làm cầu nối giữa dữ liệu và người/vật cần dữ liệu. Có cái cầu nối tốt thì đỡ được nhiều giai đoạn làm việc. Trên một quan điểm nào đó, người ta có quyền nói "làm việc ít đi có nghĩa là lười biếng", tôi không cãi làm chi cho mệt. Bời vì, chủ trương tôi nếu lười biếng mà xong được việc thì tôi sẵn sàng làm kẻ lười nhất thiên hạ.

SQL không khó học chút nào cả. Nó chỉ có vài câu lệnh và một số hàm đếm trên đầu ngón tay. Tôi có thể khẳng định điều này. Cái khó là hiểu thấu lý thuyết Đại Số Tập Hợp để có thể thiết kế CSDL đạt chuẩn (tối thiểu là bậc 3) và lập thuât toán truy xuất theo ý muốn.
 
Upvote 0
...
Với tôi là người đã biết 1 chút về VBA rồi mà còn đụng tới món ADO mà lúng túng như vậy...

Tại bạn bước vào chụp ngay 1 đống đề tài khó mới thấy vậy.
Nếu chịu đi từ căn bản, vào mấy cái thớt nói chuyện căn bản trước khi vào mấy cái thớt "đố vui..." thì sẽ thấy nó rất dễ. Toic nghĩ cũng chính vì dễ quá cho nên bà con cần thách thức mới giở chứng nghĩ ra mấy cái đề tài khó.

Như tôi đã nói nhiều lần, ADO hoàn toàn có thể gói trọn trong vài cái hàm thư viện. Nếu bạn chỉ cần truy vấn căn bản thì cóp mấy cái hàm này vào module, gọi hàm, nạp tham số, hết.

Ngay cả nếu bạn vào mấy cái thớt "đó vui..." thì cũng thấy những vấn đề trong đó là do người ta không muốn thiết kế lại bảng (điển hình: tên sheet có chứa dấu chấm). Một khi bảng thiết kế đàng hoàng thì nó dễ vô cùng.
 
Upvote 0
Một khi bảng thiết kế đàng hoàng thì nó dễ vô cùng.
cái đó mới là cái quang trọng để học và làm việc đó, lúc sinh viên cứ tìm tòi rất nhiều, ra trường đi làm chỉ ứng dụng những cái cơ bản vào trong công việc làm nhiều thôi, còn những cái phức tạp hầu như là người ta đã có nhóm làm sẵn hết rồi.
 
Upvote 0
Cách đơn giản nhất của mình là xài ké mấy cái hàm kết nối (ADO) trên GPE lấy dữ liệu file đóng lên một Sheet phụ xong dùng VBA muốn làm cái gì thì làm

Còn cộng trừ nhân chia luôn trong ADO trước khi gán kết quả lên Sheet Là Tịt....không dại gì nội công chưa đủ húc đầu vào code ADO nhìn như mớ rau muống đó sợ chết đi mất ....,,,,,,,
 
Upvote 0
Tôi và anh í cùng í tưởng...haha....Và đã và đang làm thía đó... Người ta giao cho mình 1 cái Thùng bự chà bá lửa: Chứa gạo, thóc, đậu, ...và cả Sạn nữa. Bảo mình lọc 1 phát ra ngay thì mình chịu....
Nhưng mình có cách là Bê Nguyên cái thùng đó đặt sang nơi khác....Rồi muốn xử gì thì xử...haha--=0--=0--=0
OK Bạn ..........mình tịt ADO thì mình phải có tuyệt kỷ khác chứ lị............--=0 hông lẻ bó tay.com
 
Upvote 0
Cách đơn giản nhất của mình là xài ké mấy cái hàm kết nối (ADO) trên GPE lấy dữ liệu file đóng lên một Sheet phụ xong dùng VBA muốn làm cái gì thì làm

Còn cộng trừ nhân chia luôn trong ADO trước khi gán kết quả lên Sheet Là Tịt....không dại gì nội công chưa đủ húc đầu vào code ADO nhìn như mớ rau muống đó sợ chết đi mất ....,,,,,,,
lấy ra 1 sheet phụ là cách tôi cũng hay làm
 
Upvote 0
Bạn doveandrose ơi cảm ơn bạn rất nhiều!^^ ADO thứ thiệt đó sao?.. hix khủng khiếp quá cứ tưởng tiếng Thái hay tiếng Lào **~**-+*/ ...



Bạn doveandrose ơi như bạn phihndhsp gọi theo tên có đơn giản và dễ hiểu không vậy.
Nếu còn cách viết cũng dùng ADO gì đó mà dễ hiểu hơn mong bạn chỉ dẫn cho ạ .. Bạn doveandrose ơi... -\\/.-\\/.
Thật ra ADO không khó lắm đâu. Để hôm nào rảnh rổi mình viết bài này cho bạn tham khảo. Tuy nhiên có những thứ chỉ cần biết ứng dụng là được, chẳng cần hiểu làm gì cho nhức đầu.
Hẹn gặp bài viết sau của mình.
 
Upvote 0
Thật ra ADO không khó lắm đâu. Để hôm nào rảnh rổi mình viết bài này cho bạn tham khảo. Tuy nhiên có những thứ chỉ cần biết ứng dụng là được, chẳng cần hiểu làm gì cho nhức đầu.
Hẹn gặp bài viết sau của mình.
Cho thêm cái tài liệu với nhiều nhiều bài mẫu kèm chú thích để dễ hiểu luôn nha bác. ngóng bài viết mới của bác.........|||||
 
Upvote 0
Bên hộp Lập Trình với Excel -> Cơ Sở Dữ Liệu có một đống bài về ADO, từ căn bản đến nâng cao. Qua bên ấy mà tìm. Chỗ nào không hiểu thì cứ mở 1 thớt ra mà hỏi.
 
Upvote 0
Web KT

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

Back
Top Bottom