Giúp sữa lỗi UseForm không hiển thị đầy đủ các cột

Liên hệ QC

nguyenthotnot

Thành viên chính thức
Tham gia
25/11/09
Bài viết
59
Được thích
7
Xem dùm em, không biết tại sao em trong listbox nó không hiển thị được, mà nó chỉ hiện được cột đầu tiên em không biết nó sai chỗ nào nữa mong các anh chỉ giúp dùm em, ở sheet Lọc, nút nhập liệu khi em nhấn vào nó không hiện ra hết các cột mà chỉ hiện thị cột đầu tiên mong các anh chị xem giúp thank các anh
 

File đính kèm

  • file mau kho cach 1.xlsm
    357.1 KB · Đọc: 12
  • Capture.PNG
    Capture.PNG
    38.6 KB · Đọc: 23
Trong Sub ganSourceListbox thêm dòng cuối
Mã:
Me.lstDanhSachVPP.ColumnCount = MaxCol
Nếu tôi hiểu ý thì phải là With Range("A8")

Bạn xóa dữ liệu dòng 9 chỉ để lại A9:B9 thì hiểu tôi nói gì.
 
Upvote 0
Thuộc tính ColumnCount của ListBox đang là 1, thì nó chỉ hiển thị 1 cột; tuy nguồn cho listBox có ngàn cột đi chăng nữa!
 
Upvote 0
em mới học còn nhiều khó khăn nhờ anh chị chỉ dùm em
Trong frmdethi, Chỗ biến cố nút ghi dùm de nhap du lieu xuong sheet1 khi bam nút thêm và thêm các thông tin thì bị khoi dong lai excel
Mong mọi người giúp e với , e sắp nộp bài thi rồi
 

File đính kèm

  • Truong Thi Bich Tram.xlsm
    34.9 KB · Đọc: 6
Upvote 0
em mới học còn nhiều khó khăn nhờ anh chị chỉ dùm em
Trong frmdethi, Chỗ biến cố nút ghi dùm de nhap du lieu xuong sheet1 khi bam nút thêm và thêm các thông tin thì bị khoi dong lai excel
Mong mọi người giúp e với , e sắp nộp bài thi rồi
"Sắp nộp" là chuyện của bạn. Muốn người khác giúp thì hãy bỏ công ra mô tả cho người ta hiểu.

"ghi dùm de nhap du lieu xuong sheet1"? Đã có code rồi còn gì. Hay có chỗ nào chưa vừa ý trong code đó? Giữ thông tin không tiết lộ ra thì ai biết bạn muốn gì.

Muốn lắm muốn lắm? Thì cụ thể muốn gì, phải nói ra chứ ai mà đoán được.

"khi bam nút thêm và thêm các thông tin thì bị khoi dong lai excel"? Nút thêm có làm gì ghê gớm đâu mà khởi động lại Excel?
 
Lần chỉnh sửa cuối:
Upvote 0
"Sắp nộp" là chuyện của bạn. Muốn người khác giúp thì hãy bỏ công ra mô tả cho người ta hiểu.

"ghi dùm de nhap du lieu xuong sheet1"? Đã có code rồi còn gì. Hay có chỗ nào chưa vừa ý trong code đó? Giữ thông tin không tiết lộ ra thì ai biết bạn muốn gì.

Muốn lắm muốn lắm? Thì cụ thể muốn gì, phải nói ra chứ ai mà đoán được.

"khi bam nút thêm và thêm các thông tin thì bị khoi dong lai excel"? Nút thêm có làm gì ghê gớm đâu mà khởi động lại Excel?
Dạ, e xin lỗi ạ, em mới vào nên không Biết ạ
Nội Dung bài của em là
1: Khi nhấp vào nút Thêm sau đó nhập các thông tin vào các textbox: TXTmahopdong, TXTNgaythue, TXTNgaytra , TXTtienthue, Cbomamatbang
2: Nhấp vào nút Ghi thì các thông tin đã thêm trên nhập xuống Sheet1 và cập nhập vào listbox
Em đã viết cod cho nút ghi xong mà e không biết sai chỗ nào, mỗi lần nhấn nút ghi thì excel khởi động lại và không nhập được vào sheet1
Em xin lỗi và cảm ơn ạ!
 
Upvote 0
Dạ, e xin lỗi ạ, em mới vào nên không Biết ạ
Nội Dung bài của em là
1: Khi nhấp vào nút Thêm sau đó nhập các thông tin vào các textbox: TXTmahopdong, TXTNgaythue, TXTNgaytra , TXTtienthue, Cbomamatbang
2: Nhấp vào nút Ghi thì các thông tin đã thêm trên nhập xuống Sheet1 và cập nhập vào listbox
Em đã viết cod cho nút ghi xong mà e không biết sai chỗ nào, mỗi lần nhấn nút ghi thì excel khởi động lại và không nhập được vào sheet1
Em xin lỗi và cảm ơn ạ!
Tôi nhập dữ liệu trên Form rồi nhấn nút Ghi thì có thấy Excel khởi động lại đâu.

Mà thôi tôi đi ngủ đây. Hôm nay thức đêm quá.
 
Upvote 0
Trong Sub ganSourceListbox thêm dòng cuối
Mã:
Me.lstDanhSachVPP.ColumnCount = MaxCol
Nếu tôi hiểu ý thì phải là With Range("A8")

Bạn xóa dữ liệu dòng 9 chỉ để lại A9:B9 thì hiểu tôi nói gì.
thank anh em đã hiểu ý của anh, anh ơi anh xem code Combobox dùm em, em muốn call các sheet mà em chọn để em nhập và tìm kiếm luôn mà ko cần thoát ra ngoài để chọn lại, theo như em hiểu thì cái tìm kiếm Use form của em nó sẽ hiện ra theo cái sheet Loc hiện tại, có cách nào ko cần ra sheet Lọc mà em vẫn có thể chọn sheet trực tiếp trên form luôn được ko anh, để em nhập và tìm kiếm lun ah anh, thank anh nhiều
 

File đính kèm

  • file mau kho cach 1 - Copy.xlsm
    375.7 KB · Đọc: 4
  • 1.png
    1.png
    107.3 KB · Đọc: 19
Upvote 0
thank anh em đã hiểu ý của anh, anh ơi anh xem code Combobox dùm em, em muốn call các sheet mà em chọn để em nhập và tìm kiếm luôn mà ko cần thoát ra ngoài để chọn lại, theo như em hiểu thì cái tìm kiếm Use form của em nó sẽ hiện ra theo cái sheet Loc hiện tại, có cách nào ko cần ra sheet Lọc mà em vẫn có thể chọn sheet trực tiếp trên form luôn được ko anh, để em nhập và tìm kiếm lun ah anh, thank anh nhiều
Bạn viết khó hiểu quá. Hãy viết theo kiểu liệt kê các thao tác liên tiếp theo trình tự. Vd.: "Khi hiển thị Form thì em muốn nhập "cái này" vào ..., chọn gì đó trong ...., tiếp theo gãi chỗ này ..., búng chỗ kia ...., thọt lét cô kia ..., ghẹo cô nọ ... Cuối cùng em nhấn vào chỗ "nhạy cảm" này ... thì code phải làm thế này thế này."

Tôi chậm hiểu nên phải mô tả kỹ như thế. Còn không thì chờ người khác có tài "đoán ý đồng đội".
 
Upvote 0
Bạn viết khó hiểu quá. Hãy viết theo kiểu liệt kê các thao tác liên tiếp theo trình tự. Vd.: "Khi hiển thị Form thì em muốn nhập "cái này" vào ..., chọn gì đó trong ...., tiếp theo gãi chỗ này ..., búng chỗ kia ...., thọt lét cô kia ..., ghẹo cô nọ ... Cuối cùng em nhấn vào chỗ "nhạy cảm" này ... thì code phải làm thế này thế này."

Tôi chậm hiểu nên phải mô tả kỹ như thế. Còn không thì chờ người khác có tài "đoán ý đồng đội".
Bạn viết khó hiểu quá. Hãy viết theo kiểu liệt kê các thao tác liên tiếp theo trình tự. Vd.: "Khi hiển thị Form thì em muốn nhập "cái này" vào ..., chọn gì đó trong ...., tiếp theo gãi chỗ này ..., búng chỗ kia ...., thọt lét cô kia ..., ghẹo cô nọ ... Cuối cùng em nhấn vào chỗ "nhạy cảm" này ... thì code phải làm thế này thế này."

Tôi chậm hiểu nên phải mô tả kỹ như thế. Còn không thì chờ người khác có tài "đoán ý đồng đội".
ý em là trên use form chỗ chọn form nhập liệu. Em có thể chọn xem từng sheet khác được ko anh hay nó chỉ hiện được listbox tại sheet lọc thôi anh. Tại sheet lọc của em nó đang hiện sheet biendong xin lỗi anh em giải thích ko được rõ cho lắm
 
Upvote 0
ý em là trên use form chỗ chọn form nhập liệu.
"trên use form chỗ chọn form nhập liệu"? Bạn chỉ có 1 UserForm là QuanLyKho. Thế thì "trên UserForm chỗ chọn Form nhập liệu" có ngĩa là gì? Hãy tập viết chính xác, đừng cẩu thả.
Em có thể chọn xem từng sheet khác được ko anh hay nó chỉ hiện được listbox tại sheet lọc thôi anh. Tại sheet lọc của em nó đang hiện sheet biendong
"chọn xem từng sheet khác"? Ở đâu?

Mà tôi đã nói rồi. Hãy liệt kê chính xác theo trình tự và phải có "cái gì" (chọn gì, nhập gì, thọt lét hay búng, gãi ...) và "ở đâu" (...).

Bạn đợi người khác nhé. Tôi chậm hiểu lắm.
 
Upvote 0
mà anh nhìn thấy code em viết đúng phải ko
Tôi đã nói rồi. Code GHI không làm việc gì tới mức Excel phải khởi động lại.
Tất nhiên với code đó thì trong một số trường hợp sẽ có lỗi. Nhưng không phải là lỗi tới mức Excel phải khởi động lại.

Sẽ có thể có lỗi gì?
Bạn có vd.
Mã:
Sheet1.Range("C" & DongTrongCuoi).Value = CDate(txtNgaythue)
Nếu bạn quên nhập vào txtNgaythue (txtNgaythue = "") mà nhấn GHI thì có lỗi "type mismatch". Tương tự, có nhập nhưng vô ý nên trong txtNgaythue không là ngày tháng.

Về lưu ý thì:
- do dữ liệu trong CT_HOPDONG nằm trong bảng (Table1) nên
Mã:
DongTrongCuoi = Sheet1.Range("A200").End(xlUp).Row + 1
không trả về chính xác dòng sau dòng có dữ liệu cuối cùng. Cách thử: trong CT_HOPDONG bạn nhập tay dữ liệu cho tới dòng vd. 20 -> xóa dữ liệu ở các dòng từ 4 tới 20 -> mở Form -> nhập liệu -> nhấn GHI. Bạn sẽ thấy kết quả được nhập xuống sheet ở dòng 21. Nguyên nhân là do DongTrongCuoi = 21. Khi dữ liệu nằm trong bảng thì End(xlUp).Row luôn trả về dòng cuối của bảng cho dù bảng hiện thời không có dữ liệu hoặc dữ liệu không tới dòng cuối của bảng.
Lưu ý trên cũng cho sheet HOP_DONG vì dữ liệu cũng nằm trong bảng (dongcuoi = dòng cuối cùng của bảng cho dù bảng có dữ liệu hay không)

- Dữ liệu trong HOP_DONG bắt đều từ dòng 3 nên phải là For i = 3 To dongcuoi chứ không là For i = 4 To dongcuoi. Bạn thử nhập Số hợp đồng = D001 rồi nhấn GHI thì sẽ thấy MsgBox với thông báo "So hop dong khong co!" cho dù có D001. Nguyên nhân là do D001 nằm ở A3 nhưng bạn xét từ dòng 4.

- người viết code không có quyền cho là người dùng sẽ luôn nhập hết dữ liệu, luôn nhập chuẩn dữ liệu. Con người mà. Vì thế nên kiểm tra ngay ở đầu sub cmdGhi_Click - có nhập hết dữ liệu không, 2 ô "kia" có là ngày tháng không. Nếu không thì nghỉ chơi luôn, không đi tiếp.

- người viết code không có quyền cho là dữ liệu luôn không vượt quá dòng 100.
Phải là hoặc
a. vd.
Mã:
dongcuoi = sheet_hopdong.Range("A" & Rows.Count).End(xlUp).Row
hoặc
b. nếu muốn nhập số cứng nhắc thì nhập số đủ lớn. Đủ lớn nghĩa là chọn con số mà ta biết dữ liệu có thể tới đó nhưng CHẮC CHẮN không vượt quá. Vd. do đặc thù công việc tôi CHẮC CHẮN là không bao giờ có quá 1000 dòng dữ liệu thì thay cho 100 tôi nhập 1000. Tức
Mã:
dongcuoi = sheet_hopdong.Range("A1000").End(xlUp).Row
Tuy nhiên code a không hề chậm, vả lại chỉ thực hiện 1 lần, nên lăn tăn chuyện 100, 1000 để mà làm gì.

- Trong trường khác, tập tin khác nếu có nhiều dòng dữ liệu thì không thể là
Mã:
Dim DongTrongCuoi As Integer
Dim dongcuoi, i As Integer
Mà phải là As Long. Tôi khuyên là luôn luôn As Long.
 
Lần chỉnh sửa cuối:
Upvote 0
"trên use form chỗ chọn form nhập liệu"? Bạn chỉ có 1 UserForm là QuanLyKho. Thế thì "trên UserForm chỗ chọn Form nhập liệu" có ngĩa là gì? Hãy tập viết chính xác, đừng cẩu thả.

"chọn xem từng sheet khác"? Ở đâu?

Mà tôi đã nói rồi. Hãy liệt kê chính xác theo trình tự và phải có "cái gì" (chọn gì, nhập gì, thọt lét hay búng, gãi ...) và "ở đâu" (...).

Bạn đợi người khác nhé. Tôi chậm hiểu lắm.
Nghĩa là trong use form, chỗ chọn sheet nhập liệu, combobox em đã nạp các giá trị: loc,biendong, bdhg, vinhlong, hopnhat tương ứng với các sheet trong excel của em, em mún khi click vô các tên trên của combobox thì trên use form list box nó sẽ hiện ra tương ứng ah anh, hì ko biết em viết vậy có khó hiểu ko anh
 
Upvote 0
Tôi đã nói rồi. Code GHI không làm việc gì tới mức Excel phải khởi động lại.
Tất nhiên với code đó thì trong một số trường hợp sẽ có lỗi. Nhưng không phải là lỗi tới mức Excel phải khởi động lại.

Sẽ có thể có lỗi gì?
Bạn có vd.
Mã:
Sheet1.Range("C" & DongTrongCuoi).Value = CDate(txtNgaythue)
Nếu bạn quên nhập vào txtNgaythue (txtNgaythue = "") mà nhấn GHI thì có lỗi "type mismatch". Tương tự, có nhập nhưng vô ý nên trong txtNgaythue không là ngày tháng.

Về lưu ý thì:
- do dữ liệu trong CT_HOPDONG nằm trong bảng (Table1) nên
Mã:
DongTrongCuoi = Sheet1.Range("A200").End(xlUp).Row + 1
không trả về chính xác dòng sau dòng có dữ liệu cuối cùng. Cách thử: trong CT_HOPDONG bạn nhập tay dữ liệu cho tới dòng vd. 20 -> xóa dữ liệu ở các dòng từ 4 tới 20 -> mở Form -> nhập liệu -> nhấn GHI. Bạn sẽ thấy kết quả được nhập xuống sheet ở dòng 21. Nguyên nhân là do DongTrongCuoi = 21. Khi dữ liệu nằm trong bảng thì End(xlUp).Row luôn trả về dòng cuối của bảng cho dù bảng hiện thời không có dữ liệu hoặc dữ liệu không tới dòng cuối của bảng.
Lưu ý trên cũng cho sheet HOP_DONG vì dữ liệu cũng nằm trong bảng (dongcuoi = dòng cuối cùng của bảng cho dù bảng có dữ liệu hay không)

- Dữ liệu trong HOP_DONG bắt đều từ dòng 3 nên phải là For i = 3 To dongcuoi chứ không là For i = 4 To dongcuoi. Bạn thử nhập Số hợp đồng = D001 rồi nhấn GHI thì sẽ thấy MsgBox với thông báo "So hop dong khong co!" cho dù có D001. Nguyên nhân là do D001 nằm ở A3 nhưng bạn xét từ dòng 4.

- người viết code không có quyền cho là người dùng sẽ luôn nhập hết dữ liệu, luôn nhập chuẩn dữ liệu. Con người mà. Vì thế nên kiểm tra ngay ở đầu sub cmdGhi_Click - có nhập hết dữ liệu không, 2 ô "kia" có là ngày tháng không. Nếu không thì nghỉ chơi luôn, không đi tiếp.

- người viết code không có quyền cho là dữ liệu luôn không vượt quá dòng 100.
Phải là hoặc
a. vd.
Mã:
dongcuoi = sheet_hopdong.Range("A" & Rows.Count).End(xlUp).Row
hoặc
b. nếu muốn nhập số cứng nhắc thì nhập số đủ lớn. Đủ lớn nghĩa là chọn con số mà ta biết dữ liệu có thể tới đó nhưng CHẮC CHẮN không vượt quá. Vd. do đặc thù công việc tôi CHẮC CHẮN là không bao giờ có quá 1000 dòng dữ liệu thì thay cho 100 tôi nhập 1000. Tức
Mã:
dongcuoi = sheet_hopdong.Range("A1000").End(xlUp).Row
Tuy nhiên code a không hề chậm, vả lại chỉ thực hiện 1 lần, nên lăn tăn chuyện 100, 1000 để mà làm gì.

- Trong trường khác, tập tin khác nếu có nhiều dòng dữ liệu thì không thể là
Mã:
Dim DongTrongCuoi As Integer
Dim dongcuoi, i As Integer
Mà phải là As Long. Tôi khuyên là luôn luôn As Long.
Dạ em cảm ơn anh ạ, bài trả lời rất chi tiết, Em đã chạy được cod rồi
Bài đã được tự động gộp:

Tôi đã nói rồi. Code GHI không làm việc gì tới mức Excel phải khởi động lại.
Tất nhiên với code đó thì trong một số trường hợp sẽ có lỗi. Nhưng không phải là lỗi tới mức Excel phải khởi động lại.

Sẽ có thể có lỗi gì?
Bạn có vd.
Mã:
Sheet1.Range("C" & DongTrongCuoi).Value = CDate(txtNgaythue)
Nếu bạn quên nhập vào txtNgaythue (txtNgaythue = "") mà nhấn GHI thì có lỗi "type mismatch". Tương tự, có nhập nhưng vô ý nên trong txtNgaythue không là ngày tháng.

Về lưu ý thì:
- do dữ liệu trong CT_HOPDONG nằm trong bảng (Table1) nên
Mã:
DongTrongCuoi = Sheet1.Range("A200").End(xlUp).Row + 1
không trả về chính xác dòng sau dòng có dữ liệu cuối cùng. Cách thử: trong CT_HOPDONG bạn nhập tay dữ liệu cho tới dòng vd. 20 -> xóa dữ liệu ở các dòng từ 4 tới 20 -> mở Form -> nhập liệu -> nhấn GHI. Bạn sẽ thấy kết quả được nhập xuống sheet ở dòng 21. Nguyên nhân là do DongTrongCuoi = 21. Khi dữ liệu nằm trong bảng thì End(xlUp).Row luôn trả về dòng cuối của bảng cho dù bảng hiện thời không có dữ liệu hoặc dữ liệu không tới dòng cuối của bảng.
Lưu ý trên cũng cho sheet HOP_DONG vì dữ liệu cũng nằm trong bảng (dongcuoi = dòng cuối cùng của bảng cho dù bảng có dữ liệu hay không)

- Dữ liệu trong HOP_DONG bắt đều từ dòng 3 nên phải là For i = 3 To dongcuoi chứ không là For i = 4 To dongcuoi. Bạn thử nhập Số hợp đồng = D001 rồi nhấn GHI thì sẽ thấy MsgBox với thông báo "So hop dong khong co!" cho dù có D001. Nguyên nhân là do D001 nằm ở A3 nhưng bạn xét từ dòng 4.

- người viết code không có quyền cho là người dùng sẽ luôn nhập hết dữ liệu, luôn nhập chuẩn dữ liệu. Con người mà. Vì thế nên kiểm tra ngay ở đầu sub cmdGhi_Click - có nhập hết dữ liệu không, 2 ô "kia" có là ngày tháng không. Nếu không thì nghỉ chơi luôn, không đi tiếp.

- người viết code không có quyền cho là dữ liệu luôn không vượt quá dòng 100.
Phải là hoặc
a. vd.
Mã:
dongcuoi = sheet_hopdong.Range("A" & Rows.Count).End(xlUp).Row
hoặc
b. nếu muốn nhập số cứng nhắc thì nhập số đủ lớn. Đủ lớn nghĩa là chọn con số mà ta biết dữ liệu có thể tới đó nhưng CHẮC CHẮN không vượt quá. Vd. do đặc thù công việc tôi CHẮC CHẮN là không bao giờ có quá 1000 dòng dữ liệu thì thay cho 100 tôi nhập 1000. Tức
Mã:
dongcuoi = sheet_hopdong.Range("A1000").End(xlUp).Row
Tuy nhiên code a không hề chậm, vả lại chỉ thực hiện 1 lần, nên lăn tăn chuyện 100, 1000 để mà làm gì.

- Trong trường khác, tập tin khác nếu có nhiều dòng dữ liệu thì không thể là
Mã:
Dim DongTrongCuoi As Integer
Dim dongcuoi, i As Integer
Mà phải là As Long. Tôi khuyên là luôn luôn As Long.
Theo Hướng dẫn của anh e đã làm xong nút Ghi

Em còn một phần không làmđược trong frmtimkiem, theo yêu cầu của de bài em có chụp kèm trong sheet KETQUA, Tìm thông tin khách hàng có doanh thu lớn nhất sau khi lọc được thông tin theo ngày thuê và ngày trả
Nếu rảnh nhờ anh xem giúp e với ạ
Cảm ơn anh rất nhiều
 

File đính kèm

  • Truong Thi Bich Tram.xlsm
    1.5 MB · Đọc: 8
Lần chỉnh sửa cuối:
Upvote 0
Nghĩa là trong use form, chỗ chọn sheet nhập liệu, combobox em đã nạp các giá trị: loc,biendong, bdhg, vinhlong, hopnhat tương ứng với các sheet trong excel của em, em mún khi click vô các tên trên của combobox thì trên use form list box nó sẽ hiện ra tương ứng ah anh
Không cần thiết Sub ganSourceListbox()

Cấu trúc trong các sheet mà có tên trong cbSheet phải như nhau: dữ liệu cùng từ dòng 9, các tiêu đề phải cùng theo thứ tự từ B đến L

Thay 2 Sub cũ bằng 2 sub mới.
Mã:
Private Sub UserForm_Initialize()
    With cbSheet
        .AddItem "BienDong"
        .AddItem "VinhLong"
        .AddItem "BDHG"
        .AddItem "HopNhat"
        .AddItem "DongHa"
        .AddItem "VPP"
    End With
    lstDanhSachVPP.ColumnCount = 12
    cbSheet.ListIndex = 0
End Sub

Private Sub cbSheet_Change()
Dim lastRow As Long, r As Long, c As Long, count As Long, data(), result(), sh As Worksheet
    If cbSheet.ListIndex = -1 Then Exit Sub
    lstDanhSachVPP.Clear
    Set sh = ThisWorkbook.Worksheets(cbSheet.Value)
    With sh
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        If lastRow < 9 Then Exit Sub
        data = .Range("B9:L" & lastRow).Value
    End With
    For r = 1 To UBound(data)
        If data(r, 1) <> "" Then
            count = count + 1
            ReDim Preserve result(1 To 12, 1 To count)
            result(1, count) = count
            For c = 1 To 11
                result(c + 1, count) = data(r, c)
            Next c
        End If
    Next r
    lstDanhSachVPP.Column = result
End Sub
Bài đã được tự động gộp:

Nếu rảnh nhờ anh xem giúp e với ạ
Cảm ơn anh rất nhiều
Sau bữa chiều tôi phải nằm 2, 3 tiếng. Đến tối (ở VN là đêm) tôi sẽ xem.
 
Upvote 0
Em còn một phần không làmđược trong frmtimkiem, theo yêu cầu của de bài em có chụp kèm trong sheet KETQUA, Tìm thông tin khách hàng có doanh thu lớn nhất sau khi lọc được thông tin theo ngày thuê và ngày trả
1. frmcapnhat.
Trong Sub cmdcapnhattrigia_Click có dòng
Mã:
Sheet2.Range("tongtrigia").Cells(vitri, 1).Value = tongtien
trong khi đó không có sheet name nào là Sheet2. Có lẽ bạn đã sửa thành sheet_hopdong. Hãy sửa lại dòng trên.

2. Về frmtimkiem
- Click vào ListBox và xóa kq_timkiem trong RowSource (hiện thời RowSource là kq_timkiem).

- Nếu tôi hiểu được điều mà người ta không nói thì tìm kiếm trong sheet CT_HOPDONG.

- Hãy thiết lập độ rộng các cột của ListBox trong UserForm_Initialize

- Yêu cầu hiển thị thông tin của khách hàng có tiền thuê cao nhất. Thế nếu có 2 khách có cùng tiền thuê cao nhất thì sao? Chỉ có 3 TextrBox cho 1 kết quả. Người ra đề không lường được trường hợp này? Trong trường hợp có > 1 khách có tiền thuê cao nhất thì sẽ lấy khách đầu tiên.

- Tôi chú thích từng dòng code. Bạn hãy đọc để hiểu "triết lý" của code.

Tôi làm theo cách của tôi, không dùng sheet KQ_timkiem. Tôi ngại test, bạn tự kiểm tra.
Mã:
Private Sub UserForm_Initialize()
    LstthongtinKH.ColumnCount = 5
'    LstthongtinKH.ColumnWidths= ...
End Sub

Private Sub cmdtimkiem_Click()
Dim r As Long, c As Long, max_sum As Double, shd, Ma, data(), dic As Object
'    lay du lieu Thue mat bang vao mang data
    data = Range("Table1").Value
'    dung tu dien dic de luu cac So hop dong voi tu cach la KEY va tong tien cua So hop dong do voi tu cach la ITEM
    Set dic = CreateObject("Scripting.Dictionary")
'    khong phan biet KEY hoa hay thuong
    dic.comparemode = vbTextCompare
'    duyet tung dong cua mang data
    For r = 1 To UBound(data)
'        neu dong hien hanh thoa dieu kien ve  Ngay thi thuc hien
        If data(r, 3) = CDate(txtNgaythue.Value) And data(r, 4) = CDate(txtNgaytra.Value) Then
'            ghi ket qua vao ListBox
            With LstthongtinKH
'                ghi So hop dong
                .AddItem data(r, 1)
'                ghi cac thong tin khac
                For c = 2 To 5
                    .List(.ListCount - 1, c - 1) = data(r, c)
                Next c
            End With
        End If
    Next r
'    neu trong ListBox co ket qua (co du lieu thoa man 2 Ngay) thi thuc hien
    If LstthongtinKH.ListCount Then
'        lay tu ListBox vao mang data
        data = LstthongtinKH.List
'        duyet tung dong cua mang data de cong don tong tien cua moi So hop dong, xac dinh So hop dong co tong tien lon nhat
        For r = LBound(data) To UBound(data)
'            chi so cot va dong trong ListBox.List tinh tu 0
            If dic.exists(data(r, 0)) Then
'                da co So hop dong trong tu dien - cong don tong tien
                dic.Item(data(r, 0)) = dic.Item(data(r, 0)) + data(r, 4)
            Else
'                chua co So hop dong trong tu dien - ghi So hop dong voi tu cach la KEY va tong tien hien hanh voi tu cach la ITEM
                dic.Add data(r, 0), data(r, 4)
            End If
'            neu tong tien cua So hop dong hien hanh > max_sum thi cap nhat max_sum va So hop dong co max_sum
            If dic.Item(data(r, 0)) > max_sum Then
                shd = data(r, 0)
                max_sum = dic.Item(shd)
            End If
        Next r
'        ta tim So hop dong co max_sum, tuc shd, trong sheet HOP_DONG de tim ra Ma khach hang
'        nhap du lieu tu HOP_DONG vao mang data
        data = Range("Table2").Value
'        duyet tung dong cua mang data
        For r = 1 To UBound(data)
'            neu So hop dong hien hanh = shd thi thuc hien
            If data(r, 1) = shd Then
'                doc ra Ma cua khach hang
                Ma = data(r, 3)
'                thoat vong lap vi da tim thay Ma cua khach hang co tong tien cao nhat
                Exit For
            End If
        Next r
'        neu tim thay Ma khach hang thi doc thong tin tu sheet KHACH_HANG
        If Not IsEmpty(Ma) Then
'            nhap du lieu tu KHACH_HANG vao mang data
            data = Range("Table3").Value
'            duyet tung dong cua mang data
            For r = 1 To UBound(data)
'                neu tim thay Ma khach hang thi thuc hien
                If data(r, 1) = Ma Then
                    txtTenKH.Value = data(r, 2)
                    txtDiachi.Value = data(r, 3)
                    TXTSDT.Value = data(r, 4)
                    Exit For
                End If
            Next r
        End If
    End If
    Set dic = Nothing
End Sub
 
Upvote 0
Không cần thiết Sub ganSourceListbox()

Cấu trúc trong các sheet mà có tên trong cbSheet phải như nhau: dữ liệu cùng từ dòng 9, các tiêu đề phải cùng theo thứ tự từ B đến L

Thay 2 Sub cũ bằng 2 sub mới.
Mã:
Private Sub UserForm_Initialize()
    With cbSheet
        .AddItem "BienDong"
        .AddItem "VinhLong"
        .AddItem "BDHG"
        .AddItem "HopNhat"
        .AddItem "DongHa"
        .AddItem "VPP"
    End With
    lstDanhSachVPP.ColumnCount = 12
    cbSheet.ListIndex = 0
End Sub

Private Sub cbSheet_Change()
Dim lastRow As Long, r As Long, c As Long, count As Long, data(), result(), sh As Worksheet
    If cbSheet.ListIndex = -1 Then Exit Sub
    lstDanhSachVPP.Clear
    Set sh = ThisWorkbook.Worksheets(cbSheet.Value)
    With sh
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        If lastRow < 9 Then Exit Sub
        data = .Range("B9:L" & lastRow).Value
    End With
    For r = 1 To UBound(data)
        If data(r, 1) <> "" Then
            count = count + 1
            ReDim Preserve result(1 To 12, 1 To count)
            result(1, count) = count
            For c = 1 To 11
                result(c + 1, count) = data(r, c)
            Next c
        End If
    Next r
    lstDanhSachVPP.Column = result
End Sub
Bài đã được tự động gộp:


Sau bữa chiều tôi phải nằm 2, 3 tiếng. Đến tối (ở VN là đêm) tôi sẽ xem.
dạ e cảm ơn a ạ
 
Upvote 0
Không cần thiết Sub ganSourceListbox()

Cấu trúc trong các sheet mà có tên trong cbSheet phải như nhau: dữ liệu cùng từ dòng 9, các tiêu đề phải cùng theo thứ tự từ B đến L

Thay 2 Sub cũ bằng 2 sub mới.
Mã:
Private Sub UserForm_Initialize()
    With cbSheet
        .AddItem "BienDong"
        .AddItem "VinhLong"
        .AddItem "BDHG"
        .AddItem "HopNhat"
        .AddItem "DongHa"
        .AddItem "VPP"
    End With
    lstDanhSachVPP.ColumnCount = 12
    cbSheet.ListIndex = 0
End Sub

Private Sub cbSheet_Change()
Dim lastRow As Long, r As Long, c As Long, count As Long, data(), result(), sh As Worksheet
    If cbSheet.ListIndex = -1 Then Exit Sub
    lstDanhSachVPP.Clear
    Set sh = ThisWorkbook.Worksheets(cbSheet.Value)
    With sh
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        If lastRow < 9 Then Exit Sub
        data = .Range("B9:L" & lastRow).Value
    End With
    For r = 1 To UBound(data)
        If data(r, 1) <> "" Then
            count = count + 1
            ReDim Preserve result(1 To 12, 1 To count)
            result(1, count) = count
            For c = 1 To 11
                result(c + 1, count) = data(r, c)
            Next c
        End If
    Next r
    lstDanhSachVPP.Column = result
End Sub
Bài đã được tự động gộp:


Sau bữa chiều tôi phải nằm 2, 3 tiếng. Đến tối (ở VN là đêm) tôi sẽ xem.
Cảm ơn anh, em đã làm được nhưng sao, chỗ tìm kiếm: textbox em đánh vào tìm kiếm thì listbox nó hiện ra không giống với combobox mà em đã chọn là sao vậy anh:
Bước 1: em chọn combobox: Biendong ( listbox xuất hiện sheet Biendong đúng như chọn )
Bước 2: em đánh tìm kiếm với chữ ab thì dữ liệu listbox lại hiện ra là dữ liệu tại sheet Lọc chứ ko phải dữ liệu combobox: Biendong mà em đã chọn và xuất hiện ra như tại bước 1 là sao vậy anh mong anh chỉ dùm thank anh ( kèm hình)
 

File đính kèm

  • 3.png
    3.png
    213.6 KB · Đọc: 6
  • 4.png
    4.png
    103.7 KB · Đọc: 6
Upvote 0
Web KT
Back
Top Bottom