Bài viết: Tạo ứng dụng form hổ trợ tìm kiếm và nhập liệu

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Trước đây tôi có làm 1 form hổ trợ tìm kiếm và nhập liệu. Việc tìm kiếm thì dùng AutoFilter, còn sort dữ liệu trên ListBox thì đương nhiên dùng chức năng Sort sẳn có của Excel để làm: Sort trên bảng tính, xong gán dữ liệu từ bảng tính vào ListBox

Cảm thấy cách làm đó tuy đơn giản nhưng không mấy chuyên nghiệp, vả lại tốc độ xử lý cũng không cao!
Như ta đã biết, việc Filter đối với mảng 1 chiều thì đã có hàm Filter giải quyết. Vậy hôm nay tôi viết thêm hàm Filter2DArray nữa là có thể đưa vào ứng dụng với form hổ trợ tìm kiếm và nhập liệu rồi.

Hàm Filter2DArray như sau:

PHP:
Function Filter2DArray(sArray, ColIndex As Long, FindStr As String)
  Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp
  Set Dic = CreateObject("Scripting.Dictionary")
  TmpArr = sArray
  ColIndex = ColIndex + LBound(TmpArr, 2) - 1
  For i = LBound(TmpArr, 1) To UBound(TmpArr, 1)
    TmpStr = Left(TmpArr(i, ColIndex), Len(FindStr))
    If UCase(TmpStr) = UCase(FindStr) Then Dic.Add i, ""
  Next
  If Dic.Count > 0 Then
    Tmp = Dic.Keys
    ReDim Arr(UBound(Tmp), LBound(TmpArr, 2) To UBound(TmpArr, 2))
    For i = LBound(Tmp) To UBound(Tmp)
      For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
        Arr(i, j) = TmpArr(Tmp(i), j)
      Next
    Next
  End If
  Filter2DArray = Arr
End Function
Vẫn sử dụng sự trợ giúp của Dictionary Object để định vị chỉ số dòng cần lấy ra kết quả
Giao diện Form như sau:

msrTzVctb1zQrJSihPNX51zGkReq6UE4R3VSTUidSqh7TQWNM3NgsBfD1h2Pn6jgGOs9ntx1pL-I_URKRnrIIN46vVp8PDTVC8gUt3duGGKv8HjivvHHMwcWVaGnir-gA5BHt8eAuta_e7DvNwD04zn1B_c_GQbsLagVg8Dgcyf8XYvVQ_vv9OTIkFH2SWi-qlJOyBN0kyt_HhGGGnwswVba52Oqn7MdjzWc5ufdA1uFUUzxNn9SJ69fo2o7CI3hTp7eQ_NlV99kmfqVpy0-JrxaQq1jQwqVmbdAjdFaVhoiELD4VbEFqPQasjkaBGdnfs-odDNAy9bcr5A6qh22ghZfMhU5MPZYP5AbgVecqjAWA5IqyKycrKk3ZieaosVIAA_xhpSD1gpRKUXo5274YasucBQFRQS7BiwuSwSrX7258oLjNRrbKkhMsK93eWdImHhg0TmnNywflmLzRUcqvO6Ij_O0aFoaNVryRGMV1S1EUlJDt1kEyl2s29w4sY4rRr-wI75R5XlP2EpHNuAkAqhUPA12TCmi0TN7G3kXQn2twNLNzjzSPrUz4ysScsfSvcLWbHGh9AwZenFA7wlS74xtuBQ6EsHCZFDvmRqkOvraoOFEgas=w513-h402-no


Với form này thì:
- Khi bấm vào các tiêu đề của ListBox thì dữ liệu sẽ được sort đúng tại cột này
- Gõ vài ký tự gợi nhớ vào TextBox thì List sẽ được thu gọn lại đúng với từ khóa tìm kiếm trên cột mà trước đó ta đã bấm (tức có thể tìm kiếm trên từng cột)
- Double Click vào 1 dòng nào đó trên ListBox, đồng nghĩa sẽ gán dữ liệu xuống bảng tính


Bạn có thể tham khảo và thảo luận thêm tại topic này: http://www.giaiphapexcel.com/forum/showthread.php?47929-Sort-mảng-2-chiều

Một số bài viết có liên quan:
1/ Làm cách nào để ghi chú hiệu quả trong VBA?
2/ Conditional Formatting cho biểu đồ bằng VBA
3/ Khi nào nên sử dụng Msgbox, Inputbox và Userform?
4/ 8 thủ thuật trong VBE bạn nên biết
5/ Kích hoạt macro từ nút bấm ngoài bảng tính
6/ Làm thế nào để thay thế các chữ OK, CANCEL,... nhàm chán của Msgbox
7/ Giới thiệu VBA trong Excel
8/ Viết code để nhìn thấy ai là người cập nhật bảng tính của bạn lần gần đây nhất
9/ 4 cách sử dụng Immediate Window trong VBA hiệu quả hơn
10/ 3 gợi ý nhỏ mang lại thành công trong khai báo biến trong VBA
 

File đính kèm

  • mc_request_05.rar
    32.6 KB · Đọc: 511
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cảm ơn tác giả nhiều ạ
 
Cảm ơn bạn nhiều nhé. Nhưng bạn ơi, thế mình muốn tạo cái form chọn từ 1 file riêng thì làm thế nào à bạn, tức là sheet MC sẽ ở 1 file khác nhưng khi vào sheet Request vẫn thực hiện được
 
Cảm ơn bạn, quá hay. Mình cũng đang muốn viết cái macro như vậy mà may quá gặp bạn. Nhưng mục đích của mình hơi phức tạp hơn chút, cụ thể như sau:
- Mình có 1 danh sách đính kèm.
- Số lượng đại lý cố định, không trùng với bất kỳ ai.
Mục đích:
- Mỗi lần mình gõ tên 1 đại lý vào listbox thì nó sẽ lọc ra các thông tin khác như: Số máy, loại máy, phân khối, hãng sx.
- Tuy nhiên các thông tin: số máy, loại máy, phân khối, hãng sx sẽ thay đổi không cố đinh. Sau khi lọc ra được tên đại lý, thay vì như form của bạn là double click vào dòng nào thì dòng đó sẽ được nhập lại vào excel và tự xuống dòng.
- Thì Ở đây mình muốn, chọn riêng từng nội dung (từng ô) của đại lý đó, sau đó cập nhật lại thông tin và nó sẽ ghi đè lên ô đang chọn đông thời tô màu ô vừa thay đổi trên excel (không xuống dòng).

Mình nghiên cứu đã lâu nhưng không được, hôm nay gặp được post này mong bạn giúp đỡ.
 

File đính kèm

  • Theo doi xe may.xlsx
    8.5 KB · Đọc: 110
Lần chỉnh sửa cuối:
cái này thấy được đấy. cảm ơn chủ thớt đã chia sẻ
 
Sao File của Thầy em lưu sang dạng xlsm thì khi mở Form bị lỗi Run Time Error 380 "Could not set the Value Property. Invalid Property Value"
Chỉ lưu dạng xls thì được, Thầy có thể chỉnh lại dùm ah!
 
Sao Thầy ndu không trả lời vây?
Có phải Thầy AnhTuan1066 và Thầy ndu là 1?
 
Cám ơn anh langtuchungtinh360.
Sao Thầy ndu không trả lời vậy.
file lưu sang dạng xlsm bị lỗi Thầy ơi.
 

File đính kèm

  • mc_request_05.xlsm
    53.7 KB · Đọc: 150
Lần chỉnh sửa cuối:
Khi em tải file của Thầy ndu về, Save As thành File đuôi xlsm thì khi double Click để hiên Form thì lỗi như bài #6, và click Debug thì lỗi vàng Userform1.Show ở Sub ShowForm().
Và ngay cả file của Anh em click mở form cũng bị lỗi.
 
Khi em tải file của Thầy ndu về, Save As thành File đuôi xlsm thì khi double Click để hiên Form thì lỗi như bài #6, và click Debug thì lỗi vàng Userform1.Show ở Sub ShowForm().
Và ngay cả file của Anh em click mở form cũng bị lỗi.
mở
form lên nha. kế bên textbox có SpinButton1, bạn nhấn F4 và tìm chỗ Max, sửa giá trị lại thành 1048576
 
Cám ơn anh langtuchungtinh360!
Được rồi Anh.
Có phải số 1048576 là số dòng của Excel 2010 trở lên không Anh?
 
Tới Anh hpkhuong, em hồi trước cũng xài Win 64bit và Office 64bit,nhưng thấy không tương thích một số chương trình nên thôi, chuyển qua xài 32bit luôn.
 
Code chạy đc với Office 64bit

Bạn nào muốn chạy trên Office 64bit thì thử file này xem
 

File đính kèm

  • Tao list nhap DM nhieu cot co sort.xls
    131.5 KB · Đọc: 246
Thầy Ndu có thể chỉnh code để Enter thì gán dữ liệu vào Sheet dùm em đi Thầy.
Như tạo sự kiện KeyDown.... If Keycode = 13 then.....
 
Cảm ơn thầy bài viết quá tuyệt nhưng e muốn cái danh sách check có thêm các trường thông tin như là xuất xứ, giá .... thì làm sao ah. ?
 
Cảm ơn bạn nhiều lắm!
Mình mới tìm hiểu về VBA. đang đi tìm hiểu sâu về nội dung này. Rất may gặp được bạn.
 
Tạo thêm một cột

Chào thầyEm mới tìm hiểu về vba. Em có thắc mắc là khi em tạo thêm một cột nữa những mà khi chạy nó không hiển thì được cột em thêm vào.... Hay phải thêm dòng lệnh nào. Thầy giúp em với ạ..
 
Web KT
Back
Top Bottom