Tạo bảng chọn dữ liệu trong Excel

Liên hệ QC
Status
Không mở trả lời sau này.

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,436
Nghề nghiệp
Bác sĩ
TẠO BẢNG CHỌN DỮ LIỆU (DATA SELECTOR)

Bài của Lê văn Duyệt​

Trong các doanh nghiệp nhỏ dữ liệu thường được bố trí trên Excel. Một số chủ doanh nghiệp không quan tâm đến việc bố trí các dữ liệu này. Công việc thiết kế và sử dụng dữ liệu này hoàn toàn giao cho các kế toán viên. Một số kế toán viên khi thiết kế và bố trí các dữ liệu lại không quan tâm đến việc sử dụng lại các dữ liệu sau này khi doanh nghiệp phát triển. Việc thiết kế các bảng lưu trữ, các bảng mã cho khách hàng, nhân viên bán hàng, các sản phẩm bán ra,...là công việc rất quan trọng ban đầu để móc nối các dữ liệu với nhau trong công việc sử lý số liệu như: theo dõi công nợ, theo dõi doanh số, phân tích theo các yêu cầu...vv.

Vấn đề tôi đặt ra ở đây là khi móc nối các dữ liệu với nhau bạn sẽ phải làm việc nhiều đến việc lựa chọn một số mã từ các bảng mã. Làm sao để công việc lựa chọn của bạn được dễ dàng? Liệu Excel có cung cấp cho ta công cụ này không? Vâng, Excel có cung cấp cho ta một số công cụ nhưng theo kinh nghiệm bản thân, tôi nghĩ cách tốt nhất vẫn là tự mình thiết kế cho mình một bảng chọn. Còn các số liệu khác bạn có thể lấy ra từ các hàm chuẩn của Excel.

Ở đây tôi xin đưa ra một ví dụ nhỏ về việc tạo bảng chọn, để chọn mã sản phẩm từ bảng sản phẩm.

Ví dụ trong sheet MaSanPham, tôi có bảng mã sản phẩm như sau:

1/Đặt tên vùng :

Tôi đặt tên cho vùng A2:B570 có tên là MaSanPham. Bằng cách đánh dấu vùng A2:B570 vào Insert / Name / Define. Trong hộp thoại phần Names in Workbook bạn gõ và MaSanPham , sau đó nhấn nút OK.

2/ Phần 2 : Thiết kế form để người dùng chọn lựa mã sản phẩm.

Từ cửa sổ Excel bạn nhấn tổ hợp phím Alt + F11. Cửa sổ VBE xuất hiện, sau đó bạn chọn Insert/UserForm . Ta đặt tên form là frmDataSelector, thuộc tính Caption là Data Selector. Trên form ta đặt các đối tượng gồm có:

- 1 TextBox có tên là TxtCode
- 1 nút lệnh có tên là cmdOK
- 1 nút lệnh có tên là cmdCancel
- 1 ListView có tên là LVDataSelector. (Đối tượng ListView trên thanh Toolbox, nếu không có bạn phải vào Tools/Additional Controls và chọn

3/ Phần 3: Copy đoạn mã sau vào Module. Đoạn mã trong Module, bạn không cần sửa chỗ nào cả.

Sau đó bạn chọn Insert/Module đặt tên Module là DataSelector và gõ vào các hàm và thủ tục sau:

Mã:
Option Explicit 

Function RangeNameExists(Nname) As Boolean 
' Kiem tra xem Ten bang co ton tai hay khong?
' Neu ton tai thi tra ve TRUE
Dim n As Name 
RangeNameExists = False 
For Each n In ActiveWorkbook.Names 
If UCase(n.Name) = UCase(Nname) Then 
RangeNameExists = True 
Exit Function 
End If 
Next n 
End Function
' Day la ham de xuat cac du lieu tu Bang da duoc dat ten
' sang mot mang

Mã:
Function TableToArray(ByVal TableName As String) 
Dim arr 
Dim vRange As Range 
Dim i As Long, j As Long, m As Long, n As Long 
If Not RangeNameExists(TableName) Then Exit Function 'Neu khong ton tai thi thoat
On Error Resume Next 
Set vRange = Range(TableName) 
i = vRange.Rows.count 
j = vRange.Columns.count 
ReDim arr(1 To i, 1 To j) 
For m = 1 To i 
For n = 1 To j 
arr(m, n) = vRange(m, n).Value 
Next n 
Next m 
TableToArray = arr 
Set vRange = Nothing 
End Function

'Chuyen tu mang sang ListView va dinh dang ListView

Mã:
Sub ArrayToListview(ByVal VlistView As Listview, ByVal InputArray) 
Dim m As Long 
Dim i As Integer, j As Integer 
Dim bHang As Long, bCot As Long, bHeader As Integer 
Dim it As ListItem 
Dim anItem 
If Not IsObject(VlistView) Then Exit Sub 
On Error Resume Next 
'Dem so hang va so cot trong InputArray
bHang = UBound(InputArray, 1) 
bCot = UBound(InputArray, 2) 
'Dinh dang ListView
VlistView.View = lvwReport 
VlistView.FullRowSelect = True 
VlistView.MultiSelect = False 
VlistView.Gridlines = True 
VlistView.LabelEdit = lvwManual 
VlistView.HideColumnHeaders = True 
bHeader = VlistView.ColumnHeaders.count 
Select Case bHeader 'Xac dinh so cot cua ListView
Case Is < bCot 
For i = bHeader + 1 To bCot 
VlistView.ColumnHeaders.Add i 
Next i 
Case Is = bCot 
'Khong lam gi ca
Case Is > bCot 
'Khong lam gi ca
End Select 
'Dien cac gia tri tu Inputarray vao Listview
For i = 1 To bHang 
For j = 1 To bCot 
anItem = InputArray(i, j) 
If j = 1 Then 
Set it = VlistView.ListItems.Add() 
it.Text = anItem 
Else 
it.SubItems(j - 1) = anItem 
End If 
Next j 
Next i 
'Dat do rong cac cot
For i = 1 To bCot 
VlistView.ColumnHeaders(i).Width = 150 
Next i 
Set it = Nothing 
Exit Sub 
Tbloi: 
MsgBox "Xin loi, khong the dua mang vao Listview " , vbCritical, "Th?b? 
End Sub
'Dua tu bang vao mang, sau do dua tu mang vao Listview
'Va di nhien ban cung co the chuyen tu bang vao ListView

Mã:
Sub NhapDuLieu() 
On Error Resume Next 
Call DataSelector("MaVatTu") 
End Sub 

Sub DataSelector(Tenbang As String) 
Dim bMang1 
On Error Resume Next 
bMang1 = TableToArray(Tenbang) 
Call ArrayToListview(frmDataSelector.LVDataSelector, bMang1) 
frmDataSelector.Show 
End Sub
(Chỗ cần thay thế là frmDataselector và LVDataselector, nếu bạn dùng tên khác)

4/Phần 4 : Đoạn Code của Form : Đoạn Code này có những chỗ cần sửa, tôi sẽ đưa ra cụ thể, bạn hãy sửa cho phù hợp

Đoạn mã của frmDataSelector như sau:

Mã:
Private Sub cmdCancel_Click() 
Unload Me 'Thoat
End Sub
(CmdCancel sẽ được thay thế nếu bạn dùng tên khác cho nút Button )

Mã:
Private Sub cmdOK_Click() 

Dim bGiatrichon 
On Error Resume Next 
bGiatrichon = LVDataSelector.SelectedItem.Text 
ActiveCell.Value = bGiatrichon 'Dat gia tri ban chon vao o hien tai
End Sub

(CmdOK sẽ được thay thế nếu bạn dùng tên khác cho nút Button, LVDataselector cũng được thay thế nếu bạn dùng tên khác )

'Muc dich cua ham sau nham cuon danh sach trong Listview den ma tuong tu
'trong danh sach khi nguoi su dung go vao Textbox txtCode cac ky tu dau tien cua ma.

Mã:
Private Sub txtCode_Change() 
Dim it As ListItem 
On Error Resume Next 
btim = Me.txtCode.Text 
Set it = Me.LVDataSelector.FindItem(btim, lvwText, , lvwPartial) 
bindex = it.Index 
Me.LVDataSelector.ListItems.Item(bindex).Selected = True 
Me.LVDataSelector.ListItems.Item(bindex).EnsureVis ible 
Set it = Nothing 
End Sub

(TxtCode và LVDataselector là chỗ cần thay thế)

Giả sử bây giờ tôi muốn lấy mã sản phẩm từ bảng MaSanPham, trong sheet MaSanPham, khi tôi nhấn chuột phải ở cột 1 của Sheet2 thì đoạn mã trong Sheet2 như sau:

5/Phần 5 : Đoạn mã của Sheet
Mã:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As _ Boolean) 
If Target.Column = 1 Then 
Cancel = True 
Call NhapDuLieu 
End If 
End Sub

Đoạn Code này bạn cần lưu ý : Target.Column = 1, hay một số nào khác tuỳ bạn muốn bảng chọn hiện ra ở cột nào khi Click chuột phải

Bây giờ bạn hãy trở về cửa sổ Excel, chọn một ô bất kỳ ở cột 1 của Sheet2, bạn nhấn chuột phải thì frmDataSelector hiện ra , bạn hãy thử gõ vào các ký tự đầu tiên của mã sản phẩm bạn cần...và bạn sẽ thấy nó hoạt động như thế nào.

Bạn có thể cải tiến đoạn mã trong module DataSelector bằng việc sát nhập hàm TableToArray và thủ tục ArrayToListview thành một.

Chúc các bạn thành công.
 
Lần chỉnh sửa cuối:
Chúng ta lại trở về đề tài này cũng với Source Code của bạn Levanduyet, mà tôi tin rằng khi các bạn làm được, các bạn sẽ thất thuận tiện vô cùng.
Để bắt đầu, chúng ta hãy soạn "vật liệu". các bạn hãy chuẩn bị cho tôi 2 DS, một đặt tên là DSKH và một đặt tên là DMMH tại sheet DS.

1/Tạo Form :

Các bạn hãy vào cửa sổ VBA. Click vào nút Insert UserForm trên thanh công cụ. Bạn vào View/Toolbox để lấy hộp công cụ ra ngoài.

Form của chúng ta gồm : 1 Textbox, 2 Command Button và 1 Listview

Nếu trên hộp công cụ, bạn không thấy công cụ Listview, bạn phải vào Tool / Additional Control, bạn đánh dấu vào hộp kiểm Microsoft Listview Control 6.0 (SP4).

Bạn đặt tên cho các đối tượng của Form như sau : (nếu không có cửa sổ Properties Windows bạn hãy vào View/Properties Windows )

Tại hộp Properties có các thuộc tính cần lưu ý sau :

- Tên : dùng trong đoạn Code
- Caption : thể hiện ra bên ngoài
- Font : font chữ thể hiện

Bạn Click vào từng đối tượng và đặt tên như sau :

- Form : Name : frmChonMa; Caption : Chọn Mã
-Textbox : Name : TxtMa
- Command Button 1 : Name : CmdNhap, Caption : Nhập Mã
- Command Button 2 : Name : CmdThoat; Caption : Thoát
- Listview : Name : LVMa

Sau đó, bạn vào cửa sổ Code của Form ChonMa và Copy đoạn Code của Form vào.

Tiếp tục, bạn Insert/Module và Copy Code của Module vào.

Tại Sheet nào bạn muốn bảng chọn thể hiện, bạn sẽ chép Source Code vào Sheet đó, và bạn sửa các chữ số ở phần Target.Column cho đúng với vị trí cột của các bạn.

Nếu bạn biết sơ về VBA, bạn sẽ thấy công việc đơn giản và dễ dàng vô cùng. Chúc các bạn thành công
 
Upvote 0
Khi bạn nhấp chuột phải tại các cột Mã KH hay Mã MH, các bảng chọn sẽ hiện ra. Và ở ô TextBox, nếu bạn gõ ký tự nào, trong Listview, DS sẽ chuyển đến vị trí ký tự tương ứng. Bạn chọn xong các Mã thì nhấn nút Nhập, tại vị trí con trỏ sẽ hiện Mã bạn lựa chọn. Bạn chỉ cần 1 Form duy nhất để nhập nhiều loại DS khác nhau thông qua hàm :

Sub NhapDuLieuMaMH()
On Error Resume Next
Call Dataselector("DMMH")
End Sub

Giả sử bạn có thêm DSNV, bạn hãy Copy đoạn mả trên và sẽ thay NhapDuLieuMaMH() bằng NhapDuLieuMNV() chẳng hạn, và Call Dataselector("DMMH"), bằng Call Dataselector("DSNV"). Hy vọng các bạn khám phá thêm những điều lý thú từ đây
 
Upvote 0
Bài viết của Tuanktcdcn

DM2.jpg

Chương trình sẽ mở một List (danh sách mã trong danh mục) DMDVKH khi bạn Click chuột phải trên Sheet "Nhan Ma".

Việc tra tìm một mã rất tiện, cho phép tìm theo "Mã", "Tên" hay "Công nợ"
Trình tự công việc như sau:
'Dat ten vung chua danh muc la DMDVKH
'Tai Sheet can nhan ma dat ten la Nhan Ma

'ALT+F11
' Mở ThisWorkbook (ClickDbl trên ThisWorkbook), xoá tất cả và và copy đoạn mã mau xanh (blue)
'================================================= ======

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name <> "Nhan Ma" Then Exit Sub
dm.Show 1
Cancel = True
End Sub
'================================================= ======

'Tạo Form. Trên Form tạo các đối tượng:
Texbox đặt tên (Name) là TB - dùng để vào thông tin cần tìm
ListBox đặt tên (Name) là LB - dùng để chứa danh mục "DMDVKH"
Command đặt tên (Name) là Chon - dùng để chọn mã cần tìm
Command đặt tên (Name) là ESC - dùng để huỷ bỏ việc chọn

ClickDbl trên FORM, xoá tất cả và copy đoạn mã màu xanh (blue)

'================================================= ======

Private Sub UserForm_Initialize()
Chon.Default = True 'Khi nhấn phím ENTER sẽ chạy sự kiện trong Command "Chọn"
Thoat.Cancel = True 'Khi nhấn phím ESC sẽ thoát và không nhận mã
With LB
.ColumnCount = 3 'Nhận 3 cột
.BoundColumn = 1 'Ngầm định nhận dữliệu ở cột 1 trong ListBox
.ColumnWidths = "40,140,50" 'Độ rộng của 3 cột
.RowSource = "DMDVKH" ' "DMDVKH" được tạo ra khi bạn đặt tên bảng DMDVKH trong Sheet có tên DMDVKH
TB.text = ActiveCell.Value
End With
TB_Change

End Sub
'================================================= ======
Private Sub Chon_Click() 'Sự kiện khi Click chuột vào Command "Chọn"
ActiveCell.Value = LB.text
Unload Me
End Sub
'================================================= ======
Private Sub Thoat_Click() 'Sự kiện khi Click chuột vào Command "ESC" hay nhấn phím ESC
Unload Me
End Sub
'================================================= ======
Private Sub LB_Click() 'Sự kiện khi Click chuột vào IistBox
If LB.ListIndex = 0 Then
'MsgBox "Ban khong duoc chon tieu de cua bang!", vbCritical, "Loi du lieu"
Chon.Enabled = False
Else
Chon.Enabled = True
End If
End Sub
'================================================= ======
Private Sub LB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
If Chon.Enabled Then
Chon_Click
End If
End Sub
'================================================= ======
Private Sub LB_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
TB.text = LB.List(LB.ListIndex, 1)
End Sub
'================================================= ======
Private Sub LB_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
TB.text = LB.List(LB.ListIndex, 1)
End Sub
'================================================= ======
Private Sub TB_Change()
Dim cValue, I
cValue = LCase(Trim(TB.Value))

For I = 1 To LB.ListCount - 1

If LCase(Trim(LB.List(I, 0))) = cValue Then
LB.ListIndex = I
Exit For
End If

If InStr(LCase(Trim(LB.List(I, 1))), cValue) <> 0 Then
LB.ListIndex = I

Exit For
End If

If InStr(LCase(Trim(LB.List(I, 2))), cValue) Then
LB.ListIndex = I
Exit For
End If

Next I
End Sub
 
Upvote 0
Ý kiến của Duyệt

Một vấn đề tôi muốn đưa ra thảo luận là:
_Làm thế nào để bẫy các phím?
_Kỹ thuật nào được sử dụng?
_Các Even nào có thể được sử dụng cho mục đích này.
 
Upvote 0
Ý kiến của Bình OverAC

Em có một kinh nghiệm khi lập database cho các bảng mã. Xin được trình bày cùng các bác nhé.
Bảng mã được lập cần có 2 loại1. Loại 1 là loại mã tự đặt theo yêu cầu kiểm soát của người lập trình. Loại 2 là mã cho người dùng lập. Tại sao?
Rất đơn giản là vì đôi khi người dùng còn muốn đổi luôn mã do mình đặt ra trước đây. Đây cũng là một yêu cầu tương đối phổ biến đặt biệt là đối với các đối tượng tương đối nhiều và có nhu cầu tăng liên tục. Khi có nhiều đối tượng mới, người dùng có thể dể dàng bị nhầm lẩn, nhập trùng, nhập mã sai yêu cầu ban đầu đặt ra. Khi cơ sở dử liệu chỉ có một loại mã là mã do người dùng lập thì chắc chắn rằng người lập trình phải dựa trên mã này. Lưu trử dử liệu theo mã này. Nhưng khi mã này bị thay đổi thì sao! Dò tìm lại các mẩu tin có chứa nó và điều chỉnh! Khó thực hiện!! và làm cho chương trình chậm.
Khi có một loại mã do chính chương trình lập thì OK người dùng muốn đổi mã thì cứ việc vì cơ sở dử liệu không dựa trên loại mã này đâu. dử liệu vì thế không bị xáo trộn.
Đấy là kinh nghiệm xương máu của chính bảng thân em với một cơ sở dử liệu về khách hàng với hơn 600 khách hàng và trung bình mỗi ngày có thêm khoảng 5-6 khách hàng mới… hichic đặt biệt là khi em không thể nào nhớ nổi đối với những khách hàng dùng nhiều tên (tên tiếng anh, tên tiếng viêt, tên tắc…..) nghe cứ mà lộn tùng phèo cả lên.
Trên thực tế thì em thấy những chương trình lớn đều theo cách này.
Đây là kinh nghiệm của chính bản thân em, em nghĩ là E Fans của mình cũng cần lưu ý vấn đề này. Mong rằng các bác nào lập trình đọc được cái kinh nghiệm nhỏ nhoi này của em thì đừng cười nhé.
 
Upvote 0
Bình OverAC

Thêm nửa:
Nhắc nhỏ các bạn có tham khảo cái dataselector của bác levanduyet và cái list của bác Tuân.
Cả hai cái này đều dựa trên một sự khởi đầu bằng một cái click phải chuột. Nhưng đây là vấn đề mà ngày xưa có lần em đả trình bày với anh Duyệt. Đó là phải dùng chuột thì không tiện đối với những người chuyên sử dụng phím như em.
Thế thì phải làm sao đây đối vơi những người chuyên sử dụng phím nhưng muốn dùng 2 cái trên.
Cách làm này hơi ngây ngô mong rằng anh duyệt và anh Tuân đừng cười.
1. Chèn thêm một module vào file list.
2. Gõ vào đoạn code sau:
'================================
Public Sub khoidau()
dm.show
End Sub
'================================
3.Vào Tool --> Macro --> Macros... (hoặc nhấn Alt + F8)
Chọn cái thằng nào tên là khoidau kia sau đó nhấn nút Options...
Rồi bây giờ bạn nhìn vào mục shortcut key xem. bạn có thấy một ô trống có chữ Ctrl đằng trước và một con nhắy trong ô trống này.
Hãy đặt shortcutkey cho nó đi, nó sẽ ở dạng "Ctrl + ..." ( bạn có thể đè thêm phím shift nếu muốn shortcut key đó nằm ở dạng "Ctrl + Shift + ....")

Cách 2:
1. Vào Tool --> macro --> Record new macro..
Bạn sẽ thấy một bảng hiện lên.
Hãy nhấn cài shortcut key cho nó đi.
Đặt tên cho nó như bạn thích (nhớ là tên không có khoản trắng, và ký tự đặt biệt) hay bạn đặt như tôi là khoidau.
Đây là cách bạn thu một macro, nhưng thật ra bạn không cần thu nên hãy nhấn ngay vào phím stop trên một toolbar mới xuất hiện ngay trên bảng tính Excel.
Nhấn Alt + F11 để vào màn hình Visual Basic Editor. Xem ở file LIST có thêm một module (có thể là module1).
Xem mã của module này bạn sẽ thấy như sau:

Sub khoidau()
'
' khoidau Macro
' Macro recorded 07/03/2005 by NguyenBinh
'
' Keyboard Shortcut: Ctrl+Shift+H
'
End Sub

Bạn có thể xoá hết những dòng có dấu ' đứng đằng trước, thêm một dòng
dm.show ở giữa
và nó trở thành như sau:

Sub khoidau()
dm.Show
End Sub

Xong rồi! bạn đã có một cái LIST giống như cái của bác Tuân có điều bây giờ bạn có thể dùng phím tắt với nó.
Khi có cái này rồi bạn có thể vào view code của đối tượng This workbook xoá hết nội dung để có thể dùng chuột phải bình thường trên sheet này.

Ui dài quá. Chúc các bạn hiểu được những gì tôi nói
 
Upvote 0
Nếu không muốn sử dụng chuột phải, gán phím tắt như OverAC đề nghị cũng được, còn không thì thay đoạn Source Code ở WorkSheet như sau :

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
On Error Resume Next
Set myRange = Intersect(Range("C5:C300"), Target)
If Not myRange Is Nothing Then
Call NhapDuLieuMaKH
End If
End Sub

Thay vì :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
If Target.Column = 3 Then
Call NhapDuLieuMaKH
End If
End Sub

Như vậy, khi sử dụng các phím mũi tên sang phải, trái, trên, dưới nếu con trỏ rơi vào cột C (nếu bạn muốn cột khác, thì thay đổi tùy thích) thì ngay lập tức bảng chọn sẽ hiện ra thôi
 
Upvote 0
Ý kiến của Tuânktcdcn

Dùng phím tắt
Dùng theo OverAC theo thiết kế Macro cũng đượng và dễ thực hiện hoặc bạn có thể làm theo cách của VBA
1) ALT+F11 (vào môi trường lạp trình VBA)
2) Vào Menu Insert\Module
3 Copy đoạn mẵ dùng phím tắt F4 để mở DM sau:

'============================================
Sub OpenDM()
dm.Show 1
End Sub
'========Tạo phím tắt F4 để gọi thủ tục "OpenDM"=
Sub AUTO_OPEN() 'Tự động chạy khi mở Workbook
Application.OnKey "{F4}", "OpenDM"
End Sub
'========Huỷ phím F4 khi thoát===============
Sub AUTO_CLOSE() 'Tự động chạy khi close Workbook
Application.OnKey "{F4}"
End Sub
'=======================================

*) Nếu bạn muốn dùng các phím chức năng kết hợp khác thì làm như sau:
Nếu Shift+F4 thì "+{F4}"
Nếu CTRL+F4 thì "^{F4}"
Nếu ALT +F4 thì "%{F4}"
*) Nếu không phải là F4 thì bạn có thể đổi theo cấu trúc gọi
"{Tên phím}"
VD Nếu dùng ALT+F3 thì "%{F3}"
*) Thực tế thì việc quản lý mã hay đối tượng trong CSDL là một bài toán quan trọng như mã TK, mã KH, mã nhà CC, mã VLSPHH,...
Trong bất kỳ một PM nào thì cũng phải làm tốt việc này nếu không sẽ rất nguy hiểm cho việc quản lý. Nếu chúng ta dùng trên Excel để lập và chọn mã thì cần phải "chủ động" thôi nếu không viết VBA cho nó.
 
Upvote 0
Tạo ListBox di chuyển vị trí theo con trỏ chuột

--------------------------------------------------------------------------------

Cũng như Data Selector, bạn chuẩn bị cho tôi 1 ListBox, nhưng bạn hãy dùng thanh công cụ View / Toolbars / Control Toolbox. ListBox có tên là ListBox1. Bạn đặt thuộc tính cho ListBox này như sau : (chọn nút Properties trên thanh công cụ )
- Column Count : 3 (nếu bảng dữ liệu của bạn có 3 cột)
- Column Bound : 1 (nếu bạn muốn dữ liệu ở cột 1 của CSDL thể hiện trong Cell )
- ListFillRange : DMKH (hay tên của bảng dữ liệu tuỳ ý )

Bạn đặt thêm CheckBox có tên là CheckBox1. CheckBox này sẽ giúp bạn mở tắt ListBox khi cần thiết.
Đặt tên cho bảng dữ liệu bạn muốn thể hiện trong ListBox là DMKH. Tên cho vùng nhập dữ liệu là MaKH, Sheet là Data
Click chuột phải lên Sheet Data để vào cửa sổ VBA của Worksheet. Bạn chép đoạn Code vào, chỉ sửa như sau :
Set Target = Range("MaKH") : MaKH là tên dãy bạn muốn dữ liệu thể hiện khi Click chọn ListBox
 
Upvote 0
Nói thêm về Add-in Synchronize LítBoxes

Mình có tham khảo ví dụ : Synchronize ListBoxes họ viết khi mình kéo thanh trượt dữ liệu có tới cả 2000 dòng mà vẫn hiện lên rất nhanh vậy nguyên nhân là đâu. làm thế nào để kết hợp Synchronize ListBoxes phần listbox vào trong listbox dataselector? Mong các cao thử giúp đệ! Tìm hoài chưa ra! đây là đoạn code đó>
' macros written 20000117 by Ole P. Erlandsen, ope@erlandsendata.no
Option Explicit

Private Sub btnOK_Click()
Me.Hide
If Application.International(xlCountrySetting) = 47 Then ' Norwegian text
MsgBox "Fra ListBox1: " & Me.ListBox1.List(Me.ListBox1.ListIndex) & Chr(13) & Chr(13) & _
"Fra ListBox2: " & Me.ListBox2.List(Me.ListBox2.ListIndex), vbInformation, "Du valgte dette:"
Else ' English text
MsgBox "From ListBox1: " & Me.ListBox1.List(Me.ListBox1.ListIndex) & Chr(13) & Chr(13) & _
"From ListBox2: " & Me.ListBox2.List(Me.ListBox2.ListIndex), vbInformation, "You selected this:"
End If
End Sub

Private Sub ListBox1_Change()
UpdateListBox Me.ListBox2, Me.ListBox1.ListIndex ' update the items in ListBox2
End Sub

Private Sub UserForm_Initialize()
With Me
' edit the caption and labels in the dialog
If Application.International(xlCountrySetting) = 47 Then ' Norwegian text
.Caption = "Synkroniser listebokser"
.Label1.Caption = "Velg en kategori:"
.Label2.Caption = "Velg en enhet fra denne kategorien:"
Else ' English text
.Caption = "Synchronize listboxes"
.Label1.Caption = "Please select a category:"
.Label2.Caption = "Please select an item from this category:"
End If
' update the items in ListBox, this will update the items in ListBox2
UpdateListBox .ListBox1, -1
End With
End Sub

Private Sub UpdateListBox(lb As MSForms.ListBox, IndexValue As Integer)
Const FirstInputRow As Integer = 5
Dim LastInputRow As Integer, ColumnIndex As Integer, InputRange As Range
ColumnIndex = IndexValue + 2 ' determine which column to get list items from
LastInputRow = Cells(FirstInputRow, ColumnIndex).End(xlDown).Row ' determine the last input row
Set InputRange = ActiveSheet.Range(Cells(FirstInputRow, ColumnIndex), Cells(LastInputRow, ColumnIndex))
With lb
.ColumnHeads = True ' use the row above input range as header
.RowSource = InputRange.Address ' set the input range
'.RowSource = "'" & ActiveSheet.Name & "'!" & Range(Cells(FirstInputRow, ColumnIndex), Cells(LastInputRow, ColumnIndex)).Address
'.RowSource = Range(Cells(FirstInputRow, ColumnIndex), Cells(LastInputRow, ColumnIndex)).Address
.ListIndex = 0 ' select the first item
End With
Set InputRange = Nothing
End Sub
 
Upvote 0
Ý Kiến của Heroic

Vấn đề listbox và listview

--------------------------------------------------------------------------------

Kiến thức là biển cả, em mới chỉ học được cách modify các VD chương trình đó làm thử. Nhưng vấn đề của em là em đang áp dụng cái bảng chọn của tuankctdcn sử dụng listbox nên dữ liệu duyệt thanh trượt rất chậm. em đã coi lại cái ví dụ Data Selector của bác Duyệt thì dùng listview đưa từ mảng vào nên rất nhanh, em đã thử 2000 record. Nhưng cái bảng chọn của tuankctdn khi đang ở mã sản phẩm đó em nhấn F4 thì nó tìm ra ngay tên sản phẩm trong form chọn. Còn của Bác thì chưa có mục đó và vùng dữ liệu DMKH khi thay đổi thì lại phải chọn lại vùng define name nên chưa tối ưu.
Có cách nào sửa lại cho dễ áp dụng các ví dụ vào thực tế được gần hơn không nhờ các cao thủ chỉ giáo.(giống như đoạn code phía duới thì không cần phải definame).Em có làm thử nhưng không hiểu cái biến LastInputRow nó làm gì, ở đâu nên chưa thực hiện được.
 
Upvote 0
Ý kiến của Tuânktcdcn

Trích nguyên văn:
Nguyên văn bởi heroic
... Nhưng vấn đề của em là em đang áp dụng cái bảng chọn của tuankctdcn sử dụng listbox nên dữ liệu duyệt thanh trượt rất chậm....

Ví dụ của mình truyền dữ liệu vào Listbox là bằng Name (bản chất là mảng 2 cột Mã|Tên).
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom