Xin sửa giúp userform: Cập nhật dữ liệu sau khi tìm kiếm (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

ntquantn

Thành viên chính thức
Tham gia
13/4/12
Bài viết
72
Được thích
12
Chào cả nhà,

Userform của mình đang bị lỗi phần cập nhật dữ liệu. tức là: Khi mở fom mà click chọn để sửa dữ liệu thì được nhưng nếu sau khi tìm kiếm , click vào dữ liệu tìm được trong listbox rồi sửa dữ liệu thì khi bấm nút cập nhật dữ liệu bị cập nhật sai, (không đúng với dòng dữ liệu tương ứng trong sheet).

Mình đã làm theo hướng dẫn sửa lỗi của bạn NguyenNgocThuHiendarknightno007 nhưng vẫn không sao xác định được vị trí dòng tương ứng trong sheet khi click vào listbox sau khi tìm kiếm


Rất mong các bạn xem và sửa giúp, mình cảm ơn rất nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Chào cả nhà,

Mình làm 1 userform để cập nhật, thêm dữ liệu đã ok, nhưng khi ghép thêm phần tìm kiếm thì lại bị lỗi

Userform khi chưa có tìm kiếm thì có thể thêm mới, sửa dữ liệu. Khi click chọn trong listbox thì hiện nội dung trong các ô tương ứng. Đã chạy trơn tru.

Userform tìm kiếm mình sử dụng filter2Darray và làm theo hướng dẫn của Bác NDU96081631 cũng đã chạy ok.
Nhưng khi ghép vào cùng 1 userform thì lỗi, (nhưng nếu chỉ dùng như 2 userform độc lập như ở trên thì vẫn được)
ví dụ sau khi tìm kiếm mà click chọn trong listbox thì bị lỗi.

(Theo mình nghĩ thì chắc do mảng dữ liệu trả về sau khi tìm kiếm là khác so với lúc ban đầu mà không biết cách khắc phục sao)

Rất mong các bạn xem và sửa giúp, mình cảm ơn nhiều.
Lỗi chỗ tên khách hàng. mỗi khi tên khách hàng thay đổi thì lại cập nhật lại listbox.
 
Upvote 0
Chắc không phải vì kể cả mình bỏ phần thay đổi theo tên khách nhập vào thì vẫn bị.

Cái form trên nếu khi mở form mà duyệt chọn sửa , nhập mới (không dùng tìm kiếm) thì được, không bị lỗi. Nhưng sau khi dùng tìm kiếm rồi mới chọn để sửa thì bị lỗi "runtime 381: Could not get the list property. Invaild property array index). Theo mình hiểu thì chắc do mảng trả về khi tìm kiếm ???
 
Upvote 0
Lỗi là lúc kích vô, code nó cập nhật lại lại cái list,nhưng mà giá trị i thì vẫn lấy theo cái đầu nên kiếm k dc.
Lúc mà tìm kiếm. thì cho cái dòng đó trong listbox vô 1 mảng, rồi mới up lại lên form. listbox sort dc bình thường.
 
Upvote 0
Lỗi là lúc kích vô, code nó cập nhật lại lại cái list,nhưng mà giá trị i thì vẫn lấy theo cái đầu nên kiếm k dc.
Lúc mà tìm kiếm. thì cho cái dòng đó trong listbox vô 1 mảng, rồi mới up lại lên form. listbox sort dc bình thường.

Bạn có thể nói rõ thêm được không?? ví dụ với đoạn dưới thì mình tưởng như thế thì listbox1 khi đó đã nhận giá trị mảng trả về khi tìm kiếm rồi chứ nhỉ?

Private Sub Nuttimkiem_Click()
Dim aDes
aDes = FilterMain(aSrc)
If IsArray(aDes) Then Me.ListBox1.List = aDes
End Sub

Private Sub ListBox1_Click()
Dim i As Long
With Me.ListBox1
i = .ListIndex
' stt.Text = Me.ListBox1.List(i, 0)
Me.cobtenKH.Value = Me.ListBox1.List(i, 1)
'Me.gioitinh.Value = Me.ListBox1.List(i, 2)
Me.cobPhone.Value = Me.ListBox1.List(i, 3)
Me.txtADD.Text = Me.ListBox1.List(i, 4)
Me.cobNhom.Value = Me.ListBox1.List(i, 5)
Me.txtNote.Text = Me.ListBox1.List(i, 6)

End With
End Sub
 
Upvote 0
Nguyên nhân lỗi là khi click vào một item, code cập nhật các textbox, quá trình này làm cho phần lọc lại được thực hiện làm code nếu không chạy lỗi thì cũng chạy sai kết quả.
 
Upvote 0
Bạn có thể nói rõ thêm được không?? ví dụ với đoạn dưới thì mình tưởng như thế thì listbox1 khi đó đã nhận giá trị mảng trả về khi tìm kiếm rồi chứ nhỉ?

Private Sub Nuttimkiem_Click()
Dim aDes
aDes = FilterMain(aSrc)
If IsArray(aDes) Then Me.ListBox1.List = aDes
End Sub

Private Sub ListBox1_Click()
Dim i As Long
With Me.ListBox1
i = .ListIndex
' stt.Text = Me.ListBox1.List(i, 0)
Me.cobtenKH.Value = Me.ListBox1.List(i, 1)
'Me.gioitinh.Value = Me.ListBox1.List(i, 2)
Me.cobPhone.Value = Me.ListBox1.List(i, 3)
Me.txtADD.Text = Me.ListBox1.List(i, 4)
Me.cobNhom.Value = Me.ListBox1.List(i, 5)
Me.txtNote.Text = Me.ListBox1.List(i, 6)

End With
End Sub
Me.cobtenKH.Value = Me.ListBox1.List(i, 1)
lỗi từ cái đoạn này nè. lúc me.cobtenKH.value thay đổi, thì bạn chạy sự kiện change dẫn tới list nó bị lọc lại.
Tiếp tục chạy dòng tiếp theo Me.cobPhone.Value = Me.ListBox1.List(i, 3) thì lisbox lúc này k phải là listbox lúc đầu. vì đã bị lọc lại rồi, nên giá trị i đưa vô sẽ bị sai.
Sửa lỗi ntn:
i = listindex
xong tạo 1 mảng, lấy giá trị listbox vào thời điểm đó vào mảng.
xong rồi từ mảng gán lại cho các textbox, combobox trên form.
 
Upvote 0
Nguyên nhân lỗi là khi click vào một item, code cập nhật các textbox, quá trình này làm cho phần lọc lại được thực hiện làm code nếu không chạy lỗi thì cũng chạy sai kết quả.

Nguyenngocthuhien cho mình hỏi chút: Mình đang nghiên cứu đoạn code của bạn mà chưa hiểu Việc khai báo mIsEnableSearch có ý nghĩa tác dụng thế nào?? tại sao lại cần có ??

Nhờ bạn giải thích thêm về đoạn code của nút tìm kiếm:

Private Sub Nuttimkiem_Click()
Dim bOlder As Boolean
bOlder = mIsEnableSearch
mIsEnableSearch = True
Call Search
mIsEnableSearch = bOlder
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyenngocthuhien cho mình hỏi chút: Mình đang nghiên cứu đoạn code của bạn mà chưa hiểu Việc khai báo mIsEnableSearch có ý nghĩa tác dụng thế nào?? tại sao lại cần có ??

Nhờ bạn giải thích thêm về đoạn code của nút tìm kiếm:

Private Sub Nuttimkiem_Click()
Dim bOlder As Boolean
bOlder = mIsEnableSearch
mIsEnableSearch = True
Call Search
mIsEnableSearch = bOlder
End Sub
Nó dùng để chống việc lọc khi bạn đang nạp dữ liệu cho các textbox. Trước khi nạp dữ liệu cho các textbox thì cho nó bằng false, lúc đó việc lọc sẽ không được thực hiện. Còn khi click nút tìm kiếm thì thiết lập nó lại bằng True trước khi lọc.
 
Upvote 0
Nó dùng để chống việc lọc khi bạn đang nạp dữ liệu cho các textbox. Trước khi nạp dữ liệu cho các textbox thì cho nó bằng false, lúc đó việc lọc sẽ không được thực hiện. Còn khi click nút tìm kiếm thì thiết lập nó lại bằng True trước khi lọc.

Cảm ơn bạn nhiều

Bạn xem giúp mình xử lý nút cập nhật lại đúng vị trí của dòng data có thay đổi với. Mình vẫn chưa xử lý được, toàn bị lỗi Runtime hoặc nhảy sai lung tung cả
 
Lần chỉnh sửa cuối:
Upvote 0
Sao khi ở sự kiện listbox_click () mình đã gán giá trị curentrow = listbox1.listindex (đã khai báo trong Option Explicit) nhưng vẫn không được. Còn cái nút này mà mãi không xong :(
curentrow = listbox1.listindex cái này nó đâu đồng nghĩa với cái row trong sheet đâu. lọc xong thì giá trị trong listbox nó đã khác rồi. Cái cột A, cái đó là số thứ tự hay sao?
 
Upvote 0

Cảm ơn bạn đã phản hồi giúp mình. Nhưng mình vẫn chưa hiểu lắm

Theo như đoạn code (đã chạy được) thì Việc gán biến i = .ListIndex xong rồi RowIndex = i ở ngay bên dưới thì có tác dụng gì? vì theo mình hiểu khi đó RowIndex cũng sẽ không cố định nữa??? Ngoài ra toàn bộ bên dưới mình không thấy sử dụng đến Rowindex gì cả?

Nếu có thể bạn giải thích giúp mình thêm về chỗ gán Stt = Me.ListBox1.List(i, 0) ở Private Sub ListBox1_Click() và việc dùng nó ở dòng Sheet7.Range("A3").Offset(Stt).Resize(1, 7).Value = Arr

Cảm ơn bạn rất nhiều
Mã:
Private Sub ListBox1_Click()
Dim i As Long
On Error GoTo Loi
With ListBox1
mIsEnableSearch = False
i = .ListIndex
RowIndex = i
Stt = Me.ListBox1.List(i, 0)
Me.cobtenKH.Value = Me.ListBox1.List(i, 1)
'Me.gioitinh.Value = Me.ListBox1.List(i, 2)
Me.cobPhone.Value = Me.ListBox1.List(i, 3)
Me.txtADD.Text = Me.ListBox1.List(i, 4)
Me.cobNhom.Value = Me.ListBox1.List(i, 5)
Me.txtNote.Text = Me.ListBox1.List(i, 6)
End With
End Sub

Private Sub Nutsua_Click()
Dim i As Long, currRow As Long, LastRow As Long, Arr(1 To 7)
LastRow = Worksheets("Khachhang").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
i = ListBox1.ListIndex
Arr(1) = Stt
Arr(2) = Me.cobtenKH.Value
'arr(3) = Me.gioitinh.Value
Arr(4) = Me.cobPhone.Value
Arr(5) = Me.txtADD.Text
Arr(6) = Me.cobNhom.Value
Arr(7) = Me.txtNote.Text
Sheet7.Range("A3").Offset(Stt).Resize(1, 7).Value = Arr
RefreshListbox
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình tham gia diễn đàn hơn 5 năm, đăng 8 thớt, 50 bài viết thì chí ít cũng phải biết trả lời bài của người khác có trích dẫn, nếu không thành nói bâng quơ (hay độc thoại ấy).

Thấy người ta đặt được cái gì là Code, công thức vào cái khung khung... cho dễ phân biệt, người xem dễ quan sát, người cần cũng biết... thì mình cũng cố mà tìm cách làm như thế.
Như trên thì khác gì món mì tôm ngâm nước...
upload_2017-10-24_14-23-40.png
 
Upvote 0
Mã:
Private Sub Nutsua_Click()
Dim i As Long, currRow As Long, LastRow As Long, Arr(1 To 7)
LastRow = Worksheets("Khachhang").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
i = ListBox1.ListIndex
Arr(1) = Stt
Arr(2) = Me.cobtenKH.Value
'arr(3) = Me.gioitinh.Value
Arr(4) = Me.cobPhone.Value
Arr(5) = Me.txtADD.Text
Arr(6) = Me.cobNhom.Value
Arr(7) = Me.txtNote.Text
Sheet7.Range("A3").Offset(Stt).Resize(1, 7).Value = Arr
RefreshListbox
End Sub
Ở bài 14, mình cũng chưa hiểu lắm code chỉnh sửa này, kính nhờ GPE giải thích giúp đỡ. (mình có xem một số code trên diễn đàn nhưng thực sự khong hiểu lắm về chỉnh sửa dữ liệu)
 
Upvote 0
Giải quyết 1 cách đơn giản là khi nạp listbox thêm 1 cột ghi số thứ tự dòng của Excel. Căn cứ vào đó ghi xuống thì không sai. Ngoài ra, trong sự kiện click không nên lọc lại hoặc nạp lại dữ liệu, dùng 2 hoặc 3 textbox hoặc combobox làm điều kiện lọc bên ngoài listbox. Cẩn thận hơn nữa thì không cho nạp lại dữ liệu trong sự kiện change của các điều kiện lọc mà dùng 1 nút nhấn để lọc.
 
Upvote 0
Giải quyết 1 cách đơn giản là khi nạp listbox thêm 1 cột ghi số thứ tự dòng của Excel. Căn cứ vào đó ghi xuống thì không sai. Ngoài ra, trong sự kiện click không nên lọc lại hoặc nạp lại dữ liệu, dùng 2 hoặc 3 textbox hoặc combobox làm điều kiện lọc bên ngoài listbox. Cẩn thận hơn nữa thì không cho nạp lại dữ liệu trong sự kiện change của các điều kiện lọc mà dùng 1 nút nhấn để lọc.
Về cái chuyện lọc theo nhiều textbox có khi phải thay đổi chút ít cho dễ dùng. Cụ thể là tại thời điểm nhập, textbox nào đang được nhập thì sẽ lọc theo teextbox đó. Chỉ khi click nút tìm kiếm mới lọc theo nhiều textbox. Muốn tăng tính cơ động hơn thì thêm checkboc để chuyển đổi giữa hai chế độ .
 
Upvote 0
Mã:
Private Sub Nutsua_Click()
Dim i As Long, currRow As Long, LastRow As Long, Arr(1 To 7)
LastRow = Worksheets("Khachhang").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
i = ListBox1.ListIndex
Arr(1) = Stt
Arr(2) = Me.cobtenKH.Value
'arr(3) = Me.gioitinh.Value
Arr(4) = Me.cobPhone.Value
Arr(5) = Me.txtADD.Text
Arr(6) = Me.cobNhom.Value
Arr(7) = Me.txtNote.Text
Sheet7.Range("A3").Offset(Stt).Resize(1, 7).Value = Arr
RefreshListbox
End Sub
Ở bài 14, mình cũng chưa hiểu lắm code chỉnh sửa này, kính nhờ GPE giải thích giúp đỡ. (mình có xem một số code trên diễn đàn nhưng thực sự khong hiểu lắm về chỉnh sửa dữ liệu)
Code trên thì stt chính là mấu chốt. Anh lần xem stt bị thay đổi khi nào thì sẽ hiểu. Cũng nói luôn là chỉ áp dụng khi cột Stt là duy nhất và liên tục, được cái là nó đơn giản.
 
Upvote 0
Web KT

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

Back
Top Bottom