LẤY DỮ LIỆU TỰ NGUỒN VÀO LISTBOX

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Xin Chào Các Anh Chị GPE,

Em có một thắc mắc mong anh chị hỗ trợ giúp.
Mục đích là muốn lấy dữ liệu từ server SQL thẳng xuống Listbox.

code của em bên dưới mà nó chỉ lấy có dòng tiêu đề mà không phải là hàng ngang mà chỉ có 1 cột

Rất chờ sự giúp đỡ của anh chị. xin cảm ơn ạ,

Private Sub CommandButton2_Click()
    Dim i As Long, k As Long
    Dim lArr()
    Dim cnnDb As New cnnDatabase
    Set cnnDb = New cnnDatabase
     cnnDb.Get_Record ("SELECT A.ORDNO, A.REFNO, A.FITEM, A.FDESC, A.ITCL, A.ORQTY, A.QTDEV, A.QTYRC, (A.ORQTY+ A.QTDEV-A.QTYRC) AS OPEN,A.SSTDT, A.ODUDT, A.JOBNO, A.OSTAT " & _
              "FROM G20ACF9V.AMFLIBW.MOMAST A " & _
              "WHERE substr(A.ORDNO,1,2) = 'MS' " & _
              "ORDER BY A.REFNO,A.ODUDT")

With ListBox1
        For i = 0 To cnnDb.adors.Fields.Count - 1
            .AddItem
            .List(k) = cnnDb.adors.Fields(i).Name
            k = k + 1
        Next i
      End With

msgbox "Done"
End Sub

2760

For i = 0 To cnnDb.adors.Fields.Count – 1
.AddItem .List(k) = cnnDb.adors.Fields(i).Name
k = k + 1

Next i
Code này là code lấy tên cột của bảng rồi đưa vào ListBox là đúng rồi. Nhưng tôi chưa thấy thêm code đưa dữ liệu vào.

Bạn thử gán dữ liệu đó vào mảng (Mảng KQ ) rồi sau đó nạp vào listbox .Với lại trong listbox có phần chỉnh số code hiện thị nữa

.ColumnCount = 'bao nhiêu cột
.List() = KQ

Nạp như bạn thì phải xoay mảng lại nữa mới đạt yêu cầu nhé.

Dạ em làm vậy mà cũng hong được hic

With ListBox1
      ReDim lArr(1 To 1, 1 To col)
        For i = 0 To cnnDb.adors.Fields.Count - 1
            lArr(1, k) = cnnDb.adors.Fields(i).Name
            k = k + 1
        Next i

For i = 1 To UBound(lArr, 2)
        .AddItem
        .List = Application.WorksheetFunction.Transpose(lArr)
    Next i
    End With

Gán thẳng mảng nó vào thuộc tính .Column luôn là được. Không cần chuyển mảng nha bạn.

Bỏ hết đi rồi thử 1 dòng này

ListBox1.List()= Application.WorksheetFunction.Transpose(lArr)

Chú ý phải chỉnh Listbox1.ColumnCount= <số cột cần chứa trước đã>

Xem kỹ kết quả, Sau đó nếu muốn thêm tiêu đề
Thì xem lại cách AddItem cơ bản vào listbox lần lượt thế nào

Nên dùng cách bài 5 tôi đã giới thiệu sẽ khỏi chuyển mảng. Hàm chuyển mảng trên sẽ bị lỗi trong vài trường hợp.

Bài đó nhằm mục tiêu cho người hỏi hiểu về .List()
Đúng là nếu lỗi với transpose thì nên tự xây dựng hàm Transpose trong VBA cho gọn

Thử gán bằng -1 xem.

Không có điều kiện thử, để người hỏi thử và phản hồi nhé

Em thử như vầy nó ra nè. nhưng không biết có bị ảnh hưởng gì không nếu chạy máy khác ạ.

Private Sub CommandButton2_Click()
    Dim i As Long, rCol As Long
    Dim getArray As Variant
    Dim cnnDb As New cnnDatabase
    Set cnnDb = New cnnDatabase
     cnnDb.Get_Record ("SELECT A.ORDNO, A.REFNO, A.FITEM, A.FDESC, A.ITCL, A.ORQTY, A.QTDEV, A.QTYRC, (A.ORQTY+ A.QTDEV-A.QTYRC) AS OPEN,A.SSTDT, A.ODUDT, A.JOBNO, A.OSTAT " & _
              "FROM G20ACF9V.AMFLIBW.MOMAST A " & _
              "WHERE substr(A.ORDNO,1,2) = 'MS' " & _
              "ORDER BY A.REFNO,A.ODUDT")

With cnnDb.adors
        Set .ActiveConnection = Nothing 'Disconnect the recordset.
        rCol = .Fields.Count
        getArray = .GetRows
    End With

cnnDb.adors.Close

With ListBox1
            .Clear
            .ColumnCount = rCol
            .ColumnHeads = True
            .List = Application.Transpose(getArray)
            .ListIndex = -1
        End With

msgbox "Done"
End Sub

2761

Bạn vẫn dùng List, như tôi đã nói bài số 5, chắc chắn sẽ gặp lỗi nếu như bạn không dùng hàm chuyển mảng tự tạo. Tôi ví dụ bạn thử xóa 1 vài cell trống ở dữ liệu rồi chạy code thử nhé.

Dạ, không có thuộc tính .Column anh ơi. chỉ có Fields à

Bó tay toàn tập.

Hiện tại bạn có

.List = Application.Transpose(getArray)

Tức bạn đang sử dụng LIST. Mà bài #5 nói phải dùng COLUMN, tức phải là

.Column =getArray

www.giaiphapexcel.com/diendan/threads/l%E1%BA%A4y-d%E1%BB%AE-li%E1%BB%86u-t%E1%BB%B0-ngu%E1%BB%92n-v%C3%80o-listbox.153528/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    Bó tay toàn tập.

    Hiện tại bạn có

    .List = Application.Transpose(getArray)

    Tức bạn đang sử dụng LIST. Mà bài #5 nói phải dùng COLUMN, tức phải là
    .Column =getArray

    Dạ, em mới tập tành thôi, xin lỗi .

    hình như kiểu này không gán được tiêu đề lên luôn đó Anh

    Vậy để đầy đủ phải làm sao anh? Cảm ơn

    Tôi có bàn về tiêu đề đâu? Người ta không hiểu bài #5 nên tôi giúp họ hiểu bài #5 thôi.

    Muốn có tiêu đề thực sự thì bỏ dùng List và Column đi, dùng RowSource đi. Còn nếu tiêu đề nhái thì sao lại không có tiêu đề khi dữ liệu lấy về có cả tiêu đề?

    Anh hướng dẫn giúp với , Cảm ơn anh nhiều

    Hướng dẫn cái gì?

    Khi bạn dùng .List = Application.Transpose(getArray) thì bạn có thấy cả TIÊU ĐỀ và cả DỮ LIỆU không?

    Bạn phải viết code sao cho nó lấy về cả TIÊU ĐỀ và cả DỮ LIỆU – tức sao cho trong getArray có cả tiêu đề và dữ liệu. Lúc đó thì dùng
    .List = Application.Transpose(getArray) hay .Column =getArray thì đều nhìn thấy cả TIÊU ĐỀ và cả DỮ LIỆU

    Em dùng như này nhưng không có tiêu đề.

    Private Sub CommandButton2_Click()
        Dim i As Long, rCol As Long
        Dim getArray As Variant
        Dim cnnDb As New cnnDatabase
        Set cnnDb = New cnnDatabase
         cnnDb.Get_Record ("SELECT A.ORDNO, A.REFNO, A.FITEM, A.FDESC, A.ITCL, A.ORQTY, A.QTDEV, A.QTYRC, (A.ORQTY+ A.QTDEV-A.QTYRC) AS OPEN,A.SSTDT, A.ODUDT, A.JOBNO, A.OSTAT " & _
                  "FROM G20ACF9V.AMFLIBW.MOMAST A " & _
                  "WHERE substr(A.ORDNO,1,2) = 'MS' " & _
                  "ORDER BY A.REFNO,A.ODUDT")
    
    With cnnDb.adors
            Set .ActiveConnection = Nothing 'Disconnect the recordset.
            rCol = .Fields.Count
            getArray = .GetRows
        End With
    
    cnnDb.adors.Close
    
    With ListBox1
                .Clear
                .ColumnCount = rCol
                .ColumnHeads = True
                .Column = getArray
                .ListIndex = -1
            End With
    
    msgbox "Done"
    End Sub

    Khi bạn không thấy tiêu đề thì đó là do trong mảng kết quả getArray không có tiêu đề chứ không do .List = Application.Transpose(getArray) mà cũng chả do .Column =getArray

    Viết code sao cho trong mảng trả về getArray có cả tiêu đề. Thế thôi.

    Trên GPE có hằng hà sa số code lấy về cả tiêu đề cả dữ liệu, vậy tìm đọc thôi.

    1/ để có 1 cái listbox có tiều đề xịn của nó thì cách sau là đơn giản nhất

    251527

    2/ Còn sử dụng ADODB lấy vào 1 Arr = Rs.GetRows xong gán vào như hình trên là ko thể …

    Tuy nhiên nếu lách lấy nó gán vào 1 name xong lấy ra từ cái name đó gán vào ListBox1.RowSource = "Name" thì tạm ok ===> quá lằng nhằng

    3/ còn hình sau là tây nó nói…
    2762
    4/ Còn 1 cách trên GPE này là họ làm giả cái tiêu đề bài #380
    [URL='www.giaiphapexcel.com/diendan/threads/c%C3%A1c-c%C3%A2u-h%E1%BB%8Fi-v%E1%BB%81-form-trong-excel-vba.58794/page-19#post-1002938']Các câu hỏi về Form trong Excel VBA | Page 19 | Giải Pháp Excel (giaiphapexcel.com)

    5/ File đính kèm là cho hình số 1

    6/ hy vọng ai đó có thể xài ADODB lấy vào 1 Array xong gán vào listbox có 1 cái tiêu đề mà ko phải làm giả nó Or xài name phụ -0-0-0-

    Nếu muốn listbox có tiêu đề giống như khi gán rowsource hay như listview mà không muốn tự làm (giả với sử dụng thêm listbox hay labels) thì đợi microsoft cập nhật vậy (chắc có lý do gì đó mà họ không làm )

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm