Cần giúp đỡ về VBA

Liên hệ QC
Máy tôi bị chặn từ đêm 2/11 đến hôm nay mới vào được.

Bạn sửa tổng cộng ở 3 dòng thành
Mã:
If Target.Count > 1 Or Target.Column <> 2 Then Exit Sub
...
lastRow = .Range("B" & Rows.Count).End(xlUp).Row
...
Set rng = .Range("B1:B" & lastRow)

Trong dòng đầu luôn có 1. Có 2 là do cột B có chỉ số 2. Cột A có chỉ số 1, cột C có chỉ số 3 v...v Lần sau đổi cột khác thì sửa cả 2 thành chỉ số cột cần thao tác.

cam on ban, minh lam dc roi.thanks nhe
 
Máy tôi bị chặn từ đêm 2/11 đến hôm nay mới vào được.

Bạn sửa tổng cộng ở 3 dòng thành
Mã:
If Target.Count > 1 Or Target.Column <> 2 Then Exit Sub
...
lastRow = .Range("B" & Rows.Count).End(xlUp).Row
...
Set rng = .Range("B1:B" & lastRow)

Trong dòng đầu luôn có 1. Có 2 là do cột B có chỉ số 2. Cột A có chỉ số 1, cột C có chỉ số 3 v...v Lần sau đổi cột khác thì sửa cả 2 thành chỉ số cột cần thao tác.

Anh ơi . trước đây anh có làm cho em cái file này . hiện tại thì OK rồi . nhưng em muốn thêm chút nữa mong anh giúp ạ.
thay vì hiện tại chỉ áp dụng cho cột C . bây giờ em muốn cho nhiều cột ví dụ áp dụng cho cột từ A -> G thì làm như thế nào ạ. cảm ơn anh.
 

File đính kèm

  • SaiDataTrungData.xlsm
    17.5 KB · Đọc: 3
Anh ơi . trước đây anh có làm cho em cái file này . hiện tại thì OK rồi . nhưng em muốn thêm chút nữa mong anh giúp ạ.
thay vì hiện tại chỉ áp dụng cho cột C . bây giờ em muốn cho nhiều cột ví dụ áp dụng cho cột từ A -> G thì làm như thế nào ạ. cảm ơn anh.
Bạn muốn áp dụng cho 7, cột A:G, nhưng bạn quên giải thích cách kiểm tra dữ liệu trùng. Vd. tôi vừa nhập "hic" ở D8. Vậy code kiểm tra xem "hic" có xuất hiện > 1 lần trong cột D (cột hiện hành) hay là kiểm tra trong toàn vùng A1:Gxyz?
Tôi giả thiết là kiểm tra trùng luôn chỉ trong cột hiện hành. Tức nhập D8 = "Cam" -> kiểm tra trùng trong cột D, nhập G11 = "Nho" -> kiểm tra trùng trong cột G.
Code được sửa để áp dụng cho cột A:G.

Tôi sửa chay thôi. Bạn tự kiểm tra.

Thay toàn bộ code cũ bằng
Mã:
Private Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
Dim PlaySound       As Boolean
       
'    neu nhieu o thay doi hoac thay doi tu cot 8 (cot H) tro di thi nghi choi
    If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phep nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 . Thong bao
         Call sndPlaySound32("C:\Windows\Media\ring01.wav ", 1)
        MsgBox " SAI DATA"
        badValue = True
    End If
'    kiem tra trung lap
    With Sheet1
'        dong cuoi cung co du lieu
        lastRow = .Cells(Rows.Count, Target.Column).End(xlUp).Row
        Target.EntireColumn.Select  ' chon cot hien hanh
        Selection.ClearFormats
        .Cells(lastRow, Target.Column).Select
        
        
'        neu lastRow = 1 thi khong kiem tra vi chi co 1 du lieu nen khong co chuyen trung lap
        If lastRow > 1 Then
'            vung du lieu can kiem tra - tu dong 1 toi dong lastRow trong cot hien hanh (cot co o vua thay doi)
            Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
'            neu co trung thi thuc hien
            If Application.CountIf(rng, Target.Value) > 1 Then
'                du lieu vua nhap da xuat hien. Thong bao
                Call sndPlaySound32("C:\Windows\Media\ring01.wav ", 1)
                MsgBox " TRUNG DATA"
                badValue = True
            End If
        End If
        Target.Offset(1).Select
    End With
    
    If badValue Then
'        du lieu vua nhap sai hoac trung. Vay xoa du lieu
'        "Tat" phuc vu su kien Change vi neu khong thi khi xoa du lieu nhap sai hoac trung thi lai say ra
'        su kien Change -> code lai duoc thuc hien.
        Application.EnableEvents = False
        Target.Value = Empty
        Target.Select
        Application.EnableEvents = True
    End If
   
End Sub
 
Bạn muốn áp dụng cho 7, cột A:G, nhưng bạn quên giải thích cách kiểm tra dữ liệu trùng. Vd. tôi vừa nhập "hic" ở D8. Vậy code kiểm tra xem "hic" có xuất hiện > 1 lần trong cột D (cột hiện hành) hay là kiểm tra trong toàn vùng A1:Gxyz?
Tôi giả thiết là kiểm tra trùng luôn chỉ trong cột hiện hành. Tức nhập D8 = "Cam" -> kiểm tra trùng trong cột D, nhập G11 = "Nho" -> kiểm tra trùng trong cột G.
Code được sửa để áp dụng cho cột A:G.

Tôi sửa chay thôi. Bạn tự kiểm tra.

Thay toàn bộ code cũ bằng
Mã:
Private Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
Dim PlaySound       As Boolean
      
'    neu nhieu o thay doi hoac thay doi tu cot 8 (cot H) tro di thi nghi choi
    If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phep nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 . Thong bao
         Call sndPlaySound32("C:\Windows\Media\ring01.wav ", 1)
        MsgBox " SAI DATA"
        badValue = True
    End If
'    kiem tra trung lap
    With Sheet1
'        dong cuoi cung co du lieu
        lastRow = .Cells(Rows.Count, Target.Column).End(xlUp).Row
        Target.EntireColumn.Select  ' chon cot hien hanh
        Selection.ClearFormats
        .Cells(lastRow, Target.Column).Select
       
       
'        neu lastRow = 1 thi khong kiem tra vi chi co 1 du lieu nen khong co chuyen trung lap
        If lastRow > 1 Then
'            vung du lieu can kiem tra - tu dong 1 toi dong lastRow trong cot hien hanh (cot co o vua thay doi)
            Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
'            neu co trung thi thuc hien
            If Application.CountIf(rng, Target.Value) > 1 Then
'                du lieu vua nhap da xuat hien. Thong bao
                Call sndPlaySound32("C:\Windows\Media\ring01.wav ", 1)
                MsgBox " TRUNG DATA"
                badValue = True
            End If
        End If
        Target.Offset(1).Select
    End With
   
    If badValue Then
'        du lieu vua nhap sai hoac trung. Vay xoa du lieu
'        "Tat" phuc vu su kien Change vi neu khong thi khi xoa du lieu nhap sai hoac trung thi lai say ra
'        su kien Change -> code lai duoc thuc hien.
        Application.EnableEvents = False
        Target.Value = Empty
        Target.Select
        Application.EnableEvents = True
    End If
  
End Sub
Dạ. em chỉ cần kiểm tra trùng và 3 kí tự trong cột hiện hành thôi. Ko cần so sánh hết tất cả các cột khác ạ.
 
Bạn muốn áp dụng cho 7, cột A:G, nhưng bạn quên giải thích cách kiểm tra dữ liệu trùng. Vd. tôi vừa nhập "hic" ở D8. Vậy code kiểm tra xem "hic" có xuất hiện > 1 lần trong cột D (cột hiện hành) hay là kiểm tra trong toàn vùng A1:Gxyz?
Tôi giả thiết là kiểm tra trùng luôn chỉ trong cột hiện hành. Tức nhập D8 = "Cam" -> kiểm tra trùng trong cột D, nhập G11 = "Nho" -> kiểm tra trùng trong cột G.
Code được sửa để áp dụng cho cột A:G.

Tôi sửa chay thôi. Bạn tự kiểm tra.

Thay toàn bộ code cũ bằng
Mã:
Private Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
Dim PlaySound       As Boolean
      
'    neu nhieu o thay doi hoac thay doi tu cot 8 (cot H) tro di thi nghi choi
    If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phep nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 . Thong bao
         Call sndPlaySound32("C:\Windows\Media\ring01.wav ", 1)
        MsgBox " SAI DATA"
        badValue = True
    End If
'    kiem tra trung lap
    With Sheet1
'        dong cuoi cung co du lieu
        lastRow = .Cells(Rows.Count, Target.Column).End(xlUp).Row
        Target.EntireColumn.Select  ' chon cot hien hanh
        Selection.ClearFormats
        .Cells(lastRow, Target.Column).Select
       
       
'        neu lastRow = 1 thi khong kiem tra vi chi co 1 du lieu nen khong co chuyen trung lap
        If lastRow > 1 Then
'            vung du lieu can kiem tra - tu dong 1 toi dong lastRow trong cot hien hanh (cot co o vua thay doi)
            Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
'            neu co trung thi thuc hien
            If Application.CountIf(rng, Target.Value) > 1 Then
'                du lieu vua nhap da xuat hien. Thong bao
                Call sndPlaySound32("C:\Windows\Media\ring01.wav ", 1)
                MsgBox " TRUNG DATA"
                badValue = True
            End If
        End If
        Target.Offset(1).Select
    End With
   
    If badValue Then
'        du lieu vua nhap sai hoac trung. Vay xoa du lieu
'        "Tat" phuc vu su kien Change vi neu khong thi khi xoa du lieu nhap sai hoac trung thi lai say ra
'        su kien Change -> code lai duoc thuc hien.
        Application.EnableEvents = False
        Target.Value = Empty
        Target.Select
        Application.EnableEvents = True
    End If
  
End Sub
Anh ơi. Em dùng office 365 nó bị lỗi như vậy. Nó văng ra lun. Anh giúp em với ạ.
 

File đính kèm

  • 20200822_041551.jpg
    20200822_041551.jpg
    123.5 KB · Đọc: 5
Anh ơi. Em dùng office 365 nó bị lỗi như vậy. Nó văng ra lun. Anh giúp em với ạ.
Do bạn thôi. Trong bài #22 bạn viết
Mã:
hiện tại thì OK rồi

Không lý gì tập tin ở bài #22 chạy không bị lỗi mà code ở bài #23 lại bị lỗi.

Nếu tập tin ở bài #22 bạn chạy với Excel phiên bản khác còn bây giờ bạn muốn chạy trong phiên bản khác thì tại sao trong bài #22 bạn không nói toạc ra?
----------
Ta sẽ khai báo đầy đủ hơn. Và dùng hàm mới hơn, đó là PlaySound
Mã:
Option Explicit

Private Const SND_FILENAME = &H20000

#If VBA7 Then
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As LongPtr, ByVal dwFlags As Long) As Long
#Else
    Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
#End If

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
       
'    neu nhieu o thay doi hoac thay doi tu cot 8 (cot H) tro di thi nghi choi
    If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phep nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 . Thong bao
        PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
        MsgBox " SAI DATA"
        badValue = True
    End If
'    kiem tra trung lap
    With Sheet1
'        dong cuoi cung co du lieu
        lastRow = .Cells(Rows.Count, Target.Column).End(xlUp).Row
        Target.EntireColumn.Select  ' chon cot hien hanh
        Selection.ClearFormats
        .Cells(lastRow, Target.Column).Select
        
        
'        neu lastRow = 1 thi khong kiem tra vi chi co 1 du lieu nen khong co chuyen trung lap
        If lastRow > 1 Then
'            vung du lieu can kiem tra - tu dong 1 toi dong lastRow trong cot hien hanh (cot co o vua thay doi)
            Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
'            neu co trung thi thuc hien
            If Application.CountIf(rng, Target.Value) > 1 Then
'                du lieu vua nhap da xuat hien. Thong bao
                PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
                MsgBox " TRUNG DATA"
                badValue = True
            End If
        End If
        Target.Offset(1).Select
    End With
    
    If badValue Then
'        du lieu vua nhap sai hoac trung. Vay xoa du lieu
'        "Tat" phuc vu su kien Change vi neu khong thi khi xoa du lieu nhap sai hoac trung thi lai say ra
'        su kien Change -> code lai duoc thuc hien.
        Application.EnableEvents = False
        Target.Value = Empty
        Target.Select
        Application.EnableEvents = True
    End If
   
End Sub
 
Do bạn thôi. Trong bài #22 bạn viết
Mã:
hiện tại thì OK rồi

Không lý gì tập tin ở bài #22 chạy không bị lỗi mà code ở bài #23 lại bị lỗi.

Nếu tập tin ở bài #22 bạn chạy với Excel phiên bản khác còn bây giờ bạn muốn chạy trong phiên bản khác thì tại sao trong bài #22 bạn không nói toạc ra?
----------
Ta sẽ khai báo đầy đủ hơn. Và dùng hàm mới hơn, đó là PlaySound
Mã:
Option Explicit

Private Const SND_FILENAME = &H20000

#If VBA7 Then
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As LongPtr, ByVal dwFlags As Long) As Long
#Else
    Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
#End If

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
      
'    neu nhieu o thay doi hoac thay doi tu cot 8 (cot H) tro di thi nghi choi
    If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phep nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 . Thong bao
        PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
        MsgBox " SAI DATA"
        badValue = True
    End If
'    kiem tra trung lap
    With Sheet1
'        dong cuoi cung co du lieu
        lastRow = .Cells(Rows.Count, Target.Column).End(xlUp).Row
        Target.EntireColumn.Select  ' chon cot hien hanh
        Selection.ClearFormats
        .Cells(lastRow, Target.Column).Select
       
       
'        neu lastRow = 1 thi khong kiem tra vi chi co 1 du lieu nen khong co chuyen trung lap
        If lastRow > 1 Then
'            vung du lieu can kiem tra - tu dong 1 toi dong lastRow trong cot hien hanh (cot co o vua thay doi)
            Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
'            neu co trung thi thuc hien
            If Application.CountIf(rng, Target.Value) > 1 Then
'                du lieu vua nhap da xuat hien. Thong bao
                PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
                MsgBox " TRUNG DATA"
                badValue = True
            End If
        End If
        Target.Offset(1).Select
    End With
   
    If badValue Then
'        du lieu vua nhap sai hoac trung. Vay xoa du lieu
'        "Tat" phuc vu su kien Change vi neu khong thi khi xoa du lieu nhap sai hoac trung thi lai say ra
'        su kien Change -> code lai duoc thuc hien.
        Application.EnableEvents = False
        Target.Value = Empty
        Target.Select
        Application.EnableEvents = True
    End If
  
End Sub
Dạ tại trước đến giờ em dùng 2019. Hum qua em mới lên 365 . Nên em ko biết được là lên là bị lỗi.
Vơi lại hiện tại khi em nhập vào cột hiện hành mà sai hoặc trung data là nó xóa hết định dạng của cột đó lun ạ. Data vẫn còn nhưng ví dụ em kẻ khung tô màu cột đó là nó xóa lun. Anh giúp em nha.
 
Vơi lại hiện tại khi em nhập vào cột hiện hành mà sai hoặc trung data là nó xóa hết định dạng của cột đó lun ạ. Data vẫn còn nhưng ví dụ em kẻ khung tô màu cột đó là nó xóa lun. Anh giúp em nha.
Do trong bài #22 bạn tự ý thêm vài dòng code mà tôi lười không hỏi dụng ý của bạn là gì. Tôi đã cho là bạn cố tình làm như thế, vì vậy tôi không xóa các dòng đó.

Bạn thử lại code.
Mã:
Option Explicit

Private Const SND_FILENAME = &H20000

#If VBA7 Then
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As LongPtr, ByVal dwFlags As Long) As Long
#Else
    Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
#End If

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
       
'    neu nhieu o thay doi hoac thay doi tu cot 8 (cot H) tro di thi nghi choi
    If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phep nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 . Thong bao
        PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
        MsgBox " SAI DATA"
        badValue = True
    End If
    If Not badValue Then
'    kiem tra trung lap
        With Sheet1
    '        dong cuoi cung co du lieu
            lastRow = .Cells(Rows.Count, Target.Column).End(xlUp).Row
    '        neu lastRow = 1 thi khong kiem tra vi chi co 1 du lieu nen khong co chuyen trung lap
            If lastRow > 1 Then
    '            vung du lieu can kiem tra - tu dong 1 toi dong lastRow trong cot hien hanh (cot co o vua thay doi)
                Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
    '            neu co trung thi thuc hien
                If Application.CountIf(rng, Target.Value) > 1 Then
    '                du lieu vua nhap da xuat hien. Thong bao
                    PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
                    MsgBox " TRUNG DATA"
                    badValue = True
                End If
            End If
        End With
    End If
    
    If badValue Then
'        du lieu vua nhap sai hoac trung. Vay xoa du lieu
'        "Tat" phuc vu su kien Change vi neu khong thi khi xoa du lieu nhap sai hoac trung thi lai say ra
'        su kien Change -> code lai duoc thuc hien.
        Application.EnableEvents = False
        Target.Value = Empty
        Target.Select
        Application.EnableEvents = True
    End If
   
End Sub
 
Do trong bài #22 bạn tự ý thêm vài dòng code mà tôi lười không hỏi dụng ý của bạn là gì. Tôi đã cho là bạn cố tình làm như thế, vì vậy tôi không xóa các dòng đó.

Bạn thử lại code.
Mã:
Option Explicit

Private Const SND_FILENAME = &H20000

#If VBA7 Then
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As LongPtr, ByVal dwFlags As Long) As Long
#Else
    Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
#End If

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
      
'    neu nhieu o thay doi hoac thay doi tu cot 8 (cot H) tro di thi nghi choi
    If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phep nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 . Thong bao
        PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
        MsgBox " SAI DATA"
        badValue = True
    End If
    If Not badValue Then
'    kiem tra trung lap
        With Sheet1
    '        dong cuoi cung co du lieu
            lastRow = .Cells(Rows.Count, Target.Column).End(xlUp).Row
    '        neu lastRow = 1 thi khong kiem tra vi chi co 1 du lieu nen khong co chuyen trung lap
            If lastRow > 1 Then
    '            vung du lieu can kiem tra - tu dong 1 toi dong lastRow trong cot hien hanh (cot co o vua thay doi)
                Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
    '            neu co trung thi thuc hien
                If Application.CountIf(rng, Target.Value) > 1 Then
    '                du lieu vua nhap da xuat hien. Thong bao
                    PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
                    MsgBox " TRUNG DATA"
                    badValue = True
                End If
            End If
        End With
    End If
   
    If badValue Then
'        du lieu vua nhap sai hoac trung. Vay xoa du lieu
'        "Tat" phuc vu su kien Change vi neu khong thi khi xoa du lieu nhap sai hoac trung thi lai say ra
'        su kien Change -> code lai duoc thuc hien.
        Application.EnableEvents = False
        Target.Value = Empty
        Target.Select
        Application.EnableEvents = True
    End If
  
End Sub
Anh ơi. Em thử thì thấy lệnh chạy hơi chậm. Hơi Delay 1 xíu. Bản trước đây thì nhanh cực kì lun. Ko biết cải thiện tốc độ được không. Hi
Với lại về phần msgbox thì chỉ hoạt động "sai data" còn "trùng data" thì không hoạt động được. Em thử tắt câu lệnh 'Target.value = empty đi thử mà cũng không được.
 
Anh ơi. Em thử thì thấy lệnh chạy hơi chậm. Hơi Delay 1 xíu. Bản trước đây thì nhanh cực kì lun. Ko biết cải thiện tốc độ được không. Hi
Do tôi đổi thành: phát hết nhạc mới hiện MsgBox (synchronously). Nếu bạn muốn như cũ: phát nhạc và hiện MsgBox đồng thời (asynchronously), thì:
- Thêm dòng Private Const SND_ASYNC = 1 ở sau dòng Private Const SND_FILENAME = &H20000
- sửa ở 2 chỗ
Mã:
PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
thành
Mã:
PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME Or SND_ASYNC
Với lại về phần msgbox thì chỉ hoạt động "sai data" còn "trùng data" thì không hoạt động được. Em thử tắt câu lệnh 'Target.value = empty đi thử mà cũng không được.
Tôi thử nhập 2 ký tự hoặc 3 ký tự nhưng trùng thì đều có nhạc và MsgBox.
 
Do tôi đổi thành: phát hết nhạc mới hiện MsgBox (synchronously). Nếu bạn muốn như cũ: phát nhạc và hiện MsgBox đồng thời (asynchronously), thì:
- Thêm dòng Private Const SND_ASYNC = 1 ở sau dòng Private Const SND_FILENAME = &H20000
- sửa ở 2 chỗ
Mã:
PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME
thành
Mã:
PlaySound "C:\Windows\Media\ring01.wav", 0, SND_FILENAME Or SND_ASYNC

Tôi thử nhập 2 ký tự hoặc 3 ký tự nhưng trùng thì đều có nhạc và MsgBox.
Cảm ơn anh nhiều ạ.
Cho em hỏi thêm là ví dụ em muốn set cho nó hoạt động từ dòng 3 trở đi thì làm như thế nào ạ. Bây giờ em muốn dùng dòng 1 và 2 để ghi tiêu đề ý ạ. Nên không muốn nó quét lun dòng 1 ,2. Cảm ơn a.
 
Cảm ơn anh nhiều ạ.
Cho em hỏi thêm là ví dụ em muốn set cho nó hoạt động từ dòng 3 trở đi thì làm như thế nào ạ. Bây giờ em muốn dùng dòng 1 và 2 để ghi tiêu đề ý ạ. Nên không muốn nó quét lun dòng 1 ,2. Cảm ơn a.
1. Sửa
Mã:
If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
thành
Mã:
If Target.Count > 1 Or Target.Column > 7 Or Target.Row < 3 Then Exit Sub

2. Sửa
Mã:
If lastRow > 1 Then
thành
Mã:
If lastRow > 3 Then

3. Sửa
Mã:
Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
thành
Mã:
Set rng = Target.Offset(3 - Target.Row).Resize(lastRow - 2)
------------
Tóm lại nếu trong tương lai muốn từ dòng K thì:
1. Sửa
If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
thành
If Target.Count > 1 Or Target.Column > 7 Or Target.Row < K Then Exit Sub

2. Sửa
If lastRow > 1 Then
thành
If lastRow > K Then

3. Sửa
Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
thành
Set rng = Target.Offset(K - Target.Row).Resize(lastRow +1 - K)
 
1. Sửa
Mã:
If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
thành
Mã:
If Target.Count > 1 Or Target.Column > 7 Or Target.Row < 3 Then Exit Sub

2. Sửa
Mã:
If lastRow > 1 Then
thành
Mã:
If lastRow > 3 Then

3. Sửa
Mã:
Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
thành
Mã:
Set rng = Target.Offset(3 - Target.Row).Resize(lastRow - 2)
------------
Tóm lại nếu trong tương lai muốn từ dòng K thì:
1. Sửa
If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
thành
If Target.Count > 1 Or Target.Column > 7 Or Target.Row < K Then Exit Sub

2. Sửa
If lastRow > 1 Then
thành
If lastRow > K Then

3. Sửa
Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
thành
Set rng = Target.Offset(K - Target.Row).Resize(lastRow +1 - K)
Tuyệt vời quá anh ơi. Cảm ơn anh nhiều nhiều nhé . Cứu nhân của đời em.
 
1. Sửa
Mã:
If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
thành
Mã:
If Target.Count > 1 Or Target.Column > 7 Or Target.Row < 3 Then Exit Sub

2. Sửa
Mã:
If lastRow > 1 Then
thành
Mã:
If lastRow > 3 Then

3. Sửa
Mã:
Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
thành
Mã:
Set rng = Target.Offset(3 - Target.Row).Resize(lastRow - 2)
------------
Tóm lại nếu trong tương lai muốn từ dòng K thì:
1. Sửa
If Target.Count > 1 Or Target.Column > 7 Then Exit Sub
thành
If Target.Count > 1 Or Target.Column > 7 Or Target.Row < K Then Exit Sub

2. Sửa
If lastRow > 1 Then
thành
If lastRow > K Then

3. Sửa
Set rng = Target.Offset(1 - Target.Row).Resize(lastRow)
thành
Set rng = Target.Offset(K - Target.Row).Resize(lastRow +1 - K)
A ơi. Lâu rồi mới gặp lại ạ.
A giúp e 1 chút nữa về file này với ạ.
Trước đây mình quét cột B để để so sánh độ dài chuỗi là 8 . Giờ em muốn thêm nó quét thêm cột C so sánh độ dài chuỗi là 10 thì làm sao ạ. Em cảm ơn ạ.
 

File đính kèm

  • 20230816_054717.jpg
    20230816_054717.jpg
    135.1 KB · Đọc: 2
  • 20230816_054737.jpg
    20230816_054737.jpg
    135.6 KB · Đọc: 2
A ơi. Lâu rồi mới gặp lại ạ.
A giúp e 1 chút nữa về file này với ạ.
Trước đây mình quét cột B để để so sánh độ dài chuỗi là 8 . Giờ em muốn thêm nó quét thêm cột C so sánh độ dài chuỗi là 10 thì làm sao ạ. Em cảm ơn ạ.
Từ khi Putin mở chiến dịch đặc biệt đã không thấy anh batman1 xuất hiện trên diễn đàn đến nay rồi!
 
Web KT
Back
Top Bottom