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 đỡ.
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
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.
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!
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
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 đỡ.