Làm tươi listbox khi insert bản ghi như thế nào? (1 người xem)

Liên hệ QC

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

manhhung12

Thành viên thường trực
Tham gia
20/3/08
Bài viết
232
Được thích
88
Tôi có 1 file trong đó là các form nhập liệu: có mấy vấn đề cần giải quyết, các bạn giúp đỡ:
1/ Khi insert 1 dòng nhưng trên lisbox kg hiển thị mà phải thoát ra vào lại mới có dòng đó trên lisbox. Để làm tươi DL trên lisbox thì như thế nào?
2/Trước khi insert thì việc kiểm tra đã có/chưa mã (maten) đẻ quyết định?
3/Khi khởi động file thì trên màn hình (toàn màn hình) chỉ có các nút bấm và lẽ dĩ nhiên phải có nút Exit (đóng file->thoát khỏi Excel) chứ không phải là 1 bảng (trên đó có các nút bấm) như trong file tôi làm gửi kèm theo.
Mong các bạn giúp đỡ.
 

File đính kèm

Mình cũng đang quan tâm tới vấn đề này, có ai giải quyết được ko?
 
Upvote 0
Thì bạn cứ cập nhật xong nạp lại cái listbox là được.
 
Upvote 0
Thêm câu lệch ListBox1.RowSource = "sheet2!lvbds" vào cuối thủ tục CommandButton2_Click()
PHP:
Private Sub CommandButton2_Click()
    FLAG = "THEM"
    Me.TextBox1.Enabled = True
    Me.TextBox2.Enabled = True
    Me.TextBox3.Enabled = True
    Me.TextBox4.Enabled = True
    Me.TextBox5.Enabled = True
    Me.CommandButton1.Enabled = True
    Me.TextBox1.Value = ""
    Me.TextBox2.Value = ""
    Me.TextBox3.Value = ""
    Me.TextBox4.Value = ""
    Me.TextBox5.Value = ""
    Me.TextBox1.SetFocus
    ListBox1.RowSource = "sheet2!lvbds"
End Sub
Trong trường hợp không dùng RowSource thì dùng thủ tục Additem.
 
Upvote 0
Thêm câu lệch ListBox1.RowSource = "sheet2!lvbds" vào cuối thủ tục CommandButton2_Click()
PHP:
Private Sub CommandButton2_Click()
    FLAG = "THEM"
    Me.TextBox1.Enabled = True
    Me.TextBox2.Enabled = True
    Me.TextBox3.Enabled = True
    Me.TextBox4.Enabled = True
    Me.TextBox5.Enabled = True
    Me.CommandButton1.Enabled = True
    Me.TextBox1.Value = ""
    Me.TextBox2.Value = ""
    Me.TextBox3.Value = ""
    Me.TextBox4.Value = ""
    Me.TextBox5.Value = ""
    Me.TextBox1.SetFocus
    ListBox1.RowSource = "sheet2!lvbds"
End Sub
Trong trường hợp không dùng RowSource thì dùng thủ tục Additem.

Tôi chưa nói đến thủ tục của bạn đúng hay không, nhưng nếu có thể thì mình rút gọn cho đỡ rối mắt mà có tính chuyên nghiệp:

PHP:
Private Sub CommandButton2_Click()
    FLAG = "THEM"
    ListBox1.RowSource = "sheet2!lvbds"
    Me.CommandButton1.Enabled = True
      
    For i = 1 To 5
        With Me("TextBox" & i)
            .Enabled = True
            .Value = ""
        End With
    Next
    Me.TextBox1.SetFocus
End Sub
 
Upvote 0
Tôi có 1 file trong đó là các form nhập liệu: có mấy vấn đề cần giải quyết, các bạn giúp đỡ:
1/ Khi insert 1 dòng nhưng trên lisbox kg hiển thị mà phải thoát ra vào lại mới có dòng đó trên lisbox. Để làm tươi DL trên lisbox thì như thế nào?
2/Trước khi insert thì việc kiểm tra đã có/chưa mã (maten) đẻ quyết định?
3/Khi khởi động file thì trên màn hình (toàn màn hình) chỉ có các nút bấm và lẽ dĩ nhiên phải có nút Exit (đóng file->thoát khỏi Excel) chứ không phải là 1 bảng (trên đó có các nút bấm) như trong file tôi làm gửi kèm theo.

Mong các bạn giúp đỡ.

File của bạn thật ra chẳng có gì gọi là phức tạp, nhưng cái khó cho bạn nhất chính là cái mục màu đỏ.

Mục 3 tôi không biết ý của bạn là gì.

Bây giờ, tôi tặng bạn những thủ tục quan trọng và trình bày lại form cho hợp lý đây.

Như tôi đã nói, mục 2 (màu đỏ), nhìn vào bảng DANH SÁCH A1 ở sheet2, mã tên được tạo ra bởi viết tắt họ tên và thêm số thứ tự để tránh tên trùng, vì vậy tôi đã viết một hàm tạo ID cho bạn như sau:

Mã:
'Ham tao ID moi theo ten:
Function IDMaxPlus(ByVal SrcRng, ByVal UniOrVniText, _
          Optional ByVal SourceCode As FontCodeType, _
          Optional ByVal Separate As String) As String
    'SourceCode: 1 is Unicode; 2 is VNI Windows
    Dim i As Long, j As Long, TmpMax As Long, tmp As Long
    Dim KeyText As String, LenKeyText As Long, Arr
    On Error Resume Next
    Arr = SrcRng
    KeyText = InitialName(UniOrVniText, SourceCode, Separate)
    LenKeyText = Len(KeyText): TmpMax = 0
    If Not IsArray(Arr) Then
        If Left(UCase(Arr), LenKeyText) = KeyText Then
            TmpMax = Right(Arr, Len(Arr) - LenKeyText)
        End If
    Else
        For i = 1 To UBound(Arr, 1)
            For j = 1 To UBound(Arr, 2)
                If Left(UCase(Arr(i, j)), LenKeyText) = KeyText Then
                    tmp = Right(Arr(i, j), Len(Arr(i, j)) - LenKeyText)
                    If TmpMax < tmp Then TmpMax = tmp
                End If
            Next
        Next
    End If
    IDMaxPlus = KeyText & Format(TmpMax + 1, "00")
End Function

Với hàm trên thì một ID mới sẽ không làm bạn phải nhọc công gõ vào lại kiểm tra coi có trùng không thì một điều quá phức tạp!

attachment.php



Thông qua hàm đó, thủ tục kiểm tra sẽ được diễn ra như sau:

Mã:
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    If Ham.Trim(TextBox2) = "" Then Exit Sub
    TextBox2 = UCase(Ham.Trim(TextBox2))
    If isEdit Then
        If TextBox2 <> EditHoTen Then
            Dim IdMsg As Long
            IdMsg = MsgBox("HO VA TEN da thay doi, " & String(2, vbLf) & _
                           "Ban co muon tao MA TEN moi khong?", _
                           vbQuestion + vbYesNo, "THÔNG BÁO")
            If IdMsg = vbYes Then
                GoTo ChangeID
            End If
        End If
    Else
ChangeID:
        Dim idArr As Variant
        idArr = Range(Sheet2.[B7], Sheet2.[B65536].End(xlUp)).Value
        TextBox1 = IDMaxPlus(idArr, TextBox2, UNI)
    End If
End Sub

Với thủ tục trên, sau khi gõ HỌ TÊN vào TextBox, trước khi rời khỏi nó, thì TextBox MÃ TÊN sẽ tự động nhập mã mới, bảo đảm không bao giờ trùng mã, nếu tên có trùng thì nó sẽ cộng thêm 1 vào cái đuôi.

Cũng với thủ tục này, khi chỉnh sửa, dĩ nhiên nó không cập nhật mã mới, tuy nhiên, khi chỉnh sửa lại HỌ TÊN (khi chọn chức năng chỉnh sửa, bạn có thể sửa bất cứ thứ gì bạn muốn, kể cả họ tên, chấp luôn việc cập nhật mã tên mới), nếu họ tên khác với họ tên ban đầu thì nó sẽ hỏi ngay bạn có muốn tạo mã tên mới hay không!

Thủ tục nhập liệu cũng khá đơn giản:

Mã:
Private Sub CmdSaveNew_Click()
    If isEdit Or ThuTuc = False Then Exit Sub
    
    With Sheet2.Range("B65536").End(xlUp).Offset(1, -1)
        .Value = .Offset(-1) + 1
        For i = 1 To 5
            .Offset(, i).Value = Me("TextBox" & i).Value
        Next
    End With
    
    With ListBox1
        .RowSource = "lvbds"
        .ListIndex = .ListCount - 1
    End With
        
    Call CmdClear_Click
End Sub

Và thủ tục nào là dùng để chỉnh sửa?

Bạn double click vào LISTBOX tại mục bạn cần CHỈNH SỬA hoặc XÓA, nó sẽ hỏi ngay rằng bạn cần phải làm gì và hướng dẫn bạn làm gì theo ý của bạn.

Mã:
'***********************************************************************
'LISTBOX:
'***********************************************************************
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim EditMsg As Long, EditItem As String
    isEdit = False
    
    EditMsg = MsgBox("Ban muon lam gi voi muc ban dang chon?" & String(2, vbLf) & _
                     "+ De SUA, bam YES" & String(2, vbLf) & _
                     "+ De XOA, bam NO" & String(2, vbLf) & _
                     "+ De huy chon, bam CANCEL", vbQuestion + vbYesNoCancel, "HIEU CHINH")
    
    With Me.ListBox1
        EditItem = .List(.ListIndex, 1)
        If EditMsg = vbYes Then
        
                EditHoTen = .List(.ListIndex, 2)
                Set EditRng = Range(Sheet2.[B7], Sheet2.[B65536].End(xlUp)).Find(EditItem, , LookIn:=xlValues, LookAt:=xlWhole)
                
                If Not EditRng Is Nothing Then
                    isEdit = True
                    For i = 1 To 5
                        Me("TextBox" & i).Value = .List(.ListIndex, i)
                    Next
                    CmdSaveEdit.Enabled = True
                    CmdSaveNew.Enabled = False
                Else
                    GoTo ExitSub
                End If
                
        ElseIf EditMsg = vbNo Then
            Dim DeleteMsg As Long
            DeleteMsg = MsgBox("Ban co thuc su muon xoa muc nay khong?", vbQuestion + vbYesNo, "THÔNG BÁO")
            
            If DeleteMsg = vbNo Then GoTo ExitSub
            
            Set EditRng = Range(Sheet2.[B7], Sheet2.[B65536].End(xlUp)).Find(EditItem, , LookIn:=xlValues, LookAt:=xlWhole)
            EditRng.Offset(, -1).Resize(, 6).Delete 2
            Call SeriesFill
            ListBox1.RowSource = "lvbds"
            GoTo ExitSub
        Else
            GoTo ExitSub
        End If
    End With
    
    Exit Sub
    
ExitSub:
    Call CmdClear_Click
End Sub

Và sau khi chỉnh sửa để nhập lại bạn chỉ việc xác định lại có nhập hay không thôi!

Mã:
Private Sub CmdSaveEdit_Click()
    If isEdit = False Or ThuTuc = False Then Exit Sub
    Dim EditMsg As Long
    EditMsg = MsgBox("Vui long xac dinh lai muc chinh sua!" & String(2, vbLf) & _
                     "+ De NHAP CHINH SUA, bam YES" & String(2, vbLf) & _
                     "+ De KIEM TRA LAI, bam NO" & String(2, vbLf) & _
                     "+ De KHONG NHAP & HUY BO, bam CANCEL", vbInformation + vbYesNoCancel, "XAC DINH")
    
    If EditMsg = vbYes Then
        For i = 1 To 5
            EditRng.Offset(, i - 1).Value = Me("TextBox" & i).Value
        Next
        ListBox1.RowSource = "lvbds"
        GoTo ExitSub
    ElseIf EditMsg = vbCancel Then
        GoTo ExitSub
    End If
    
    Exit Sub
ExitSub:
    Call CmdClear_Click
End Sub

Hy vọng bạn sẽ hài lòng với Form mới này!
 

File đính kèm

Upvote 0
Tôi có 1 file trong đó là các form nhập liệu: có mấy vấn đề cần giải quyết, các bạn giúp đỡ:
1/ Khi insert 1 dòng nhưng trên lisbox kg hiển thị mà phải thoát ra vào lại mới có dòng đó trên lisbox. Để làm tươi DL trên lisbox thì như thế nào?
2/Trước khi insert thì việc kiểm tra đã có/chưa mã (maten) đẻ quyết định?
3/Khi khởi động file thì trên màn hình (toàn màn hình) chỉ có các nút bấm và lẽ dĩ nhiên phải có nút Exit (đóng file->thoát khỏi Excel) chứ không phải là 1 bảng (trên đó có các nút bấm) như trong file tôi làm gửi kèm theo.
Mong các bạn giúp đỡ.

Theo mình bạn nên tạo chương trình con, một Sub (Sub 1- chẳng hạn) có nhiệm vụ tạo một mảng chứa toàn bộ dữ liệu của bạn sử dụng, đồng thời tạo Dictionary với Key là maten
Vấn đề 1: Khi đã insert thêm một dòng trong Listbox(LB) thì bạn gọi Sub tạo mảng ra để nó tự cập nhật sau đó cho hiển thị mảng này trên LB thôi
Vấn đề 2: Do Sub 1 có khởi tạo Dictionary nên bạn kiểm tra maten rất nhanh, nếu Key chưa tồn tại thì thêm mã, sau đó chạy lại Sub 1 để nạp thêm dữ liệu mới thôi
 
Upvote 0

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

Back
Top Bottom