Lớp học GPE tháng 10 - TPHCM: Conditional Formatting và Data Validation (tối 4, 6/10) | Excel cơ bản (tối 9, 11, 13/10) |
Thuần thục các hàm dò tìm (tối 10, 12/10) | Tất tần tật về PivotTable (tối 16, 18, 20/10) |
Tất tần tật về Filter và Advanced Filter (tối 23, 25/10) | Name động và biểu đồ (tối 24, 26, 28/10)

Đăng ký học Khởi đầu cùng Google Spreadsheet - 2 chủ nhật 1 và 8/10 - TPHCM

Đăng ký học Xây dựng ứng dụng Form bằng VBA - 2 chủ nhật 15 và 22/10 - TPHCM

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

Thảo luận trong 'Bài viết nổi bật và thông báo' bắt đầu bởi anhtuan1066, 21 Tháng hai 2017.

  1. anhtuan1066

    anhtuan1066 Thành viên gạo cội

    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(sArrayColIndex As LongFindStr As String)
      
    Dim TmpArrAs LongAs LongArrDicTmpStrTmp
      Set Dic 
    CreateObject("Scripting.Dictionary")
      
    TmpArr sArray
      ColIndex 
    ColIndex LBound(TmpArr2) - 1
      
    For LBound(TmpArr1To UBound(TmpArr1)
        
    TmpStr Left(TmpArr(iColIndex), Len(FindStr))
        If 
    UCase(TmpStr) = UCase(FindStrThen Dic.Add i""
      
    Next
      
    If Dic.Count 0 Then
        Tmp 
    Dic.Keys
        ReDim Arr
    (UBound(Tmp), LBound(TmpArr2To UBound(TmpArr2))
        For 
    LBound(TmpTo UBound(Tmp)
          For 
    LBound(TmpArr2To UBound(TmpArr2)
            
    Arr(ij) = 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:

    [​IMG]

    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
     

    Các file đính kèm:

    Chỉnh sửa lần cuối bởi điều hành viên: 28 Tháng tám 2017
    tuan16 thích bài này.
  2. PHONGGANHHAO

    PHONGGANHHAO Thành viên thường trực

    Cảm ơn tác giả nhiều ạ
     
  3. dephetnoi

    dephetnoi Thành viên mới

    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
     
  4. downloadpro

    downloadpro Thành viên mới

    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 đỡ.
     

    Các file đính kèm:

    Lần chỉnh sửa cuối: 25 Tháng hai 2017
  5. hanuangpe

    hanuangpe Thành viên mới

    cái này thấy được đấy. cảm ơn chủ thớt đã chia sẻ
     
  6. Rùa Con 1080

    Rùa Con 1080 Thành Viên Sao Chép 2

    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!
     
  7. Rùa Con 1080

    Rùa Con 1080 Thành Viên Sao Chép 2

    Sao Thầy ndu không trả lời vây?
    Có phải Thầy AnhTuan1066 và Thầy ndu là 1?
     
  8. langtuchungtinh360

    langtuchungtinh360 Thành viên đã dừng hoạt động

    cả 2 nick là 1 người đó bạn
     
  9. Rùa Con 1080

    Rùa Con 1080 Thành Viên Sao Chép 2

    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.
     
  10. langtuchungtinh360

    langtuchungtinh360 Thành viên đã dừng hoạt động

    lỗi thế nào bạn, xlsm sao lỗi được, tôi save bình thường mà
    thử xem.
     

    Các file đính kèm:

    Lần chỉnh sửa cuối: 2 Tháng ba 2017
  11. Rùa Con 1080

    Rùa Con 1080 Thành Viên Sao Chép 2

    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.
     
  12. langtuchungtinh360

    langtuchungtinh360 Thành viên đã dừng hoạt động

    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
     
  13. Rùa Con 1080

    Rùa Con 1080 Thành Viên Sao Chép 2

    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?
     
  14. hpkhuong

    hpkhuong Mới tôt nghiệp Mẫu giáo

    File này sẽ bị lỗi khi ai đó xài Office 64bit...(trong đó có tôi).--=0
     
  15. Rùa Con 1080

    Rùa Con 1080 Thành Viên Sao Chép 2

    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.
     
  16. kinghoang

    kinghoang Thành viên mới

    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
     

    Các file đính kèm:

  17. NguyenthiH

    NguyenthiH thành viên mù VBA

    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.....
     
  18. Anfis

    Anfis Thành viên mới

    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. ?
     
  19. ngoxaybot

    ngoxaybot Thành viên mới

    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.
     
  20. thang_nguyen1

    thang_nguyen1 Thành viên mới

    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 ạ..
     

Chia sẻ trang này