Giúp đỡ về cập nhật dữ liệu từ listbox vào sheet

  • Thread starter Thread starter quyhbb
  • Ngày gửi Ngày gửi
Liên hệ QC

quyhbb

Thành viên mới
Tham gia
24/11/11
Bài viết
13
Được thích
4
Xin mọi người giúp đỡ với ạ, hiện tại mình chưa làm được code cho nút Cập nhật.

Tại Form fmTKvaCNDL, Tìm kiếm => sau khi tìm ra kết quả => Bấm chọn từ listbox => Bấm vào nút Cập nhật sẽ update giá trị từ textbox (có thể update 1 hoặc nhiều trường) vào Sheet1.
Mình không biết cách tìm chính xác giá trị đang được chọn trong listbox tương ứng với dòng nào trong Sheet1.

Vui lòng xem file đính kèm.
Form: fmTKvaCNDL
Module: Module4

Xin cảm ơn nhiều ạ!
 

File đính kèm

hic, ko bác nào giúp đc mình ạ?
 
hic, ko bác nào giúp đc mình ạ?
Hôm qua mới hỏi lúc 10:54, đến 22:39 lại hối thúc là sao ta?
Chưa có thành viên nào trả lời có nghĩa là bạn hỏi nhưng chưa ai hiểu hoặc chưa có thành viên nào rảnh để trả lời.
 
Hôm qua mới hỏi lúc 10:54, đến 22:39 lại hối thúc là sao ta?
Chưa có thành viên nào trả lời có nghĩa là bạn hỏi nhưng chưa ai hiểu hoặc chưa có thành viên nào rảnh để trả lời.

Cảm ơn bạn góp ý, chỉ vì mình hơi sốt ruột nên đã phiền mọi người rồi. Lần sau sẽ chú ý hơn.
 
Thử viết câu lệnh mở cái Form bạn nói mà bị báo lỗi; Chưa biết xoay sở làm sao!
 
Tôi đang đi xa không có sử dụng máy tính nên chưa giúp ích gì được, nên chỉ góp ý thôi.

OK bạn, lúc nào rảnh nhờ bạn xem giúp mình nhé.
Bài đã được tự động gộp:

Thử viết câu lệnh mở cái Form bạn nói mà bị báo lỗi; Chưa biết xoay sở làm sao!

Bạn có thể chụp lại lỗi đc ko ?
 
Lần chỉnh sửa cuối:
Mình nhằm chổ nào đó & giờ mở được rồi, xin lỗi bạn!
Theo như mình thì 4 macro ở Module4 nên gộp lại làm 1 (trỡ thành 1 macro nhận tham biến & thực thi theo tham biến đó)
Thêm nữa: Nên chuyển hết chúng (chưa gộp) hay nó (gộp lại rồi) về Form mà chúng phải phục vụ
Lúc đó khai báo 1 tham biến mảng dùng chung (trong toàn Form này) để làm nguồn cho listBox
Lúc đó bạn chỉ cần 1 TextBox (để nhập tiêu chí tìm kiếm) & 1 ComboBox để chọn trường (trong 4 trường trên bảng dữ liệu) cần tìm mà thôi
Kết quả tìm sẹ hiện trên ListBox để ta chọn & vẫn túc trực trên tham biến mảng để nếu bạn nhấn lưu thì nó lấy đúng dòng dữ liệu trên mảng để lưu xuống trang chứa dữ liệu (nếu bạn không thay đổi), hay lấy từ các TextBox đã thay đổi để lưu lên trang tính.
Mình xin góp thêm vài ý về cách viết Code của bạn:
Trong các macro không nên để dòng trống nhiều quá;
Các thục đầu dòng của cột phải tương ứng với nhau như ví dụ dau:
PHP:
Sub Ham_lua_chon_cot_tim_kiem()
Dim i As Characters
'Ham tra ve gia tri cot can tim kiem
If fmTKvaCNDL.OptionButton1.Value = True Then
    i = "D" 'TenKH
Else
    If fmTKvaCNDL.OptionButton2.Value = True Then
        i = "C" 'MaKH
    Else
         If fmTKvaCNDL.OptionButton3.Value = True Then
            i = "F" 'Dienthoai
        Else
            If fmTKvaCNDL.OptionButton4.Value = True Then
                  i = "G" 'Motaloi
            Else
                  If fmTKvaCNDL.OptionButton5.Value = True Then
                      i = "H" 'KTV
                  End If
            End If
       End If
   End If
End If
End Sub
Viết như bạn là trường phái hàn lâm học sỹ;Không thích ứng cho những người thường thường bậc trung. trình độ VBA

Tạm là vậy & rất vui nếu được tiếp tục trao đổi cùng bạn.
 
Lần chỉnh sửa cuối:
Mình nhằm chổ nào đó & giờ mở được rồi, xin lỗi bạn!
Theo như mình thì 4 macro ở Module4 nên gộp lại làm 1 (trỡ thành 1 macro nhận tham biến & thực thi theo tham biến đó)
Thêm nữa: Nên chuyển hết chúng (chưa gộp) hay nó (gộp lại rồi) về Form mà chúng phải phục vụ
Lúc đó khai báo 1 tham biến mảng dùng chung (trong toàn Form này) để làm nguồn cho listBox
Lúc đó bạn chỉ cần 1 TextBox (để nhập tiêu chí tìm kiếm) & 1 ComboBox để chọn trường (trong 4 trường trên bảng dữ liệu) cần tìm mà thôi
Kết quả tìm sẹ hiện trên ListBox để ta chọn & vẫn túc trực trên tham biến mảng để nếu bạn nhấn lưu thì nó lấy đúng dòng dữ liệu trên mảng để lưu xuống trang chứa dữ liệu (nếu bạn không thay đổi), hay lấy từ các TextBox đã thay đổi để lưu lên trang tính.
Mình xin góp thêm vài ý về cách viết Code của bạn:
Trong các macro không nên để dòng trống nhiều quá;
Các thục đầu dòng của cột phải tương ứng với nhau như ví dụ dau:
PHP:
Sub Ham_lua_chon_cot_tim_kiem()
Dim i As Characters
'Ham tra ve gia tri cot can tim kiem
If fmTKvaCNDL.OptionButton1.Value = True Then
    i = "D" 'TenKH
Else
    If fmTKvaCNDL.OptionButton2.Value = True Then
        i = "C" 'MaKH
    Else
         If fmTKvaCNDL.OptionButton3.Value = True Then
            i = "F" 'Dienthoai
        Else
            If fmTKvaCNDL.OptionButton4.Value = True Then
                  i = "G" 'Motaloi
            Else
                  If fmTKvaCNDL.OptionButton5.Value = True Then
                      i = "H" 'KTV
                  End If
            End If
       End If
   End If
End If
End Sub
Viết như bạn là trường phái hàn lâm học sỹ;Không thích ứng cho những người thường thường bậc trung. trình độ VBA

Tạm là vậy & rất vui nếu được tiếp tục trao đổi cùng bạn.

Rất cảm ơn bạn, mình hiểu ý bạn rồi. Nhưng cho mình hỏi chút là: mình muốn dùng cả tìm kiếm tương đối (Mô tả lỗi, Tên KH) và tìm kiếm tuyệt đối (mã KH, SĐT), như vậy thì có thể gộp chung trong 1 textbox và sử dụng chung 1 hàm tìm kiếm như bạn nói đc ko?
 
mình muốn dùng cả tìm kiếm tương đối (Mô tả lỗi, Tên KH) và tìm kiếm tuyệt đối (mã KH, SĐT),
như vậy thì có thể gộp chung trong 1 textbox và sử dụng chung 1 hàm tìm kiếm như bạn nói đc ko?
Nếu tìm kiếm tương đối thì gắn thêm 2 dấu sao như:

If CotTimKiem = Motaloi Or CotTimKiem = TenKH Then GiaTriTimKiem = "*" & GiaTriTimKiem & "*"

rồi dùng toán tử Like để so sánh
 
Lần chỉnh sửa cuối:
Một khi bạn muốn thiết kế lại, mình xin mạnh dạn gốp ý hết các vấn đề như sau:
(1) Gộp các trang tính 'KTV' & 'TRANG THAI' làm 1; Mình xin gợi ý tên trang gộp này là 'DMuc'
Ở trang này ta có thể thêm các danh sách khác nữa của quá trình hoạt động bạn cần đến nó như 'DSKH' (gồm có trường: Mã KH, Tên KH, 'SĐT', . . . .
Lúc đó danh sách KH này ta chỉ nắm mã KH là ra tất cả
Lúc đó Mã KH cần khoa học theo kiểu dưới đây:

216133

(1.1) Gộp 2 form dùng để nhập liệu cho 2 Table của trang gộp này làm 1; Chỉ có điều là tạo thành 2 Pages, 1 Page để nhập cho Table 'KTV & Page còn lại cho Table còn lại
(2) Cũng là gộp, ta nên gộp 2 Form Nhập liệu & Form tìm kiếm này làm 1 & cũng tương tự, ta lập 2 Pages cho Form này

(?) Mình chưa rõ UrserForm1 của bạn dùng làm gì?
 
Lần chỉnh sửa cuối:
Một khi bạn muốn thiết kế lại, mình xin mạnh dạn gốp ý hết các vấn đề như sau:
(1) Gộp các trang tính 'KTV' & 'TRANG THAI' làm 1; Mình xin gợi ý tên trang gộp này là 'DMuc'
Ở trang này ta có thể thêm các danh sách khác nữa của quá trình hoạt động bạn cần đến nó như 'DSKH' (gồm có trường: Mã KH, Tên KH, 'SĐT', . . . .
Lúc đó danh sách KH này ta chỉ nắm mã KH là ra tất cả
Lúc đó Mã KH cần khoa học theo kiểu dưới đây:

View attachment 216133

(1.1) Gộp 2 form dùng để nhập liệu cho 2 Table của trang gộp này làm 1; Chỉ có điều là tạo thành 2 Pages, 1 Page để nhập cho Table 'KTV & Page còn lại cho Table còn lại
(2) Cũng là gộp, ta nên gộp 2 Form Nhập liệu & Form tìm kiếm này làm 1 & cũng tương tự, ta lập 2 Pages cho Form này

(?) Mình chưa rõ UrserForm1 của bạn dùng làm gì?

Góp ý của bạn mình thấy rất chuẩn.
Có điều về Mã KH có vấn đề phát sinh khi khách hàng trùng tên (VD: Phạm Anh Thư -> PAT; Phạm Anh Tuấn -> PAT; Phùng An Tâm -> PAT). Như thế cần thêm công đoạn kiểm tra trùng lặp và tăng số thứ tự (cái này kiến thức mình còn eo hẹp quá :( ) - Tuy nhiên đây là cách tạo ID hay, mình sẽ suy nghĩ thêm về cách làm này.

UserForm 1 là bản nháp, mình chưa kịp xóa, bạn đừng để ý.

PS: Phần gộp hàm tìm kiếm mình đã làm được theo cách của bạn, đúng là gọn và thoáng hơn nhiều. Mình đang loay hoay dòng lệnh select item trong listbox để lấy giá trị dòng tương ứng trong sheet1 mà chưa được. Bạn chỉ giúp mình với.

Cảm ơn bạn.
 

File đính kèm

  • error.jpg
    error.jpg
    223 KB · Đọc: 7
Lần chỉnh sửa cuối:
Đem Macro này về Form của nó
PHP:
Dim y, flag As Long
Dim iArray(20, 11)      '<=|      Khai Báo Tham Biến Dùng Chung  Trong Form '
Dim IDlb  As InTeger   ' Tham Biến Lưu Trữ Dòng Đã Chọn Trên ListBox  '
'Ham tim kiem theo Ky thuat vien:
Sub TKtheoKTV()
Dim txtTKTenKH, txtTKMaKH, txtTKDienthoai, txtTKMotaloi As TextBox
Dim cbTKKTV As ComboBox, lbKQTK As ListBox
Dim lastRow, y As Long, Q, flag As Long

fmTKvaCNDL.lbKQTK.Clear
'Dong cuoi cung cua du lieu:            '
lastRow = Sheet1.Range("A100000").End(xlUp).Row
'flag = 0
For y = 4 To lastRow
    If Sheet1.Range("H" & y).Value = fmTKvaCNDL.cbTKKTV.Value Then
        flag = 1
        iArray(Q, 0) = Sheet1.Range("A" & y)
        iArray(Q, 1) = Sheet1.Range("B" & y).Value:        iArray(Q, 2) = Sheet1.Range("C" & y).Value
        iArray(Q, 3) = Sheet1.Range("D" & y).Value:        iArray(Q, 4) = Sheet1.Range("E" & y).Value
        iArray(Q, 5) = Sheet1.Range("F" & y).Value:        iArray(Q, 6) = Sheet1.Range("G" & y).Value
        iArray(Q, 7) = Sheet1.Range("H" & y).Value:        iArray(Q, 8) = Sheet1.Range("I" & y).Value
        iArray(Q, 9) = Sheet1.Range("J" & y).Value
        iArray(Q, 10) = Sheet1.Range("K" & y).Value:       Q = Q + 1
    End If
Next y
fmTKvaCNDL.lbKQTK.List() = iArray
End Sub
Trong Form đó, bạn thêm các dòng lệnh này:
PHP:
Option Explicit
Dim flag As Long
Dim IDlb As Integer   ' +/-  Đã Thêm Bên Trên '
Private Sub lbKQTK_Click()
'Dien du lieu tu listbox sang textbox
IDlb = 1 + Me!lbKQTK.ListIndex   ' + '
MsgBox IDlb       ' + '
    On Error Resume Next
    txtNgaynhap.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 0)
    txtMaphieu.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 1)
    txtMaKH.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 2)
    txtTenKH.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 3)
    txtDiachi.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 4)
    txtDienthoai.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 5)
    txtMotaloi.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 6)
    cbKTV.Value = Me.lbKQTK.List(lbKQTK.ListIndex, 7)
    cbTrangthai.Value = Me.lbKQTK.List(lbKQTK.ListIndex, 8)
    txtTongtien.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 9)
    txtGhichu.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 10)
End Sub
 
Mình đang loay hoay dòng lệnh select item trong listbox để lấy giá trị dòng tương ứng trong sheet1 mà chưa được.
Code
Mã:
Private Sub lbKQTK_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    If fmTKCNDL.lbKQTK.List(lbKQTK.ListIndex).Select = True Then
        MsgBox "..."
    End If
End Sub
có lỗi (trong hình đính kèm) là đương nhiên.

fmTKCNDL.lbKQTK.List(lbKQTK.ListIndex) sẽ trả về 1 giá trị - giá trị ở cột đầu tiên và ở dòng có chỉ số là lbKQTK.ListIndex. Nó không phải là đối tượng (Object) nên nó không thể có phương thức nào, càng không thể có phương thức Select.

Khi đúp chuột vào mục nào đó trong ListBox thì dĩ nhiên mục đó được chọn (Selected), không cần kiểm tra. Cái cần quan tâm là chỉ số của dòng đấy là bao nhiêu. Thì nó bằng lbKQTK.ListIndex thôi. Vd.
Mã:
Private Sub lbKQTK_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim chi_so_cua_dong_duoc_chon_bang As Long
    chi_so_cua_dong_duoc_chon_bang = lbKQTK.ListIndex
'    hien thi de thoa chi to mo
    MsgBox "chi_so_cua_dong_duoc_chon_bang = " & chi_so_cua_dong_duoc_chon_bang
'    lam gi do voi chi_so_cua_dong_duoc_chon_bang. Cha nhe doc ra chi de tieu ton dien nuoc?
'    ...
End Sub
 
Đem Macro này về Form của nó
PHP:
Dim y, flag As Long
Dim iArray(20, 11)      '<=|      Khai Báo Tham Biến Dùng Chung  Trong Form '
Dim IDlb  As InTeger   ' Tham Biến Lưu Trữ Dòng Đã Chọn Trên ListBox  '
'Ham tim kiem theo Ky thuat vien:
Sub TKtheoKTV()
Dim txtTKTenKH, txtTKMaKH, txtTKDienthoai, txtTKMotaloi As TextBox
Dim cbTKKTV As ComboBox, lbKQTK As ListBox
Dim lastRow, y As Long, Q, flag As Long

fmTKvaCNDL.lbKQTK.Clear
'Dong cuoi cung cua du lieu:            '
lastRow = Sheet1.Range("A100000").End(xlUp).Row
'flag = 0
For y = 4 To lastRow
    If Sheet1.Range("H" & y).Value = fmTKvaCNDL.cbTKKTV.Value Then
        flag = 1
        iArray(Q, 0) = Sheet1.Range("A" & y)
        iArray(Q, 1) = Sheet1.Range("B" & y).Value:        iArray(Q, 2) = Sheet1.Range("C" & y).Value
        iArray(Q, 3) = Sheet1.Range("D" & y).Value:        iArray(Q, 4) = Sheet1.Range("E" & y).Value
        iArray(Q, 5) = Sheet1.Range("F" & y).Value:        iArray(Q, 6) = Sheet1.Range("G" & y).Value
        iArray(Q, 7) = Sheet1.Range("H" & y).Value:        iArray(Q, 8) = Sheet1.Range("I" & y).Value
        iArray(Q, 9) = Sheet1.Range("J" & y).Value
        iArray(Q, 10) = Sheet1.Range("K" & y).Value:       Q = Q + 1
    End If
Next y
fmTKvaCNDL.lbKQTK.List() = iArray
End Sub
Trong Form đó, bạn thêm các dòng lệnh này:
PHP:
Option Explicit
Dim flag As Long
Dim IDlb As Integer   ' +/-  Đã Thêm Bên Trên '
Private Sub lbKQTK_Click()
'Dien du lieu tu listbox sang textbox
IDlb = 1 + Me!lbKQTK.ListIndex   ' + '
MsgBox IDlb       ' + '
    On Error Resume Next
    txtNgaynhap.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 0)
    txtMaphieu.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 1)
    txtMaKH.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 2)
    txtTenKH.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 3)
    txtDiachi.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 4)
    txtDienthoai.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 5)
    txtMotaloi.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 6)
    cbKTV.Value = Me.lbKQTK.List(lbKQTK.ListIndex, 7)
    cbTrangthai.Value = Me.lbKQTK.List(lbKQTK.ListIndex, 8)
    txtTongtien.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 9)
    txtGhichu.Text = Me.lbKQTK.List(lbKQTK.ListIndex, 10)
End Sub
Mình đã thử, kết quả là tìm ra index trong listbox. Nhưng có lẽ bạn đã hiểu lầm ý mình. Giá trị mình muốn tìm ra là "y - chỉ số dòng" trong sheet1 khi kết quả được tìm thấy trên listbox (VD: KQ cần tìm là Lê Thị Ngọc có index trong listbox là 1, tương ứng với dòng thứ y=8 trong sheet1), để tạo điều kiện cho bước cập nhật đúng dòng mong muốn.
Dù sao cũng cảm ơn bạn rất nhiều.

Mình nghĩ là phải lưu thành mảng các giá trị y tìm được khi thỏa mãn điều kiện if trong hàm TKtheoKTV(), đúng ko bạn?
Bài đã được tự động gộp:

Code
Mã:
Private Sub lbKQTK_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    If fmTKCNDL.lbKQTK.List(lbKQTK.ListIndex).Select = True Then
        MsgBox "..."
    End If
End Sub
có lỗi (trong hình đính kèm) là đương nhiên.

fmTKCNDL.lbKQTK.List(lbKQTK.ListIndex) sẽ trả về 1 giá trị - giá trị ở cột đầu tiên và ở dòng có chỉ số là lbKQTK.ListIndex. Nó không phải là đối tượng (Object) nên nó không thể có phương thức nào, càng không thể có phương thức Select.

Khi đúp chuột vào mục nào đó trong ListBox thì dĩ nhiên mục đó được chọn (Selected), không cần kiểm tra. Cái cần quan tâm là chỉ số của dòng đấy là bao nhiêu. Thì nó bằng lbKQTK.ListIndex thôi. Vd.
Mã:
Private Sub lbKQTK_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim chi_so_cua_dong_duoc_chon_bang As Long
    chi_so_cua_dong_duoc_chon_bang = lbKQTK.ListIndex
'    hien thi de thoa chi to mo
    MsgBox "chi_so_cua_dong_duoc_chon_bang = " & chi_so_cua_dong_duoc_chon_bang
'    lam gi do voi chi_so_cua_dong_duoc_chon_bang. Cha nhe doc ra chi de tieu ton dien nuoc?
'    ...
End Sub
Cảm ơn bạn.
 
Mình nghĩ là phải lưu thành mảng các giá trị y tìm được khi thỏa mãn điều kiện if trong hàm TKtheoKTV(), đúng ko bạn?
Trong trang 'NHAP DU LIEU" có trường 'Mã phiếu' đang là duy nhất cho mỗi dòng;
Nếu đúng vậy thì lưu mã này khi tìm ra dòng thỏa điều kiện tìm kiếm
Tất nhiên mã phiếu này là không thể sửa từ đầu cho tới cuối sự tồn tại của dòng đó.
Mã này nên lấy trên ListBox & lưu vô 1 tham biến public.
Sau khi sửa dữ liệu thì cứ mã phiếu này mã tìm đến dòng dữ liệu để lưu đè lên.
 
Trong trang 'NHAP DU LIEU" có trường 'Mã phiếu' đang là duy nhất cho mỗi dòng;
Nếu đúng vậy thì lưu mã này khi tìm ra dòng thỏa điều kiện tìm kiếm
Tất nhiên mã phiếu này là không thể sửa từ đầu cho tới cuối sự tồn tại của dòng đó.
Mã này nên lấy trên ListBox & lưu vô 1 tham biến public.
Sau khi sửa dữ liệu thì cứ mã phiếu này mã tìm đến dòng dữ liệu để lưu đè lên.
Mình sẽ thử từng cách xem sao.
Chúc bạn nghỉ lễ vui vẻ.
 
Nếu là mình thì 4 cái Form của bạn mình sẽ gộp thành 1 Form mà thôi, nhưng có 3 Pages
Page1 sẽ là nhập mới dữ liệu
Page2 là tìm kiếm & chỉnh sửa dữ liệu
Page3 là kết hợp 2 form cuối còn lại của bạn; Tất nhiên lúc này là đã gộp 2 trang tính vô thành trang 'DMuc'
Trong Trang 'DMuc' này có thêm Table về danh sách khách hàng.
3 Table này cách xa nhau chí ít là vài cột trống đều nhau càng tốt
Mong là những ngày nghỉ bạn sẽ bận rộn với những toan tính vừa nêu của mình.
 
Web KT

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

Back
Top Bottom