Đố vui về ADO, DAO.

Blue Softs Liên hệ QC

thuyyeu99

Trùm Nhiều Chuyện
Tham gia
6/6/08
Bài viết
1,721
Được thích
863
Mã:
Sub GetFiled_Thuyyeu99()
Dim SheetName As String
Dim cn As Object, rs As Object, arr() As Variant
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
SheetName = InputBox(prompt:="Nhap ten Sheet", Title:="Lay Filed tren Excel", Default:="Sheet1")
If StrPtr(SheetName) = 0 Then Exit Sub
If SheetName = NullString Then Exit Sub
    SheetName = SheetName & "$"
cn.Open _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "data source=" & ThisWorkbook.FullName & ";" & _
                "extended properties=excel 12.0 macro;"
Set rs = cn.OpenSchema(4, Array(Empty, Empty, SheetName))
arr = rs.GetRows(, , "COLUMN_NAME")
ActiveCell.Resize(UBound(arr, 2) - LBound(arr, 2) + 1, 1).Value = Application.Transpose(arr)
rs.Close
cn.Close
End Sub
 

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,141
Được thích
15,443
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Mã:
Sub GetFiled_Thuyyeu99()
Dim SheetName As String
Dim cn As Object, rs As Object, arr() As Variant
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
SheetName = InputBox(prompt:="Nhap ten Sheet", Title:="Lay Filed tren Excel", Default:="Sheet1")
If StrPtr(SheetName) = 0 Then Exit Sub
If SheetName = NullString Then Exit Sub
    SheetName = SheetName & "$"
cn.Open _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "data source=" & ThisWorkbook.FullName & ";" & _
                "extended properties=excel 12.0 macro;"
Set rs = cn.OpenSchema(4, Array(Empty, Empty, SheetName))
arr = rs.GetRows(, , "COLUMN_NAME")
ActiveCell.Resize(UBound(arr, 2) - LBound(arr, 2) + 1, 1).Value = Application.Transpose(arr)
rs.Close
cn.Close
End Sub
Chính xác là chỗ đó, đáp án như sau:

Mã:
Sub ColumnsName_HLMT()
    Dim Arr() As Variant
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ThisWorkbook.FullName + ";Extended Properties=""Excel 12.0"";")
        Arr = .OpenSchema(4, Array(Empty, Empty, "Sheet2$", Empty)).getrows(, , "COLUMN_NAME")
    End With
    ActiveCell.Resize(UBound(Arr, 2) + 1, 1).Value = Application.Transpose(Arr)
End Sub
 

Kiều Mạnh

IIIIIIIIIIIIIIIII
Tham gia
9/6/12
Bài viết
4,558
Được thích
3,214
Giới tính
Nam
Lâu quá không trở lại đề tài này, hôm nay mình xin đố các bạn là làm sao lấy được danh sách tên cột của một bảng cho trước mà không dùng vòng lặp?
Trong file mẫu tôi gửi có 3 sheets (Sheet1, Sheet2, Sheet3), và 1 sheet KetQua. Khi tôi muốn lấy tên cột của sheet nào thì nó lấy kết quả tên cột của sheet ấy.

View attachment 241663

Không xài chữ to mà xài Application.Transpose
Mạnh đoán là hàm đó Bill cũng chạy 2 dòng For đấy
 

Kiều Mạnh

IIIIIIIIIIIIIIIII
Tham gia
9/6/12
Bài viết
4,558
Được thích
3,214
Giới tính
Nam
:) Anh cũng dùng ADO OpenSchema nhưng lại không biết chuyển thành array như thế nào... Ai ngờ cái getRows có các tham số như vậy, đúng là chưa khai thác hết nó... hehe.
quậy đi là viết SQL OK đó ... lâu nay Mạnh đang xài nó ... biết vài tháng nay rồi từ trước khi Ông gì hỏi trên GPE lấy SheetName đó
bài số 4 link sau
1595493079874.png
 
Lần chỉnh sửa cuối:

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,141
Được thích
15,443
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
quậy đi là viết SQL OK đó ... lâu nay Mạnh đang xài nó ... biết vài tháng nay rồi từ trước khi Ông gì hỏi trên GPE lấy SheetName đó
bài số 4 link sau
View attachment 241689
Thật ra cái vụ tên sheet và tên cột đã được HLMT đố vui hồi năm 2015, tuy nhiên nó nằm ở đề tài khác, không nằm ở đây nên muốn "đố lại" cho "đủ bộ"

Tên sheet
1595554209827.png
Tên cột

1595554278241.png

 

Kiều Mạnh

IIIIIIIIIIIIIIIII
Tham gia
9/6/12
Bài viết
4,558
Được thích
3,214
Giới tính
Nam
Thật ra cái vụ tên sheet và tên cột đã được HLMT đố vui hồi năm 2015, tuy nhiên nó nằm ở đề tài khác, không nằm ở đây nên muốn "đố lại" cho "đủ bộ"

Tên sheet
View attachment 241716
Tên cột

View attachment 241717

Trên GPE này có rất nhiều code rất chi là hay ... quan trọng ai đó có biết vận dụng và kết hợp nó lại hay ko đó thôi ...!!!???
kết hợp 2 cái đó lại viết thêm cái hàm nối chuỗi nữa là có 1 cái SQL tùy chọn đấy .... ( Mạnh lấy ý tưởng từ đó )
Hy vọng có cái SQL cho Excel + Access thứ 2 + n xuất hiện trên GPE

Ngay cái Hàm Value kiểu Office 365 trên VBA Mạnh viết OK mà ko có liên quan gì tới khai báo API cả ... Nếu ai đó đam mê kiên trì mò là ra -0-0-0-
 

Kiều Mạnh

IIIIIIIIIIIIIIIII
Tham gia
9/6/12
Bài viết
4,558
Được thích
3,214
Giới tính
Nam
Thấy mục này đang hay ... Tiếp theo Mạnh đố chứ ko có hỏi nhe
Câu lệnh SQL sau quá dài vậy có câu nào khác thay thế nó mà mục đích y trang vậy mà ngắn nhất hay ko ???
Mã:
sSQL = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES " & _
           "WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='" & Me.cboDatabaseName & "'"
Nếu lấy phần sau rồi đếm nó thì có 98 ký tự ( Len(SQL) )
Mã:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG
Với câu SQL trên Mạnh viết lại chỉ có 36 ký tự
Xin mời góp vui 1 tí
 

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,141
Được thích
15,443
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Thấy mục này đang hay ... Tiếp theo Mạnh đố chứ ko có hỏi nhe
Câu lệnh SQL sau quá dài vậy có câu nào khác thay thế nó mà mục đích y trang vậy mà ngắn nhất hay ko ???
Mã:
sSQL = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES " & _
           "WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='" & Me.cboDatabaseName & "'"
Nếu lấy phần sau rồi đếm nó thì có 98 ký tự ( Len(SQL) )
Mã:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG
Với câu SQL trên Mạnh viết lại chỉ có 36 ký tự
Xin mời góp vui 1 tí
Nó nằm trong cái sys.Tables. Nếu dùng câu lệnh ngắn hơn để lấy danh sách Table thì có thể vào đây lấy.
Mã:
Select name from sys.Tables
 

Kiều Mạnh

IIIIIIIIIIIIIIIII
Tham gia
9/6/12
Bài viết
4,558
Được thích
3,214
Giới tính
Nam
Anh hơi vui tính, nó không những cho lấy được từ những cái trên mà còn hơn thế nữa. Vì sao thì ai cũng có thể hiểu.
Vì ngày qua có hỏi thớt bên kia cái chuỗi đó sao trên Delphi nó Ứ có chạy ... mò diết tối qua mới biết...
vậy là cái chuỗi đó là ok nhất chạy chung cho tất cả đó
 

ongke0711

Thành viên tích cực
Tham gia
7/9/06
Bài viết
1,082
Được thích
1,293
Giới tính
Nam
Vì ngày qua có hỏi thớt bên kia cái chuỗi đó sao trên Delphi nó Ứ có chạy ... mò diết tối qua mới biết...
vậy là cái chuỗi đó là ok nhất chạy chung cho tất cả đó

Vụ này ngộ à.
Cùng là câu lệnh truy vấn Table hệ thống của SQL Server mà có Table cho lấy dữ liệu, có Table không chạy được là sao nhỉ?
Bạn dùng SQL Server phiên bản bao nhiêu?
Mỗi Table hệ thống của SQL SV đều chứa những thông tin riêng của nó, tuỳ nhu cầu, tính tiện dụng mà sử dụng thôi.
Cách ngắn nữa: chạy "Exec sp_tables" :D
 
Lần chỉnh sửa cuối:

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,141
Được thích
15,443
Giới tính
Nam
Nghề nghiệp
Làm ruộng.

Kiều Mạnh

IIIIIIIIIIIIIIIII
Tham gia
9/6/12
Bài viết
4,558
Được thích
3,214
Giới tính
Nam
Vụ này ngộ à.
Cùng là câu lệnh truy vấn Table hệ thống của SQL Server mà có Table cho lấy dữ liệu, có Table không chạy được là sao nhỉ?
Bạn dùng SQL Server phiên bản bao nhiêu?
Mỗi Table hệ thống của SQL SV đều chứa những thông tin riêng của nó, tuỳ nhu cầu, tính tiện dụng mà sử dụng thôi.
Cách ngắn nữa: chạy "Exec sp_tables" :D
cái này là do Delphi mình khai báo nó chưa có hiễu hay là xài TADOConnection.Create(nil); mà cách khai báo khác nó mới hiểu
Thớt bên kia ngày qua Mạnh có mô tả đó bài 44

Vậy là cái SQL Server Ms trên Delphi của Mạnh có tùy chọn TableName + Cột lấy dữ liệu cơ bản đã xong
-0-0-0-
 
Top Bottom