Nhờ mọi người xem giúp lỗi khi update dữ liệu cho listbox

Liên hệ QC

ngoquoclinh_00

Thành viên mới
Tham gia
18/4/10
Bài viết
25
Được thích
1
Mình có tạo listbox gồm danh mục các hạng mục nghiệm thu, mỗi khi click chuột thì các dữ liệu của dòng có trong listbox sẽ được hiện ngược lại cho textbox cho tiện theo dõi và cập nhật (nếu có). Mọi thứ đều ổn cho đến khi mình nhấn update (sửa dữ liệu textbox) thì chỉ có cột đầu tiên là được update, mình đã rà soát kỹ nhưng vẫn không hiểu được là tại sao dữ liệu ở cột thứ nhất được update nhưng các cột còn lại thì không. Nhờ mọi người xem giúp chỉ giáo cho mình. Chân thành cảm ơn!
1VBA.jpg2 VBA.jpg
Private Sub CB_SUAHANGMUC_Click()
Dim er As Long
er = dshangmuc.ListIndex
Sheets("Ma BB").Range("F" & 28 + er).Value = TB_GLOBAL.Text
Debug.Print TB_GLOBAL
Sheets("Ma BB").Range("G" & 28 + er).Value = TB_LOCAL.Text
Debug.Print TB_LOCAL
Sheets("Ma BB").Range("H" & 28 + er).Value = TB_CUONGDO.Text
Debug.Print TB_CUONGDO
Sheets("Ma BB").Range("I" & 28 + er).Value = TB_CAUKIEN.Text
Debug.Print TB_CAUKIEN
If CK_COTTHEP = True Then
Sheets("Ma BB").Range("J" & 28 + er).Value = "YES"
End If
UserForm_Initialize
End Sub

Private Sub dshangmuc_Click()
With Me
.TB_GLOBAL.Value = .dshangmuc.List(.dshangmuc.ListIndex, 0)
.TB_LOCAL.Value = .dshangmuc.List(.dshangmuc.ListIndex, 1)
.TB_CAUKIEN.Value = .dshangmuc.List(.dshangmuc.ListIndex, 2)
.TB_CUONGDO.Value = .dshangmuc.List(.dshangmuc.ListIndex, 3)
If .dshangmuc.List(.dshangmuc.ListIndex, 4) = "YES" Then
.CK_COTTHEP = True
Else: .CK_COTTHEP = False
End If
End With
End Sub
Private Sub CB_themhangmuc_Click()
Dim er As Long
er = Sheets("Ma BB").Range("F" & Rows.Count).End(xlUp).Row + 1
Sheets("Ma BB").Range("F" & er).Value = TB_GLOBAL
Sheets("Ma BB").Range("G" & er).Value = TB_LOCAL
Sheets("Ma BB").Range("H" & er).Value = TB_CUONGDO
Sheets("Ma BB").Range("I" & er).Value = TB_CAUKIEN
If CK_COTTHEP = True Then
Sheets("Ma BB").Range("J" & er).Value = "YES"
End If
UserForm_Initialize
End Sub
Private Sub UserForm_Initialize()
Dim arr, kq, kq1 As Variant
Dim i, j, v, n, no, lr, er As Long
Dim dic As Object
Dim key As Variant
Dim dm As Range
Sheets("Ma BB").Range("M27:XFD1000").Clear ' Xoa du lieu truoc khi bung ra
no = Application.WorksheetFunction.CountA(Sheets("Ma BB").Range("F28:F5000"))
If no = 0 Then
Exit Sub
End If
Set dic = CreateObject("Scripting.dictionary") ' Tao dictionary
ReDim arr(1 To no)
arr = Sheets("Ma BB").Range("F28:G" & 27 + no).Value
n = 0
For i = 1 To UBound(arr, 1)
If Not dic.exists(arr(i, 1)) Then
dic.Add arr(i, 1), arr(i, 1) ' add key & item
End If
Next i
f = 0
On Error Resume Next
For Each key In dic.keys
ReDim kq1(1 To UBound(arr, 1) * UBound(arr, 2))
v = 1
For i = 1 To UBound(arr)
If arr(i, 1) = key Then
v = v + 1
kq1(1) = arr(i, 1)
kq1(v) = arr(i, 2)
End If
Next i
f = f + 1
Sheets("Ma BB").Cells(27, 12 + f).Resize(v, 1) = WorksheetFunction.Transpose(kq1) ' sap xep thong ke lai du lieu
Next key
er = Sheets("Ma BB").Range("F" & Rows.Count).End(xlUp).Row + 1
Set dm = Sheets("Ma BB").Range("F28:J" & er)
dshangmuc.RowSource = dm.Address
dshangmuc.RowSource = dm.Address(External:=True) ' khai bao list box
End Sub
 

File đính kèm

  • file hoi.xlsm
    956.2 KB · Đọc: 6
Cái bạn cần ở đây là gì thế. Tại thấy bạn có câu trả lời rồi đó thôi
 
Upvote 0
Rốt cuộc là mình cần biết là nhìn k thấy lỗi code mà lại update dữ liệu cho 3 cột còn lại không được (nếu bị lỗi thì phải bị hết). Mình cần dữ liệu được update hết.
 
Upvote 0
Upvote 0
Trong Sub UserForm_Initialize thay
Mã:
Set dm = Sheets("Ma BB").Range("F28:J" & er)
dshangmuc.RowSource = dm.Address
dshangmuc.RowSource = dm.Address(External:=True) ' khai bao list box

bằng

Mã:
er = Sheets("Ma BB").Range("F" & Rows.Count).End(xlUp).Row + 1
dshangmuc.List = Worksheets("Ma BB").Range("F28:J" & er).Value
 
Upvote 0
Rốt cuộc là mình cần biết là nhìn k thấy lỗi code mà lại update dữ liệu cho 3 cột còn lại không được (nếu bị lỗi thì phải bị hết). Mình cần dữ liệu được update hết.
Khai thêm biến sử dụng thay cho các textbox
Thay Sub CB_SUAHANGMUC_Click() thành
Mã:
Private Sub CB_SUAHANGMUC_Click()
    Dim er As Long, X1$, X2$, X3$, X4$
    X1 = TB_GLOBAL.Text
    X2 = TB_LOCAL.Text
    X3 = TB_CUONGDO.Text
    X4 = TB_CAUKIEN.Text
    er = dshangmuc.ListIndex
    Sheets("Ma BB").Range("F" & 28 + er).Value = X1
    Debug.Print TB_GLOBAL
    Sheets("Ma BB").Range("G" & 28 + er).Value = X2
    'Debug.Print TB_LOCAL
    Sheets("Ma BB").Range("H" & 28 + er).Value = X3
    'Debug.Print TB_CUONGDO
    Sheets("Ma BB").Range("I" & 28 + er).Value = X4
    'Debug.Print TB_CAUKIEN
    If CK_COTTHEP = True Then
        Sheets("Ma BB").Range("J" & 28 + er).Value = "YES"
    End If
    UserForm_Initialize
End Sub
 
Upvote 0
Comment mấy cái dòng On Error Resume Next đi.
thử rồi mà vẫn không đc bạn ak, mình cảm giác dữ liệu textbox đang bị mặc định khi chuyển từ listbox lên textbox
Bài đã được tự động gộp:

Trong Sub UserForm_Initialize thay
Mã:
Set dm = Sheets("Ma BB").Range("F28:J" & er)
dshangmuc.RowSource = dm.Address
dshangmuc.RowSource = dm.Address(External:=True) ' khai bao list box

bằng

Mã:
er = Sheets("Ma BB").Range("F" & Rows.Count).End(xlUp).Row + 1
dshangmuc.List = Worksheets("Ma BB").Range("F28:J" & er).Value
mình làm được rồi, Thank bạn nhiều, hèn gì thấy mấy chuyên gia khuyến cáo k nên xài Rowsource. :D
 
Upvote 0
mình làm được rồi, Thank bạn nhiều, hèn gì thấy mấy chuyên gia khuyến cáo k nên xài Rowsource. :D
Xài cũng được nhưng tùy từng trường hợp, và phải ý thức được những chuyện sẽ sảy ra.

Tôi phân tích cho bạn hiểu. Không có lỗi gì cả mà đó là "hậu quả" của việc dùng RowSource.

Giả sử chọn dòng đầu trong ListBox. Sẽ có trong 4 textbox: b5455, p5, 20, 20

Giả sử sửa 4 textbox thành: b5455 ngay mai em di, p5 bien nho ten em goi ve, 2012, 2034.

Bây giờ nhấn nút "SƯA HẠNG MỤC".

Mã:
Private Sub CB_SUAHANGMUC_Click()
Dim er As Long
er = dshangmuc.ListIndex
Sheets("Ma BB").Range("F" & 28 + er).Value = TB_GLOBAL.Text    ' (A)
Debug.Print TB_GLOBAL
Sheets("Ma BB").Range("G" & 28 + er).Value = TB_LOCAL.Text    ' (B)
Debug.Print TB_LOCAL
Sheets("Ma BB").Range("H" & 28 + er).Value = TB_CUONGDO.Text
Debug.Print TB_CUONGDO
Sheets("Ma BB").Range("I" & 28 + er).Value = TB_CAUKIEN.Text
Debug.Print TB_CAUKIEN
If CK_COTTHEP = True Then
Sheets("Ma BB").Range("J" & 28 + er).Value = "YES"
End If
UserForm_Initialize
End Sub

Private Sub dshangmuc_Click()
With Me
.TB_GLOBAL.Value = .dshangmuc.List(.dshangmuc.ListIndex, 0)
.TB_LOCAL.Value = .dshangmuc.List(.dshangmuc.ListIndex, 1)
.TB_CAUKIEN.Value = .dshangmuc.List(.dshangmuc.ListIndex, 2)
.TB_CUONGDO.Value = .dshangmuc.List(.dshangmuc.ListIndex, 3)
If .dshangmuc.List(.dshangmuc.ListIndex, 4) = "YES" Then
.CK_COTTHEP = True
Else: .CK_COTTHEP = False
End If
End With
End Sub

Sau khi thực hiện dòng (A)
Sheets("Ma BB").Range("F" & 28 + er).Value = TB_GLOBAL.Text

thì trên sheet "Ma BB" sẽ có trong các cột F:I: b5455 ngay mai em di, p5, 20, 20 (mới chỉ thay đổi cột F)

Do dùng ListBox.RowSource mà vùng RowSource thay đổi (trong cột F) nên ngay lập tức ListBox.List được làm mới (mặc dù giao diện ListBox chưa được làm mới). dshangmuc_Click sẽ được thực hiện và do vậy 4 textbox được thay đổi nội dung lấy từ ListBox.List. Mà ListBox.List lấy từ sheet do RowSource nên dòng đầu trong ListBox là b5455 ngay mai em di, p5, 20, 20. Do thực hiện Click nên 4 textbox sẽ có: b5455 ngay mai em di, p5, 20, 20. Vậy từ (B) trở đi sẽ có cột G, H, I = p5, 20, 20.
 
Lần chỉnh sửa cuối:
Upvote 0
“Em” của bác cũng đỏng đà đỏng đảnh dzữ.
Đụng cái là “ngày mai em đi” mà có thấy đi đâu?!
 
Upvote 0
Xài cũng được nhưng tùy từng trường hợp, và phải ý thức được những chuyện sẽ sảy ra.

Tôi phân tích cho bạn hiểu. Không có lỗi gì cả mà đó là "hậu quả" của việc dùng RowSource.

Giả sử chọn dòng đầu trong ListBox. Sẽ có trong 4 textbox: b5455, p5, 20, 20

Giả sử sửa 4 textbox thành: b5455 ngay mai em di, p5 bien nho ten em goi ve, 2012, 2034.

Bây giờ nhấn nút "SƯA HẠNG MỤC".

Mã:
Private Sub CB_SUAHANGMUC_Click()
Dim er As Long
er = dshangmuc.ListIndex
Sheets("Ma BB").Range("F" & 28 + er).Value = TB_GLOBAL.Text    ' (A)
Debug.Print TB_GLOBAL
Sheets("Ma BB").Range("G" & 28 + er).Value = TB_LOCAL.Text    ' (B)
Debug.Print TB_LOCAL
Sheets("Ma BB").Range("H" & 28 + er).Value = TB_CUONGDO.Text
Debug.Print TB_CUONGDO
Sheets("Ma BB").Range("I" & 28 + er).Value = TB_CAUKIEN.Text
Debug.Print TB_CAUKIEN
If CK_COTTHEP = True Then
Sheets("Ma BB").Range("J" & 28 + er).Value = "YES"
End If
UserForm_Initialize
End Sub

Private Sub dshangmuc_Click()
With Me
.TB_GLOBAL.Value = .dshangmuc.List(.dshangmuc.ListIndex, 0)
.TB_LOCAL.Value = .dshangmuc.List(.dshangmuc.ListIndex, 1)
.TB_CAUKIEN.Value = .dshangmuc.List(.dshangmuc.ListIndex, 2)
.TB_CUONGDO.Value = .dshangmuc.List(.dshangmuc.ListIndex, 3)
If .dshangmuc.List(.dshangmuc.ListIndex, 4) = "YES" Then
.CK_COTTHEP = True
Else: .CK_COTTHEP = False
End If
End With
End Sub

Sau khi thực hiện dòng (A)


thì trên sheet "Ma BB" sẽ có trong các cột F:I: b5455 ngay mai em di, p5, 20, 20 (mới chỉ thay đổi cột F)

Do dùng ListBox.RowSource mà vùng RowSource thay đổi (trong cột F) nên ngay lập tức ListBox.List được làm mới (mặc dù giao diện ListBox chưa được làm mới). dshangmuc_Click sẽ được thực hiện và do vậy 4 textbox được thay đổi nội dung lấy từ ListBox.List. Mà ListBox.List lấy từ sheet do RowSource nên dòng đầu trong ListBox là b5455 ngay mai em di, p5, 20, 20. Do thực hiện Click nên 4 textbox sẽ có: b5455 ngay mai em di, p5, 20, 20. Vậy từ (B) trở đi sẽ có cột G, H, I = p5, 20, 20.
Vậy tức là rowscore là thay đổi ngay tức khắc khi bất kỳ 1 dữ liệu nguồn bị thay đổi, dẫn đến listbox.list thay đổi trước, rồi mấy cái textbox sau chạy theo listbox.list mới. Cảm ơn bạn nhiều vì đã giải thích cặn kẽ. :)
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom