Lấy dữ liệu từ Access điền vào Listbox (1 người xem)

  • Thread starter Thread starter vbavn
  • Ngày gửi Ngày gửi
Liên hệ QC

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

vbavn

Thành viên chính thức
Tham gia
10/1/08
Bài viết
70
Được thích
145
(Nguồn: http://www.excelguru.ca/node/20)

_Mục đích: Lấy dữ liệu từ bảng trong Access điền vào Listbox của Userform.
_Chú ý: không hiện tiêu đề cột.
_Phiên bản làm việc từ Ms Office 2003 trở về trước.
_Yêu cầu:
+ Tham chiếu đến "Microsoft ActiveX Data Objects Libary"
+ Chú ý đường dẫn tới bảng CSDL
+ Đoạn mã nên đặt vào thủ tục sự kiện Userform_Initialize

Mã:
Option Explicit
'Set reference to the Microsoft ActiveX Data Objects x.x Library!

'Global constants required
Const glob_sdbPath = "C:\Temp\FoodTest.mdb"
Const glob_sConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & glob_sdbPath & ";"

Private Sub PopulateSuppliers()
'Author       : Ken Puls ([URL="http://www.excelguru.ca/"]www.excelguru.ca[/URL])
'Macro Purpose: Populate the listbox with all values from the Access database

Dim cnt     As New ADODB.Connection
Dim rst     As New ADODB.Recordset
Dim rcArray As Variant
Dim sSQL    As String

'Set the location of your database, the connection string and the SQL query
sSQL = "SELECT tblSuppliers.SupplierName, tblSuppliers.SupplierNumber " & _
    "FROM tblSuppliers ORDER BY tblSuppliers.SupplierName;"

'Open connection to the database
cnt.Open glob_sConnect
    
'Open recordset and copy to an array
rst.Open sSQL, cnt
rcArray = rst.GetRows

'Place data in the listbox
With Me.lbSuppliers
    .Clear
    .ColumnCount = 2
    .List = Application.Transpose(rcArray)
    .ListIndex = -1
End With

'Close ADO objects
rst.Close
cnt.Close
Set rst = Nothing
Set cnt = Nothing

End Sub

VBAVN
 
To vbavnMấy bài viết của bạn rất hay. Cho mình hỏi một vấn đề này nhéForm nhập liệu của mình có một Combobox để đưa danh sách mã tài khoản từ Access vào. Column của Combo là 2 (MTK va TenTK), khi lấy dữ liệu phải đưa vào cả hai Column trên theo thứ tự có trong table của Acces, đồng thời phải sử dụng được đặc tính Combobox.column(..). Bạn có thể giúp mình cái này được không?Cảm ơn trước nhé
 
ComboBox

Chào bạn anhthuan,

Tôi không hiểu ý bạn cho lắm. Nhưng nếu muốn đưa dữ liệu vào ComboBox thì cũng tương tự thôi.
Tôi đã đưa ví dụ vào file đính kèm. Bạn xem file đính kèm nha.

VBAVN
 

File đính kèm

vbavn đã viết:
Chào bạn anhthuan,

Tôi không hiểu ý bạn cho lắm. Nhưng nếu muốn đưa dữ liệu vào ComboBox thì cũng tương tự thôi.
Tôi đã đưa ví dụ vào file đính kèm. Bạn xem file đính kèm nha.

VBAVN

Thanks, đúng ý của mình rồi. Nhưng dong code nay lai bao loi

Private Sub UserForm_Activate()
Dim rcarray
Set rst = New ADODB.Recordset
With rst
QL = "select [ma],[ten]from [mtk]"
.Open QL, cnn
rcarray = .GetRows
End With
With Me.ComboBox2
.ColumnCount = 2
.List = Application.Transpose(rcarray)
.ListIndex = -1
End With
end sub

Bao loi tai dong: .List = Application.Transpose(rcarray)
Không hiểu tại sao nữa
 
Lần chỉnh sửa cuối:
Trong ví dụ tôi đưa cho bạn, tôi đã thử mà không có lỗi xãy ra.
Bạn vui lòng kiểm tra lại và chụp màn hình xem đó là lỗi gì không?

VBAVN
 
vbavn đã viết:
Trong ví dụ tôi đưa cho bạn, tôi đã thử mà không có lỗi xãy ra.
Bạn vui lòng kiểm tra lại và chụp màn hình xem đó là lỗi gì không?

VBAVN
Cam ơn, cái này mình tìm ra lỗi rồi. Do nguyên nhân mình đặt rowsource và column của combobox. Xóa những cái này đi là OK.

Mình xin hỏi thêm vấn đề nữa: nếu trong file Access của mình chỉ có một dòng record, khi chuyển sang theo kiểu Transpose nó sẽ không hiện đúng định dạng mong muốn. Ví dụ kiểu dữ liệu mình có là 1 2 3 4 được xếp hàng ngang, nhưng khi Transpose sang combbox thì nó hiện lên là 1
2
3
(Transpose chỉ hiện đúng khi file Access có từ hai record trở lên)
Vậy làm cách nào để khi chỉ có một dòng bên file Access nó cũng hiện đúng định dạng 1 2 3 4 ??

Cảm ơn bạn
 
To: anhthuan,
Cám ơn bạn đã chỉ ra lỗi này.
Chúng ta hãy đi từ Help xem sao? Thông tin của List property như sau:

ListProperty.jpg


Vậy chúng ta hãy chú ý ở phần đóng khung màu đỏ.
Trong trường hợp này (tức là chỉ có một record) theo tôi có thể gán trực tiếp:
Mã:
ReDim rcArr(0, 1)
rcArr(0, 0) = rst.Fields("MaHang").Value
rcArr(0, 1) = rst.Fields("TenHang").Value
Sau đó chúng ta có thể gán mảng này cho thuộc tính List của ComboBox

Như vậy theo tôi là giải quyết được vấn đề. Mọi vấn đề chúng ta vẫn có thể : Google + VBE Help

VBAVN
 
Các bài này rất hay.
Em hỏi thêm và Mảng. và vấn đề là có thể tạo rcarray thành mảng 2 chiều như thế nào.???
Em chưa hiểu về mảng lắm nên nhờ bác vbavn chì giúp vấn đề này.
Cám ơn bác
 
Bạn tham khảo ở đây nha:

Mã:
Private Sub PopulateSuppliers()
'Author  : Ken Puls (www.excelguru.ca)
'Macro Purpose: Populate the listbox with all values from the Access database

Dim cnt     As New ADODB.Connection
Dim rst     As New ADODB.Recordset
Dim rcArray As Variant
Dim sSQL    As String

'Set the location of your database, the connection string and the SQL query
sSQL = "SELECT tblSuppliers.SupplierName, tblSuppliers.SupplierNumber " & _
    "FROM tblSuppliers ORDER BY tblSuppliers.SupplierName;"
sSQL = "select FirstName, LastName from Contacts WHERE FirstName = 'Lynne'"

'Open connection to the database
cnt.Open glob_sConnect
    
'Open recordset and copy to an array
rst.Open sSQL, cnt
rcArray = rst.GetRows

'Place data in the listbox
[COLOR=Red][B]With Me.lbSuppliers
    .Clear
    .ColumnCount = 2
    If LBound(rcArray, 2) = UBound(rcArray, 2) Then
      .AddItem rcArray(LBound(rcArray, 1), LBound(rcArray, 2))
      .List(0, 1) = rcArray(LBound(rcArray, 1) + 1, LBound(rcArray, 2))
    Else
      .List = Application.Transpose(rcArray)
    End If
    .ListIndex = -1
End With[/B][/COLOR]

'Close ADO objects
rst.Close
cnt.Close
Set rst = Nothing
Set cnt = Nothing
End Sub
VBAVN
 
Mình muốn khi nhập dữ liệu vào 1 trường có dùng Combo nhưng giá trị trong Combo chưa có thì bổ sung giá trị vào nguồn Combo như thế nào cho nhanh nhát , nếu có code thì càng hay , giúp mình với , cảm ơn các ban!
 
Web KT

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

Back
Top Bottom