Tôi giải thích qua code:
UserForm_Initialize: Tức là lúc Userform chuẩn bị hiện ra trước mắt bạn, tôi cho thực thi gọi thủ tục tuhocvba để load thông tin vào listbox, sẽ trình bày ở dưới. Chú ý là lúc này Userform đang chuẩn bị thông tin để hiện ra trước mắt bạn nhé. Nó chưa thực sự hiện ra đâu.
Tôi thấy bạn dùng: UserForm_Activate để làm gì đó, tôi thấy có lẽ cho vào cái ở trên (UserForm_Initialize) mới là đúng thì phải. Mà tùy bạn.
Đoạn code này để lấy thông tin mà người dùng select trên listbox cho hiển thị trên các ô textbox và combobox mà bạn yêu cầu.
Private Sub ListBox1_Click()
'tuhocvba
Dim i As Integer
Dim n As Integer
n = ListBox1.ListCount
If n = 0 Then Exit Sub
For i = 0 To n - 1 Step 1
If ListBox1.Selected(i) = True Then
txtngay.text = ListBox1.List(i, 0)
txtsl.text = ListBox1.List(i, 4)
txtdu.text = ListBox1.List(i, 5)
OptionButton1.Value = True
cbten.text = ListBox1.List(i, 2)
txtnote.text = ListBox1.List(i, 7)
End If
Next i
End Sub
Tôi đoán là bạn muốn sửa hay cập nhật thì sẽ dựa vào mã hàng.
Mã hàng mà người dùng click là ListBox1.List(i, 1) , vì thế bạn có thể truyền vào tham số global để xử lý sau này.
Khai báo ở module bất kỳ:
public mahang_thvba as string
Rồi ở đoạn code trên thì viết thêm dòng code :
If ListBox1.Selected(i) = True Then
....
' chèn dòng code này vào trong lệnh If
mahang_thvba = ListBox1.List(i, 1)
End if
Tới đây thì bạn tự xử lý cập nhật hay xóa được rồi nhỉ. mahang_thvba là mã hàng mà người dùng đang select.
Ở Module1 tôi có viết thủ tục tuhocvba, nó có ý nghĩa là để nạp các giá trị từ bảng excel vào listbox với điều kiện là chưa nhập kho.
Có chú ý rằng,
chưa nhập kho là ký tự tiếng việt có dấu, tôi không thể cứ thế viết
s ="chưa nhập kho" cho nên tôi phải sử dụng Module2, đó là Module mà diễn đàn ta đã dày công xây dựng từ các nguồn tham khảo trên internet để xử lý tiếng việt có dấu.
Tóm lại Module2 chứa các hàm để chuyển ký tự như là "tuij hojc vba" thành "tụi học vba".
Trở lại Module1, thủ tục vba là để load lên listbox.
Đầu tiên làm việc với listbox thì cần chú ý:
.Clear
.ColumnCount = 8
.ColumnWidths = "60;90;168;42;42;42;90;72"
.ListStyle = fmListStyleOption
.MultiSelect = False
Không cần biết listbox được gọi lần đầu hay thế nào, phải clear nội dung của listbox.
Tiếp theo, bạn muốn listbox có 8 cột cho nên thiết định bằng 8.
Dòng code tiếp theo là thiết định độ rộng các cột. Độ rộng này tại sao lại như vậy. Nếu bạn để ý thì trên UserForm tôi đã thêm 8 label cho nó.
Và độ rộng của 8 label này chính là dãy số ở trên: 60;90;168;42;42;42;90;72
Việc này đáng ra bạn tự làm được, chả hạn làm có xấu thì mọi người cũng sẽ sửa cho. Nhưng bạn không làm gì cả. Ngược lại còn đi nhờ nơi khác.
Vậy là nếu người ta và tôi cùng làm, thì chẳng phải là mất thời gian của một người nào đó trong hai người hay sao? Bạn nghĩ thế nào mà lại làm vậy? Giả sử có làm thế thì cũng nên lên topic này báo stop, các anh đừng làm nữa, em đang nhờ chỗ khác rồi.
Tiếp theo là kiểu dáng, cho hiển thị Option. Đó chính là cái hình tròn tròn mà bạn thấy đó.
Bạn cần đăng nhập để thấy đính kèm
Nếu không thiết định thì hình này không có. Mà bài học listbox ở đây đã cung cấp link cho bạn rồi, không biết bạn đã đọc chưa.
Cuối cùng: Multiselect = Flase, có nghĩa là tại một thời điểm, người dùng chỉ chọn vào một dòng mà thôi. Không có chuyện nay chọn 1 dòng, tí nữa chọn thêm dòng nữa thì là 2 dòng.
Ở đây, người dùng được select vào một dòng thôi.
If CStr(arrthvba(i, 7)) = temp Then
.AddItem CStr(arrthvba(i, 1))
.List(cnt_tem, 1) = CStr(arrthvba(i, 2))
.List(cnt_tem, 2) = CStr(arrthvba(i, 3))
.List(cnt_tem, 3) = CStr(arrthvba(i, 4))
.List(cnt_tem, 4) = CStr(arrthvba(i, 5))
.List(cnt_tem, 5) = CStr(arrthvba(i, 6))
.List(cnt_tem, 6) = CStr(arrthvba(i, 7))
.List(cnt_tem, 7) = CStr(arrthvba(i, 8))
cnt_tem = cnt_tem + 1
End If
AddItem CStr(arrthvba(i, 1)) : Thêm một dòng mới vào listbox, bắt đầu dòng là giá trị arrthvba(i, 1), ở đây chính là ngày. giá trị bắt đầu dòng mới mặc định là cột 0 của Listbox. Chú ý listbox có 8 cột và bắt đầu từ 0,1,2,...7
Như vậy tôi đã có dòng mới và giá trị tại cột 0 đã được nạp. Tôi còn 7 cột nữa.
Đoạn code ở dưới:
.List(cnt_tem, 1) = CStr(arrthvba(i, 2))
.List(cnt_tem, 2) = CStr(arrthvba(i, 3))
.List(cnt_tem, 3) = CStr(arrthvba(i, 4))
.List(cnt_tem, 4) = CStr(arrthvba(i, 5))
.List(cnt_tem, 5) = CStr(arrthvba(i, 6))
.List(cnt_tem, 6) = CStr(arrthvba(i, 7))
.List(cnt_tem, 7) = CStr(arrthvba(i, 8))
nghĩa là trên dòng mà tôi đang làm việc ấy, bây giờ trên các cột 1,2,3,...7 tôi lần lượt nạp giá trị cho nó.
Bạn cần đăng nhập để thấy đính kèm
Tôi không thấy bạn hỏi, nhưng mạn phép, đã giúp thì phải giúp người ta lý giải, viết mấy dòng này, lại còn tốn công chụp hình minh họa nữa, mà không biết bạn có chịu đọc không.
Chúc bạn thu hoạch được nhiều kiến thức trên diễn đàn.