Kiểm tra số CT trùng

Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Nhờ các bạn làm hộ 1 sub Kiểm tra số CT trùng, theo file đính kèm
Sh BK là tổng hợp các CT
tại Sh CT, khi muốn save (do sub...) thì phải KT số CT đó đã có chưa?
Xin cám ơn!
 
Lần chỉnh sửa cuối:
Dear ThuNghi,
--------------
Có 2 thủ tục để bạn làm điều này:
1. Ở mức đơn giản: tạo ra hàm thông điệp (MessageBox) để thông báo cho người dùng biết theo đúng ngữ cảnh mà bạn đưa vào:
Mã:
Public Function MessageBox(Optional ByVal strPrompt As String, _
        Optional ByVal vbButtons As VbMsgBoxStyle = vbMsgBoxHelpButton, _
        Optional ByVal strTitle As String, _
        Optional ByVal strHelpFile As String, _
        Optional ByVal varContext, _
        Optional ByVal lngKey As Long, _
        Optional ByVal blnMessageBox As Boolean = True, _
        Optional ByVal varReturnValue As Variant)
 
If blnMessageBox = False Then Exit Function
lngKey = Err.Number
If lngKey = 0 Then lngKey = CLng(vbButtons)
If strHelpFile = "" Then strHelpFile = ThisWorkbook.Path & "\Help.chm"
If IsMissing(varContext) Then varContext = 0
If Err.Number <> 0 Then
    If strTitle = "" Then strTitle = "Loi he thong: " & Err.Number
    strPrompt = "Khong thuc hien duoc vi:" & vbNewLine & _
    "Lçi " & Err.Number & " - " & Err.Description
    If vbButtons = vbMsgBoxHelpButton Then
        vbButtons = vbCritical + vbMsgBoxHelpButton
    Else
        vbButtons = vbButtons + vbMsgBoxHelpButton
    End If
Else
    If strTitle = "" Then strTitle = "Thong bao!"
End If
Select Case vbButtons
    Case vbMsgBoxHelpButton
        vbButtons = vbInformation
    Case vbYesNo, vbYesNoCancel, vbRetryCancel, vbAbortRetryIgnore
        vbButtons = vbButtons + vbQuestion
    Case vbOK
        vbButtons = vbButtons + vbInformation
End Select
vbButtons = vbButtons + vbMsgBoxHelpButton
If IsMissing(varReturnValue) Then
    MessageBox = MsgBox(strPrompt, vbButtons, strTitle, strHelpFile, varContext)
Else
    MsgBox strPrompt, vbButtons, strTitle, strHelpFile, varContext
    MessageBox = varReturnValue
End If
End Function

Thủ tục chỉ đưa ra cảnh báo người sử dụng, còn việc xử lý tiếp theo tuỳ thuộc vào bạn!

2. Xây dựng thủ tục biến cố Click của CommandButton Save như sau:
Mã:
Private Sub cmbSave_Click()
Dim rgSoCT As Range [COLOR=darkgreen]' Cột chứng từ trong bảng kê[/COLOR]
Dim varSoCT As Variant  [COLOR=darkgreen]' Số chứng từ cần kiểm tra (chưa biết kiểu dữ liệu)[/COLOR]
Dim blnExisted As Boolean [COLOR=darkgreen]' Chứng từ đã tồn tại[/COLOR]
Set rgSoCT = Sheets("BK").Range("sp")
varSoCT = Sheets("CT").Range("SoCT")
With WorksheetFunction
On Error GoTo SAVENOW:
blnExisted = Not .IsNA(.VLookup(varSoCT, rgSoCT, 1, 0))
If blnExisted Then
    If MsgBox("Chung tu so " & varSoCT & " da ton tai. Ban van muon luu chung tu nay?", _
    vbYesNo + vbQuestion + vbDefaultButton2, "Tim chung tu dang nhap") = vbNo Then Exit Sub
End If
SAVENOW:
[COLOR=darkgreen]'Tìm chứng từ đã có trong bảng kê chi tiết:[/COLOR]
Dim rgFounded As Range
Set rgFounded = rgSoCT.Find(varSoCT)
[COLOR=darkgreen]'Các xử lý lưu dữ liệu của bạn với rgFounded tìm được, ví dụ:[/COLOR]
MsgBox rgFounded.Address
[COLOR=darkgreen][COLOR=darkgreen]'...[/COLOR]
[/COLOR][COLOR=darkgreen]' Sau khi lưu xong, thông báo cho người dùng biết đã lưu thành công:[/COLOR]
MsgBox "Da luu chung tu so " & varSoCT & "!", vbInformation, "Luu chung tu"
End With
End Sub
Xem file đính kèm:
 

File đính kèm

  • MessageBox.zip
    15.4 KB · Đọc: 190
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn anh Cường nhiều lắm và nhờ anh chỉ hộ thêm
Phần xử lý:
Nếu phát hiện trùng, nếu OK thì xóa những record có soCT trùng, và sau đó sẽ lưu những record có soct trùng vào thay thế (phần xóa và lưu tôi làm được). Nhưng tôi đang phân vân nếu lưu vào thì nó sẽ tìm thấy trùng nữa.

Anh giúp tôi một sơ đồ if hay case gì đó, phần select case tôi chưa hiểu nhiều
Xin chào
 
Upvote 0
Dear ThuNghi,
-------------
Vì bạn không cung cấp bản ghi cần cập nhật đầy đủ nên mình không đưa ra xử lý cụ thể được.
Theo mình vấn đề không phải là lập trình, quan trọng là tổ chức bảng dữ liệu của bạn cũng như phương pháp cập nhật.Quan điểm của mình là nên cho người dùng cập nhật trực tiếp trên bảng cơ sở dữ liệu mà không cần bất cứ một màn hình trung gian nào. Làm như thế tiết kiệm được thời gian - nhất là khi bạn mới bắt đầu tiếp cận đến lập trình. Bạn vẫn có thể kiểm tra sự trùng lặp vừa có thể lưu chứng từ mới mà không cần phải xây dựng chương trình.
Tất nhiên, qua ví dụ này để bạn tiếp cận với VBA thì rất đáng làm. Tuy nhiên bạn cần lưu ý khi thiết kế bảng kê chứng từ: Theo như cơ sở dữ liệu của bạn thì một chứng từ trên bảng kê có thể xuất hiện trên nhiều bản ghi. Chương trình sẽ luôn đưa ra thông báo cho bạn khi bổ xung bản ghi tiếp theo cho chứng từ đó. Điều này sẽ gây phiền toái cho người sử dụng khi họ muốn cập nhật một chứng từ có nhiều bản ghi như vậy. Kiểm tra một điều luôn luôn đúng thì thật là quan liêu!
Bỏ qua bất hợp lý đó, bạn mở workbook của bạn ra và Record một macro những thao tác như là bạn sẽ mô tả với cho mình khi tìm thấy SoCT đã tồn tại:
- Đầu tiên, ghi lại hành động lọc tất các chứng từ tìm thấy rồi xóa đi.
- Tiếp theo, copy bản ghi đang cập nhật vào bảng kê.
Tất cả chỉ có vậy, hi vọng với sự hỗ trợ của macro bạn sẽ xây dựng đoạn thủ tục này. Tự mình làm thì mới mau tiến bộ!
Chúc bạn thành công!
 
Upvote 0
mình đã làm công thức mãng rồi bạn ơi nó nhanh lắm nhưng nó chỉ biết trùng, mà không biết là bao nhiêu chổ trùng. mình có gần 4000 học sinh lận
 
Upvote 0
Vậy mình mới "xui" bạn dùng Conditional Formatting. Nhìn là thấy, thấy là đúng. Bạn có thể up file lên để mình cụ thể hơn. Hoặc tìm kiếm trong diễn đàn các bài về Conditional Formatting.
Chúc thành công
 
Upvote 0
Bạn dùng Advanfilter để lọc ra DM và dùng countif để đếm và match để tìm ra chỗ trùng, nhớ đánh dấu Unique Records
 
Upvote 0
Quả thực câu hỏi của kietmdc chưa được rõ lắm, kiểm tra ngay trên sh nhập liệu hay là kiểm tra tại một sh # (xem là 1 mã có bao nhiêu lần trùng - hay là lọc ra danh sách của các mã....?)
Bạn nói cụ thể đi.
 
Upvote 0
Mình đã tìm được cách như sau dùng công thức mãng
Mình dùng công thức mãng như sau:
={MAX(COUNTIF(D2:D1156,D2:D1156))}
công thức này cho ta biết được là trong danh sách có trùng.
={MATCH(E1,COUNTIF(D2:D1156,$D$2:$D$1156),0)}
công thức này cho ta biết nó trùng ở dòng nào

vùng đó mình nối Lop&Họ&Tên Cám ơn các bạn nhiều
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT
Back
Top Bottom