Nhờ anh chị giúp đỡ xử lý mảng trong vba

Liên hệ QC

huuphuoc1204

Thành viên mới
Tham gia
17/12/09
Bài viết
42
Được thích
5
Chào anh chị trên diễn đàn em có một function tên getArray, sử dụng sql để đưa mảng ra bảng tính. Nhưng kết quả trả về là một chuỗi nối liền trong một ô thay vì một mảng gồm số hàng và số cột. File em đính kèm bên dưới. Nhờ anh chị giúp đỡ với ạ, cám ơn!
 

File đính kèm

Chào anh chị trên diễn đàn em có một function tên getArray, sử dụng sql để đưa mảng ra bảng tính. Nhưng kết quả trả về là một chuỗi nối liền trong một ô thay vì một mảng gồm số hàng và số cột. File em đính kèm bên dưới. Nhờ anh chị giúp đỡ với ạ, cám ơn!
Lấy một số dòng cột thì nhập = .... bình thường, cần gì hàm tự tạo
 
Lấy một số dòng cột thì nhập = .... bình thường, cần gì hàm tự tạo
Em đang thử trích lọc mảng trong excel bằng function sql, thấy hay nên muốn học mà ko thấy ai hướng dẫn tạo function cả. Chỉ thấy làm bằng thủ tục sub ko à. Đang mày mò đoạn code trên nhưng không biết cách đọc mảng trong recordset và trả về function kết quả theo dòng và cột nhìn thế nào?!anh biết thì giúp em đc ko?!
 
Chào anh chị trên diễn đàn em có một function tên getArray, sử dụng sql để đưa mảng ra bảng tính. Nhưng kết quả trả về là một chuỗi nối liền trong một ô thay vì một mảng gồm số hàng và số cột. File em đính kèm bên dưới. Nhờ anh chị giúp đỡ với ạ, cám ơn!
Thử code
Mã:
Function getArray(strSql As String) As Variant
    Dim rs As ADODB.Recordset, Res()
    Dim i As Long, j As Integer, sRow As Long, sCol As Integer

    Set rs = getRs(strSql)
    sRow = rs.RecordCount
    sCol = rs.Fields.Count
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
        For j = 1 To sCol
          Res(i, j) = rs(j - 1)
        Next j
        rs.MoveNext
    Next i
    Set rs = Nothing
    getArray = Res
End Function
 
Thử code
Mã:
Function getArray(strSql As String) As Variant
    Dim rs As ADODB.Recordset, Res()
    Dim i As Long, j As Integer, sRow As Long, sCol As Integer

    Set rs = getRs(strSql)
    sRow = rs.RecordCount
    sCol = rs.Fields.Count
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
        For j = 1 To sCol
          Res(i, j) = rs(j - 1)
        Next j
        rs.MoveNext
    Next i
    Set rs = Nothing
    getArray = Res
End Function
Cám ơn anh rất nhiều!Em đã làm được.Có thể lấy luôn tiêu đề và tự co giãn dòng không làm mất footer (ví dụ Người nhận) được ko anh?! Nếu được thì quá tốt. Em đang tự học vba mà còn kém quá.Hic
 
Lần chỉnh sửa cuối:
Cám ơn anh rất nhiều!Em đã làm được.Có thể lấy luôn tiêu đề và tự co giãn dòng không làm mất footer (ví dụ Người nhận) được ko anh?! Nếu được thì quá tốt. Em đang tự học vba mà còn kém quá.Hic
"lấy luôn tiêu đề": Lấy vùng nào là do "đặt tên" vùng dữ liệu
"tự co giãn dòng": Function chỉ tính kết quả không tác động đến bảng tính được
 
"lấy luôn tiêu đề": Lấy vùng nào là do "đặt tên" vùng dữ liệu
"tự co giãn dòng": Function chỉ tính kết quả không tác động đến bảng tính được
Tiêu đề bảng không lấy được, mặc dù em đã đặt tên vùng dữ liệu bao gồm cả tiêu đề, bảng em gửi lên ở bài #1 đặt tên vùng bao gồm cả tiều đề rồi. Em coi lại code anh viết để học, nếu sửa đoạn code sau thành :
Res(i, j) = rs(j - 1).name thì nó lấy được tiêu đề nhưng phần dưới thì ko có nó lặp toàn tiêu đề không!
 
Tiêu đề bảng không lấy được, mặc dù em đã đặt tên vùng dữ liệu bao gồm cả tiêu đề, bảng em gửi lên ở bài #1 đặt tên vùng bao gồm cả tiều đề rồi. Em coi lại code anh viết để học, nếu sửa đoạn code sau thành :
Res(i, j) = rs(j - 1).name thì nó lấy được tiêu đề nhưng phần dưới thì ko có nó lặp toàn tiêu đề không!
Chỉnh lại
Mã:
Function getRs(strSql As String) As ADODB.Recordset
    Dim strCn As String
    strCn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
    ThisWorkbook.FullName _
& ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
    Set getRs = New ADODB.Recordset
    getRs.Open strSql, strCn, adOpenStatic, adLockReadOnly
End Function
 
Chỉnh lại
Mã:
Function getRs(strSql As String) As ADODB.Recordset
    Dim strCn As String
    strCn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
    ThisWorkbook.FullName _
& ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
    Set getRs = New ADODB.Recordset
    getRs.Open strSql, strCn, adOpenStatic, adLockReadOnly
End Function
Thì ra sửa HDR=yes thành HDR=No. Thank anh nhiều nha!!!
 
Chú ý lúc đó coi như không có tiêu đề, nhưng lại thực chất có tiêu đề (trong thực tế)
Cái này rất dễ làm sai kiểu dữ liệu - cứ găm lại có lúc gặp.
Uhm.khi em sửa lại như trên thì viết code : "select* from data" thì đúng là nó lấy luôn vùng dữ liệu gồm có tiêu đề, nhưng viết code trích lọc "select* from data where (ngoặc vuông) Hàng ( ngoặc vuông) bằng 'Nho'" thì nó lỗi. Thế là sửa lại HDR bằng yes thì lại chạy ngon lành nhưng lại giống lúc đầu ko có tiêu đề. Ko hiểu tại sao nữa?!
 
Lần chỉnh sửa cuối:
Uhm.khi em sửa lại như trên thì viết code : "select* from data" thì đúng là nó lấy luôn vùng dữ liệu gồm có tiêu đề, nhưng viết code trích lọc "select* from data where (ngoặc vuông) Hàng ( ngoặc vuông) bằng 'Nho'" thì nó lỗi. Thế là sửa lại HDR bằng yes thì lại chạy ngon lành nhưng lại giống lúc đầu ko có tiêu đề. Ko hiểu tại sao nữa?!

Thi HDR=No, lúc đó coi tiêu đề như Dữ liệu vậy thôi, muốn lọc thì coi là column là f1 f2 ...vv nhưng dễ sai vì nó coi tiêu đề dữ liệu
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom