[Nạp dữ liệu cho listbox] Hỏi đáp viết code ứng dụng quản lý nhập xuất hàng hóa ?

  • Thread starter thanhphuongvip
  • Ngày gửi
T

thanhphuongvip

Guest
Xin chào các bạn, mình đang học VBA cơ bản và đang tập thực hành để viết một ứng dụng để quản lý nhập xuất hàng hóa để nâng cao trình độ.
Vì là mới học nên trong lúc viết có những cái thắc mắc nên mình lập topic này để mình hỏi những vấn đề chưa biết, mong bạn nào biết giải đáp cho mình.
Có những cái rất cơ bản nhưng mình chưa biết nên cũng hỏi, mấy bạn đừng chê mình ngu nha :D

Câu hỏi đầu tiên:
Mình muốn đưa dữ liệu từ sheet3 sang listbox ListSanPham như sau, ko biết sai chỗ nào:

Mã:
Private Sub UserForm_Initialize()
Dim ArrMaHang()  'Khai báo mảng
Dim lr As Long
lr = Sheet3.Range("B" & Rows.Count).End(xlUp).Row
ArrMaHang = Sheet3.Range("B10:D" & lr).Value  'đưa dữ liệu vào mảng
ListSanPham.RowSource = ArrMaHang   'gán mảng cho listbox
End Sub
Không biết sai chỗ nào mà nó báo lỗi Type Miss Match!
Đa tạ mọi người!
 

bvtvba

Thành viên mới
Bạn nên đưa file lên thì tốt hơn.
Bạn hãy dùng code sau:
Mã:
ListSanPham.List = Sheet3.Range("B10:D" & lr).Value
Mình không hiểu tại sao bạn phải đưa vào mảng, rồi lại gán listbox qua mảng.
Trên diễn đàn cũng đã khuyên không nên dùng RowSource.
Bạn có thể tham khảo bài viết về listbox tại đây:
 
T

thanhphuongvip

Guest
Mình không hiểu tại sao bạn phải đưa vào mảng, rồi lại gán listbox qua mảng.
Cảm ơn bạn, mình thay Rowsource thành List thì nó chạy đc rồi. sở dĩ mình dùng mảng là vì còn sử lụng lại nhiều lần mảng này, đỡ mất công sau này phải gọi lại range nhiều lần.

Mình đang làm tiếp có gì ko hiểu mình hỏi nhé!
Đa tạ!
 

bvtvba

Thành viên mới
Vậy thì cứ dùng mảng thôi:
Mã:
lr = Sheet3.Range("B" & Rows.Count).End(xlUp).Row
ArrMaHang = Sheet3.Range("B10:D" & lr).Value  'đưa dữ liệu vào mảng
ListSanPham.List = ArrMaHang   'gán mảng cho listbox-> tuhocvba.net 4/9/2019
 
T

thanhphuongvip

Guest
Mình tiếp tục hỏi về file này:

Mình tạo chức năng tìm kiếm cho cả MaHang và TenHang:
Bạn cần đăng nhập để thấy hình ảnh


Nhưng seach ra kết quả ko khớp, code như sau:
Mã:
Option Explicit
Dim ArrMaHang()
    
Private Sub txtMaHang_Change()
ListSanPham.Clear
If txtMaHang.Text = vbNullString Then ListSanPham.List = ArrMaHang

Dim arrFound As Variant
ReDim arrFound(1 To UBound(ArrMaHang), 1 To 3)

Dim i As Long, j As Long
Dim SeachText As String
SeachText = txtMaHang

Dim MaHang As String
Dim TenHang As String
Dim a As Long

For i = 1 To UBound(ArrMaHang)
    MaHang = ArrMaHang(i, 1)
    TenHang = ArrMaHang(i, 2)
    If InStr(1, MaHang, SeachText, vbTextCompare) > 0 Then
        a = a + 1
        For j = 1 To 3
            arrFound(a, j) = ArrMaHang(a, j)
        Next j
    ElseIf InStr(1, TenHang, SeachText, vbTextCompare) > 0 Then
        a = a + 1
        For j = 1 To 3
            arrFound(a, j) = ArrMaHang(i, j)
        Next j
    End If
Next i

ListSanPham.List = arrFound
End Sub

Private Sub UserForm_Initialize()
Dim lr As Long
lr = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
ArrMaHang = Sheet1.Range("B10:D" & lr).Value
ListSanPham.List = ArrMaHang

End Sub
Không biết mình sai chỗ nào, các bạn xem file chỉ dùm mình với:
 

bvtvba

Thành viên mới
Chỉ ra lỗi sai thì cũng được, nhưng mình thắc mắc là, cứ có lỗi sai thì sau này bạn lại hỏi à?

Việc code ra kết quả sai là bình thường. Người code nếu không có kỹ năng dò lỗi do code chính mình làm ra, thì còn nói làm gì nữa.
Trong list video của diễn đàn, mình thấy có hướng dẫn sử dụng F5, F8.
Trong các bài thảo luận mình xem thì vbano1 cũng hướng dẫn bạn cách dò lỗi đó thôi.

Vậy tại sao bạn không thử một lần sử dụng F5, F8 để dò lỗi, trỏ chuột vào các biến, xem giá trị nó hiển thị đúng ý đồ của bạn chưa, nếu sai thì sai bắt đầu từ đâu...
 
T

thanhphuongvip

Guest
Chỉ ra lỗi sai thì cũng được, nhưng mình thắc mắc là, cứ có lỗi sai thì sau này bạn lại hỏi à?

Việc code ra kết quả sai là bình thường. Người code nếu không có kỹ năng dò lỗi do code chính mình làm ra, thì còn nói làm gì nữa.
Trong list video của diễn đàn, mình thấy có hướng dẫn sử dụng F5, F8.
Trong các bài thảo luận mình xem thì vbano1 cũng hướng dẫn bạn cách dò lỗi đó thôi.

Vậy tại sao bạn không thử một lần sử dụng F5, F8 để dò lỗi, trỏ chuột vào các biến, xem giá trị nó hiển thị đúng ý đồ của bạn chưa, nếu sai thì sai bắt đầu từ đâu...
Xin lỗi nếu làm phiền bạn, những cái sai mình tự tìm ko ra nên mới hỏi, vì mình ý thức được việc tự học, tự tìm lỗi sai mới nhớ lâu.
F8 vs F5 mình cũng đã dùng.
Trong trường hợp trên mình thì nó ko báo lỗi mà vẫn ra kết quả, nên việc tìm ra lỗi sai nó hơi khó với một người mới học như mình.
Bạn chuyên nghiệp rồi nên cảm thấy vấn đề nó dễ là đúng, cũng giống như mình là giáo viên excel, học sinh hỏi mình những cái về hàm excek mà mình thấy nó rất cơ bản, nhưng vẫn trả lời, vì khi chỉ ra lỗi sai nó sẽ rút kinh nghiệm.
Nếu bạn thấy khó chịu thì có thể bỏ qua bài viết của mình, không sao đâu ạ!
Cảm ơn bạn đã quan tâm!
 

bvtvba

Thành viên mới
Ơ hay, đâu phải cứ có lỗi thì mới dùng F5, F8 hả bạn. Thế là bạn không xem video rồi. Bạn có thể dùng nó để chặn lệnh vào cái chỗ mà bạn quan tâm ấy. Rồi chạy từng dòng lệnh mà kiểm tra.
Mọi người cũng có phải là thánh đâu mà nhìn code để đoán hả bạn, bạn thần tượng mọi người quá. Mọi người cũng sẽ làm y như tôi nói ở trên, đó là cách làm việc đúng. Vậy thay vì mọi người làm, bây giờ bạn làm, còn tôi nói đường lối để cho bạn tự làm được. Bạn thấy khó ở đâu ạ? Hiện tại bạn đang chặn lệnh ở dòng nào rồi ạ?
Nếu bạn thấy khó chịu vì mình không làm thay, thì bạn bỏ qua cho mình nhé. Có luật nào yêu cầu thành viên giúp nhau phải làm thay đâu, làm cách mạng người ta cũng chỉ nêu đường lối, còn quần chúng thực hiện mà.
 
T

thanhphuongvip

Guest
@bvtvba ko làm thay bạn ạ, chỉ ra lỗi thôi, trong khi, mình ko yêu cầu bạn viết code.
Trong khi trả lời qua trả lời lại với bạn, có người khác đã chỉ giúp mình rồi, cảm ơn bạn nha.

Mình ghi nhầm chỗ:
arrFound(a, j) = ArrMaHang(a, j)
thay vì phải ghi
arrFound(a, j) = ArrMaHang(i, j)
 

bvtvba

Thành viên mới
Tôi lại cứ tưởng bạn tự làm được, chứ người khác chỉ cho thì lần sau lại vẫn vậy. Khả năng dò lỗi vẫn không tiến thêm được bước nào.
Lỗi thì không phải lúc nào cũng có, khi có thì phải nắm bắt lấy, dò ra lỗi, năng lực mới lên. Chứ bạn nghĩ có bài tập dò lỗi cho bạn luyện tập à?
 

tuhocvba

Administrator
Thành viên BQT
Những lỗi ghi nhầm như thế này chẳng có gì đảm bảo trong tương lai không mắc phải. Nếu là cả một chương trình dài tới cả ngàn dòng code thì làm thế nào.
Mọi người khi có lỗi thì thường nóng ruột muốn giải quyết ngay. Cứ bình tĩnh tự dò, đã mất tới mấy tiếng chưa?
Kỹ năng giải quyết vấn đề quan trọng hơn kết quả của việc giải quyết xong hay chưa. Nếu không có kỹ năng thì lần sau lại vẫn chịu thua.

Người khác chỉ cho mình kỹ năng mới là người thầy.

Phương pháp chặn code và dò là đúng, trong mọi trường hợp, cho tất cả mọi người-người chuyên nghiệp hay không chuyên nghiệp, thông minh hay không thông minh.
 
Top