Đố vui về ADO, DAO - T3/15

Liên hệ QC

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,306
Được thích
15,849
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Lâu quá không khởi động chủ đề này, hôm nay xin đưa ra câu đố như sau:

Làm thế nào ta có thể liệt kê tất cả tên sheet, name, vùng in... mà không dùng vòng lặp?
 
cho góp vui cách của dân mù VBA :D
Mã:
Sub getnames()


Dim cnn As New ADODB.Connection
Dim XLName As String
Dim rs As New ADODB.Recordset
Dim Arr As Variant
Dim cArr As Variant
Dim rsArr As Variant
Dim lc As String
Dim destRG As String


XLName = "D:\\myfile.xlsx"


Application.ScreenUpdating = False
With cnn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source='" & XLName & "';" & _
           "Extended Properties=""Excel 12.0;"""
    .Open
End With
Set rs = cnn.OpenSchema(adSchemaTables)
Arr = rs.GetRows
lc = Split(Cells(1, UBound(Arr, 2) + 1).Address(True, False), "$")(0)
destRG = "A1:" & lc & (UBound(Arr) + 1)
Sheet1.Range(destRG).Value = Arr
cArr = Sheet1.Range(destRG).Value
Sheet1.Range(destRG).ClearContents
rsArr = WorksheetFunction.Index(cArr, 3)


Sheet1.Range("A1:A" & UBound(rsArr)).Value = WorksheetFunction.Transpose(rsArr)
Sheet1.Range("A1:A" & UBound(rsArr)).Replace "$", ""
rs.Close
cnn.Close


Application.ScreenUpdating = True


End Sub
 
cho góp vui cách của dân mù VBA :D
Mã:
Sub getnames()


Dim cnn As New ADODB.Connection
Dim XLName As String
Dim rs As New ADODB.Recordset
Dim Arr As Variant
Dim cArr As Variant
Dim rsArr As Variant
Dim lc As String
Dim destRG As String


XLName = "D:\\myfile.xlsx"


Application.ScreenUpdating = False
With cnn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source='" & XLName & "';" & _
           "Extended Properties=""Excel 12.0;"""
    .Open
End With
Set rs = cnn.OpenSchema(adSchemaTables)
Arr = rs.GetRows
lc = Split(Cells(1, UBound(Arr, 2) + 1).Address(True, False), "$")(0)
destRG = "A1:" & lc & (UBound(Arr) + 1)
Sheet1.Range(destRG).Value = Arr
cArr = Sheet1.Range(destRG).Value
Sheet1.Range(destRG).ClearContents
rsArr = WorksheetFunction.Index(cArr, 3)


Sheet1.Range("A1:A" & UBound(rsArr)).Value = WorksheetFunction.Transpose(rsArr)
Sheet1.Range("A1:A" & UBound(rsArr)).Replace "$", ""
rs.Close
cnn.Close


Application.ScreenUpdating = True


End Sub

Bạn đã đi đúng hướng, tuy nhiên:
1. Code hơi dài, có thể rút gọn lại hơn nữa?
2. Code bỏ qua vùng có AutoFilter?
 
Lần chỉnh sửa cuối:
anh nói thế thì em như "vịt nghe sấm " :D . Nhờ anh chỉ giáo vậy .
 
anh nói thế thì em như "vịt nghe sấm " :D . Nhờ anh chỉ giáo vậy .

Có gì đâu bạn, ý mình có 2 ý như sau:
1. Code bạn dài, có thể rút ngắn lại cho gọn, nên bỏ qua những công đoạn không cần thiết.
2. Code của bạn không lấy tên vùng mà trên sheet có autofilter.
 
Lần chỉnh sửa cuối:
hai anh cho hỏi chút
sao chép đoạn code bài #2 về nó báo lổi
"User defined type not defined"
ở dòng
Dim cnn As New ADODB.Connection

phải làm sao xóa lổi này ạ

cám ơn
===========
à, đã kiếm được lời giải, nhờ anh hai lúa xóa giúp

cám ơn

============
HLMT: Xóa làm chi, để cho mọi người học luôn.
 
Chỉnh sửa lần cuối bởi điều hành viên:
dân mù VBA mà anh . có những cái em ko tự giải thích đc . thí dụ như
đối với file excel nhẹ : truy vấn luôn tìm đc vùng có filter
đối với file excel nặng , như file công ty em 15mb : truy vấn này không thể tìm đc vùng có filter , nhưng nếu truy vấn khi file đó đang mở bằng cửa sổ application thì truy vấn lại tìm ra +-+-+-+

đâu là sự khác nhau giữa chúng ? mong anh giải đáp giúp
 
dân mù VBA mà anh . có những cái em ko tự giải thích đc . thí dụ như
đối với file excel nhẹ : truy vấn luôn tìm đc vùng có filter
đối với file excel nặng , như file công ty em 15mb : truy vấn này không thể tìm đc vùng có filter , nhưng nếu truy vấn khi file đó đang mở bằng cửa sổ application thì truy vấn lại tìm ra +-+-+-+

đâu là sự khác nhau giữa chúng ? mong anh giải đáp giúp

Vậy phải xem code của bạn như thế nào, code của tôi chạy trên file đến 3 triệu dòng với dung lượng là hơn 58MB nhưng vẫn lấy tốt.
 
Lâu quá không thấy ai trả lời nữa, thôi thì tôi xin gửi đáp án vậy:

PHP:
Sub TableName()
    Dim Cn As Object, rsTables As Object, Arr() As Variant
    Set Cn = CreateObject("ADODB.Connection")
    Cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=" & ThisWorkbook.FullName & _
             ";Extended Properties=""Excel 8.0"";")
    Set rsTables = Cn.OpenSchema(20)
    Arr = rsTables.GetRows(, , "TABLE_NAME")
    ActiveCell.Resize(UBound(Arr, 2) - LBound(Arr, 2) + 1, 1).Value = Application.Transpose(Arr)

End Sub
 
Lâu quá không thấy ai trả lời nữa, thôi thì tôi xin gửi đáp án vậy:

PHP:
Sub TableName()
    Dim Cn As Object, rsTables As Object, Arr() As Variant
    Set Cn = CreateObject("ADODB.Connection")
    Cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=" & ThisWorkbook.FullName & _
             ";Extended Properties=""Excel 8.0"";")
    Set rsTables = Cn.OpenSchema(20)
    Arr = rsTables.GetRows(, , "TABLE_NAME")
    ActiveCell.Resize(UBound(Arr, 2) - LBound(Arr, 2) + 1, 1).Value = Application.Transpose(Arr)

End Sub
Em nghĩ chắc tại các thành viên trên GPE ít người biết về ADO nên không có câu trả lời ạ!
Anh có thể cho 1 vài bài tập dễ không ạ?
 
Lâu quá không thấy ai trả lời nữa, thôi thì tôi xin gửi đáp án vậy:

Bài này dễ ồm... nếu tui có học qua Access, SQL, ADO...
Hổng học, biết chết liền!
Ẹc... Ẹc... --=0
---------------------------
Phát hiện 1 chiện: Code chỉ đúng với file đã lưu, có tên đàng hoàng. Còn với file mới tinh vừa tạo chưa lưu thì.. trật lất!
 
Lần chỉnh sửa cuối:
Bài này dễ ồm... nếu tui có học qua Access, SQL, ADO...
Hổng học, biết chết liền!
Ẹc... Ẹc... --=0
---------------------------
Phát hiện 1 chiện: Code chỉ đúng với file đã lưu, có tên đàng hoàng. Còn với file mới tinh vừa tạo chưa lưu thì.. trật lất!
Hihi, ADO nó chỉ làm việc với dữ liệu rõ ràng, mà rõ ràng là dữ liệu phải được tồn tại trong đĩa cứng. Nếu file chưa lưu hoặc file mới sẽ bị vấn đề.
 
Em nghĩ chắc tại các thành viên trên GPE ít người biết về ADO nên không có câu trả lời ạ!
không phải là người ta không biết đâu bạn, mà ADO đối với excel không mạnh bằng các ngôn ngữ khác chẳng hạn SQL, ACCESS, oracle, ..., ADO chẳng qua nó là công cụ giúp bạn thao tác trên các bảng với dữ liệu thông qua các phép kết.
học cái này chơi thì được chứ muốn làm việc đàng hoàng thì phải phải biết thiết kế CSLD
như thế nào? biết thiết kế vật lý các bảng như thế nào, các phép kết gì, cái nào là khóa chính cái nào là khóa ngoại, sau đó tạo giao diện truy vấn như thế nào? và cuối cùng là cài đặt chương trình?
cài đặt chương trình này chẳng có gì khó nếu bạn hiểu các quy trình làm việc của ứng dụng, quanh đi quẩn lại cũng có mấy câu kết nối và vài câu truy vấn dữ liệu
(đó là theo hiểu biết của tôi)
 
không phải là người ta không biết đâu bạn, mà ADO đối với excel không mạnh bằng các ngôn ngữ khác chẳng hạn SQL, ACCESS, oracle, ..., ADO chẳng qua nó là công cụ giúp bạn thao tác trên các bảng với dữ liệu thông qua các phép kết.
học cái này chơi thì được chứ muốn làm việc đàng hoàng thì phải phải biết thiết kế CSLD
như thế nào? biết thiết kế vật lý các bảng như thế nào, các phép kết gì, cái nào là khóa chính cái nào là khóa ngoại, sau đó tạo giao diện truy vấn như thế nào? và cuối cùng là cài đặt chương trình?
cài đặt chương trình này chẳng có gì khó nếu bạn hiểu các quy trình làm việc của ứng dụng, quanh đi quẩn lại cũng có mấy câu kết nối và vài câu truy vấn dữ liệu
(đó là theo hiểu biết của tôi)

Nói thì nói vậy thôi chứ theo mình nghĩ: "Biết" là một chuyện. Từ cái chỗ "biết" ấy, để đạt đến mức độ "tung hoành ngang dọc" tùy ý như Hai Lúa vẫn còn quảng đường dài (thậm chí là quá dài)
 
không phải là người ta không biết đâu bạn, mà ADO đối với excel không mạnh bằng các ngôn ngữ khác chẳng hạn SQL, ACCESS, oracle, ..., ADO chẳng qua nó là công cụ giúp bạn thao tác trên các bảng với dữ liệu thông qua các phép kết.
học cái này chơi thì được chứ muốn làm việc đàng hoàng thì phải phải biết thiết kế CSLD
như thế nào? biết thiết kế vật lý các bảng như thế nào, các phép kết gì, cái nào là khóa chính cái nào là khóa ngoại, sau đó tạo giao diện truy vấn như thế nào? và cuối cùng là cài đặt chương trình?
cài đặt chương trình này chẳng có gì khó nếu bạn hiểu các quy trình làm việc của ứng dụng, quanh đi quẩn lại cũng có mấy câu kết nối và vài câu truy vấn dữ liệu
(đó là theo hiểu biết của tôi)

Lý thuyết là thế, lý thuyết để hướng cho mình cách nhìn toàn cục và định hướng cho mình, còn việc vận dụng và phát triển thì phải tự thân vận động bạn à.
Chổ màu đỏ bạn nhận xét hơi chủ quan tí. Công nghệ càng phát triển thì cách thức thay đổi đó là điều hẳn nhiên. Nếu như ta không chạy theo thì ta bị lạc hậu. Hiện nay có nhiều công cụ hỗ trợ mà không cần viết các câu truy vấn phức tạp như thế, tôi đưa ví dụ là LINQ to SQL là ví dụ điển hình.

Em nghĩ chắc tại các thành viên trên GPE ít người biết về ADO nên không có câu trả lời ạ!
Anh có thể cho 1 vài bài tập dễ không ạ?

Không phải thế đâu bạn, có thể đề tài này bị "chìm" nên mọi người chưa tiếp cận được.
Những bài tập dễ thì bạn có thể qua Bài tập về ADO căn bản. để tham khảo nhé.
 
Lần chỉnh sửa cuối:
Nếu như ta không chạy theo thì ta bị lạc hậu. Hiện nay có nhiều công cụ hỗ trợ mà không cần viết các câu truy vấn phức tạp như thế, tôi đưa ví dụ là LINQ to SQL là ví dụ điển hình.
Đúng là như anh nói, với công nghệ kéo thả hiện nay có thể giúp chúng ta viết các câu truy vấn phức tạp(nhưng không phải là tât cả), giúp chúng ta làm được những việc mà chúng ta cần mặc dù chúng ta không hiểu nguyên lý tại sao ra như vậy? nhưng học như vậy muốn phát triển thêm thì hơi bị khó đó
ví dụ điển hình rõ nhất là các đối tượng,
chẳng hạn trong VBA đi, chúng ta biết Range là 1 đối tượng có rất nhiều thuộc tính, phương thức nhưng chúng ta đâu biết nó được tạo ra như thế nào và cấu trúc ra làm sao, chúng ta chỉ cần biết ứng dụng là được. lỡ sau này chúng ta muốn tạo thêm 1 đối tượng nào đó thì chúng ta thiết kế như thế nào định nghĩa ra làm sao?
có khi nào anh nghĩ mình có thể tạo ra một đối tượng truy vấn cho riêng mình không?
ví dụ như quản lý học sinh
một đối tượng học sinh có những thuộc tính gì? có những hành động gì ..., những cái này thì không có cái nào giúp mình, chỉ có thể tự thân vận động code thôi
(em nói như vậy là để biết các ngôn ngữ hiện đại chỉ giúp chúng ta giải quyết được phần ngọn thôi)
 
Đúng là như anh nói, với công nghệ kéo thả hiện nay có thể giúp chúng ta viết các câu truy vấn phức tạp(nhưng không phải là tât cả), giúp chúng ta làm được những việc mà chúng ta cần mặc dù chúng ta không hiểu nguyên lý tại sao ra như vậy? nhưng học như vậy muốn phát triển thêm thì hơi bị khó đó
ví dụ điển hình rõ nhất là các đối tượng,
chẳng hạn trong VBA đi, chúng ta biết Range là 1 đối tượng có rất nhiều thuộc tính, phương thức nhưng chúng ta đâu biết nó được tạo ra như thế nào và cấu trúc ra làm sao, chúng ta chỉ cần biết ứng dụng là được. lỡ sau này chúng ta muốn tạo thêm 1 đối tượng nào đó thì chúng ta thiết kế như thế nào định nghĩa ra làm sao?
có khi nào anh nghĩ mình có thể tạo ra một đối tượng truy vấn cho riêng mình không?
ví dụ như quản lý học sinh
một đối tượng học sinh có những thuộc tính gì? có những hành động gì ..., những cái này thì không có cái nào giúp mình, chỉ có thể tự thân vận động code thôi
(em nói như vậy là để biết các ngôn ngữ hiện đại chỉ giúp chúng ta giải quyết được phần ngọn thôi)

Hoàn toàn khác với suy nghĩ bài 16, ý tôi muốn diễn đạt là cái suy nghĩ của bạn trong bài 16 là chỉ vài kiểu truy vấn và kết nối thì vẫn là vài kiểu truy vấn và kết nối, không khác và không phát triển hơn được. Còn chuyện tự tạo cho mình những controls thì đó là chuyện khác.
Chổ màu đỏ cũng không hẳn đúng. Mỗi một kết quả có nhiều phương thức và cách làm khác nhau. Tội gì ta không áp dụng những cái mới, những cái mà ta cho là tiện ích hơn cái trước đó.
Ví dụ bây giờ ít ai dùng pascal cho việc lập trình ứng dụng, và nhiều thứ khác... Thôi tôi xin dừng tranh luận vấn đề này ở đây, kẻo làm loãn đề tài.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom