Cần giúp đỡ về VBA (1 người xem)

Liên hệ QC

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

vovanthanh2602

Thành viên chính thức
Tham gia
29/10/19
Bài viết
83
Được thích
3
Giới tính
Nam
Đề bài.
1 là nhập data vào cột A gồm chuỗi kí tự dài 3 và 5 kí tự , nếu khác thì se báo" sai data", và phát âm thanh.
2 là nêu nhập data vào cột A mà trùng thì sẽ báo "trùng data".và phát âm thanh, ( 1 âm thanh dùng chung cho 2 trường hợp)
-em lam dc như vậy rồi . nhưng bị sai 1 số điểm.
Giup em phan nay voi.
-Sau khi nhap data dung vao cột A thi kich chuot cho nao no cung bao "sai data" het .
-Giup em dieu chinh lai la khi bao "sai data" minh nhan enter thi chuot tu nhay ve lai o do de minh nhap lai => hien tai khi minh nhan enter thi chuot no nhay xuong o ke tiep. ( trung data thi ok roi)
- em co vi du o sheet3 ve viec phat am thanh. ma ko bik long ghep sao de no vo duoc cung 1 sheet. giup e nha. thanks.
 

File đính kèm

if Len(temp) <> 5 And Len(temp) <> 3
Thì điều kiện này luôn đúng dùng len(temp) có giá trị bằng bao nhiều
Và xem lại
- Chọn sự kiện là worksheet_change (không dùng Worksheet_SelectionChange)
- có cần sử dụng DIC không?
- cần xem xét tắt mở Application.EnableEvents không?
 
Lần chỉnh sửa cuối:
if Len(temp) <> 5 And Len(temp) <> 3
Thì điều kiện này luôn đúng
Và xem lại
- Chọn sự kiện là worksheet_change (không dùng Worksheet_SelectionChange)
- có cần sử dụng DIC không?
- cần xem xét tắt mở Application.EnableEvents không?


Bạn ơi, bạn có thể giúp mình dc ko. tại mình ko bik về VBA , minh cũng chỉ copy trên mạng vè thôi. mà ko bik chỉnh sửa. nên bạn giúp mình nhé. cảm ơn bạn nhìu .
 
1. Code theo yêu cầu phải phản ứng sau khi nhập liệu trong mỗi ô chứ không phải khi chọn ô. Vì thế phải dùng Worksheet_Change chứ không phải Worksheet_SelectionChange.

2. Code theo yêu cầu chỉ phản ứng khi nhập dữ liệu vào cột A. Vậy thì trước khi chơi cần kiểm tra xem vùng (vì có thể thay đổi nhiều ô cùng lúc bằng cách dán hàng loat) vừa thay đổi có là 1 ô hay không (ta phản ứng khi thay đổi 1 ô. Cái này là do thống nhất với nhau thôi) và có nằm trong cột A hay không. Nếu không thỏa thì không dọn đồ chơi ra chơi.
Vùng vừa có sự thay đổi chính là Target. Không phải nhờ vả gì anh ActiveCell để xác định.

3. Nếu đi tiếp thì:
- kiểm tra độ dài của ô vừa thay đổi và thông báo lỗi nếu cần.

- kiểm tra trùng lặp và thông báo nếu cần.

Để kiểm tra trùng lặp thì có thể dùng hàm Application.CountIf.

Code không làm việc gì lâu nên Application.ScreenUpdating = False không cần thiết. Tôi không xóa mà chỉ biến nó thành chú thích.

4. Mới học VBA thì nên học khai báo từng biến, và viết tường minh. Đừng học thói quen xấu của người khác. Vd. temp.Value thay cho temp.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
'On Error GoTo thoat
'    Application.ScreenUpdating = False
    
'    neu nhieu o thay doi hoac thay doi khong o cot A thi nghi choi
    If Target.Count > 1 Or Target.Column > 1 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phap nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 5 And Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 va 5. Thong bao
        MsgBox " SAI DATA"
        badValue = True
    End If
'    kiem tra trung lap
    With Sheet1
'        dong cuoi cung co du lieu
        lastRow = .Range("A" & Rows.Count).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
            Set rng = .Range("A1:A" & lastRow)
'            neu co trung thi thuc hien
            If Application.CountIf(rng, Target.Value) > 1 Then
'                du lieu vua nhap da xuat hien. Thong bao
                MsgBox " TRUNG DATA"
                badValue = True
            End If
        End If
    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
        Application.EnableEvents = True
    End If
    
'    Application.ScreenUpdating = True
End Sub
 
1. Code theo yêu cầu phải phản ứng sau khi nhập liệu trong mỗi ô chứ không phải khi chọn ô. Vì thế phải dùng Worksheet_Change chứ không phải Worksheet_SelectionChange.

2. Code theo yêu cầu chỉ phản ứng khi nhập dữ liệu vào cột A. Vậy thì trước khi chơi cần kiểm tra xem vùng (vì có thể thay đổi nhiều ô cùng lúc bằng cách dán hàng loat) vừa thay đổi có là 1 ô hay không (ta phản ứng khi thay đổi 1 ô. Cái này là do thống nhất với nhau thôi) và có nằm trong cột A hay không. Nếu không thỏa thì không dọn đồ chơi ra chơi.
Vùng vừa có sự thay đổi chính là Target. Không phải nhờ vả gì anh ActiveCell để xác định.

3. Nếu đi tiếp thì:
- kiểm tra độ dài của ô vừa thay đổi và thông báo lỗi nếu cần.

- kiểm tra trùng lặp và thông báo nếu cần.

Để kiểm tra trùng lặp thì có thể dùng hàm Application.CountIf.

Code không làm việc gì lâu nên Application.ScreenUpdating = False không cần thiết. Tôi không xóa mà chỉ biến nó thành chú thích.

4. Mới học VBA thì nên học khai báo từng biến, và viết tường minh. Đừng học thói quen xấu của người khác. Vd. temp.Value thay cho temp.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, badValue As Boolean, rng As Range
'On Error GoTo thoat
'    Application.ScreenUpdating = False
  
'    neu nhieu o thay doi hoac thay doi khong o cot A thi nghi choi
    If Target.Count > 1 Or Target.Column > 1 Then Exit Sub
'    neu la xoa du lieu thi nghi choi. Phai cho phap nguoi nhap kha nang xoa du lieu
    If IsEmpty(Target.Value) Then Exit Sub
'    kiem tra do dai chuoi
    If Len(Target.Value) <> 5 And Len(Target.Value) <> 3 Then
'        o vua thay doi co do dai khac 3 va 5. Thong bao
        MsgBox " SAI DATA"
        badValue = True
    End If
'    kiem tra trung lap
    With Sheet1
'        dong cuoi cung co du lieu
        lastRow = .Range("A" & Rows.Count).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
            Set rng = .Range("A1:A" & lastRow)
'            neu co trung thi thuc hien
            If Application.CountIf(rng, Target.Value) > 1 Then
'                du lieu vua nhap da xuat hien. Thong bao
                MsgBox " TRUNG DATA"
                badValue = True
            End If
        End If
    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
        Application.EnableEvents = True
    End If
  
'    Application.ScreenUpdating = True
End Sub

Cảm ơn bạn đã chiếu cố.
Nhưng mình muốn khi nhập sai data bảng thông báo hiện ra sau đó mình nhấn enter thì con chuột về lại ô vừa nhập để mình nhập tiếp vào ô đó chứ ko muốn trỏ chuột nhảy xuống ô kế tiếp,như vậy mất công mình phải đưa chuột về lại ô vừa nhập sai. bạn giup mình lun được ko. thanks.
 
Lần chỉnh sửa cuối:
Cảm ơn bạn đã chiếu cố.
Nhưng mình muốn khi nhập sai data bảng thông báo hiện ra sau đó mình nhấn enter thì con chuột về lại ô vừa nhập để mình nhập tiếp vào ô đó chứ ko muốn trỏ chuột nhảy xuống ô kế tiếp,như vậy mất công mình phải đưa chuột về lại ô vừa nhập sai. bạn giup mình lun được ko. Cảm ơn.
Có gì đâu bạn. Nhiệm vụ của tôi là phải chiếu cố bạn vì gia đình bạn là gia đình có công với cách mạng mà. :D

Sau dòng
Mã:
Target.Value = Empty
thì thêm dòng
Mã:
Target.Select
 
Lần chỉnh sửa cuối:
Sau dòng
Mã:
Target.Value = Empty
thì thêm dòng
Mã:
Target.Select


Bạn ơi. Mình rất cần code này.nhưng thiếu cái cảnh báo âm thanh. Nếu bạn giúp mình code này ok .mình sẽ hậu tạ.
Sau dòng
Mã:
Target.Value = Empty
thì thêm dòng
Mã:
Target.Select


Bạn ơi. Mình rất cần code này.nhưng thiếu cái cảnh báo âm thanh. Nếu bạn giúp mình code này ok .mình sẽ hậu tạ.
khi bảng thông báo hiện lên thì đi kèm phát âm thanh cảnh báo .
Sau dòng
Mã:
Target.Value = Empty
thì thêm dòng
Mã:
Target.Select


bạn ơi.mình rất cần doạn code này. bạn giúp mình thêm phần đi kèm bảng thông báo hiện lên thì phát 1 âm thanh cảnh báo . 1 âm thanh dùng chung cho cả 2 trường hợp trên. nếu ok mình sẽ hậu tạ . bạn giúp mình nha , cam on ban nhiu
 
Nội dung âm thanh là gì? Bạn có 1 tập tin âm thanh nào đó?
 
Thế này có được không? Text "Bad data" bạn có thể thay bằng đoạn text khác.

Sau Target.Select thêm Application.Speech.Speak "Bad data"

Hoặc dùng hàm API PlaySound hoặc mciSendString

Đối với bạn đơn giản nhất là speak ở trên.
 
Lần chỉnh sửa cuối:
Thế này có được không? Text "Bad data" bạn có thể thay bằng đoạn text khác.

Sau Target.Select thêm Application.Speech.Speak "Bad data"


Doạn text ntn là nó đọc như thế đó hả bạn. Tại mình muốn phát 1 âm có đuôi.wav lun. Giống trong file mình gửi trong sheet 3 có đoạn code phát âm thanh ak. Như vậy là được
Bài đã được tự động gộp:

Doạn text ntn là nó đọc như thế đó hả bạn. Tại mình muốn phát 1 âm có đuôi.wav lun. Giống trong file mình gửi trong sheet 3 có đoạn code phát âm thanh ak. Như vậy là được

Bạn ơi mình muốn khi bảng thông báo hiện lên là nó phát âm thanh lun. chứ ko phải đợi mình nhấn enter để tắt bảng thông báo nó ms phát âm thanh.( vì khi mình nhập mình ko cần nhìn màn hình , khi nào nhập sai nó phát âm báo để mình bik để mình nhập lại ak)
 
Lần chỉnh sửa cuối:
Doạn text ntn là nó đọc như thế đó hả bạn.
Những cái gì bạn tự kiểm tra được thì đừng hỏi
Tại mình muốn phát 1 âm có đuôi.wav lun. Giống trong file mình gửi trong sheet 3 có đoạn code phát âm thanh ak. Như vậy là được
Nếu muốn thế thì sau Target.Select thêm dòng
Mã:
Call sndPlaySound32("C:\Windows\Media\Windows Logon.wav", 1)

Ở trên cùng thì có như Sheet3, tức
Mã:
Private Declare Function sndPlaySound32 Lib "winmm.dll" _
Alias "sndPlaySoundA" (ByVal lpszSoundName _
As String, ByVal uFlags As Long) As Long
 
Những cái gì bạn tự kiểm tra được thì đừng hỏi

Nếu muốn thế thì sau Target.Select thêm dòng
Mã:
Call sndPlaySound32("C:\Windows\Media\Windows Logon.wav", 1)

Ở trên cùng thì có như Sheet3, tức
Mã:
Private Declare Function sndPlaySound32 Lib "winmm.dll" _
Alias "sndPlaySoundA" (ByVal lpszSoundName _
As String, ByVal uFlags As Long) As Long


mình thêm vào mà nó báo lỗi. mình gửi bạn file. bạn sửa giúp mình nha.
với lại mình muốn khi bảng thông báo hiện lên là nó phát âm thanh lun. chứ ko phải đợi mình nhấn enter để tắt bảng thông báo nó ms phát âm thanh.( vì khi mình nhập mình ko cần nhìn màn hình , khi nào nhập sai nó phát âm báo để mình bik để mình nhập lại ak)
 

File đính kèm

Bạn ơi mình muốn khi bảng thông báo hiện lên là nó phát âm thanh lun. chứ ko phải đợi mình nhấn enter để tắt bảng thông báo nó ms phát âm thanh.( vì khi mình nhập mình ko cần nhìn màn hình , khi nào nhập sai nó phát âm báo để mình bik để mình nhập lại ak)
Hoặc là phát âm thanh trước hoặc sau MsgBox chứ khi hiện MsgBox thì code dừng ở đó cho tới tận khi bạn nhấn Enter nó mới đi tiếp nên không có chuyện phát âm thanh sau khi hiện MsgBox nhưng trước khi bạn nhấn Enter. Mà nếu không muốn nhìn màn hình thì bỏ MsgBox đi thôi.
Nếu muốn phát âm thanh trước MsgBox thì chuyển Application.Speech.Speak "Bad data" hoặc Call sndPlaySound32("C:\Windows\Media\Windows Logon.wav", 1) lên trước dòng có MsgBox (ở 2 chỗ). Thế thôi.
Bài đã được tự động gộp:

mình thêm vào mà nó báo lỗi. mình gửi bạn file. bạn sửa giúp mình nha.
 

File đính kèm

Lần chỉnh sửa cuối:
Hoặc là phát âm thanh trước hoặc sau MsgBox chứ khi hiện MsgBox thì code dừng ở đó cho tới tận khi bạn nhấn Enter nó mới đi tiếp nên không có chuyện phát âm thanh sau khi hiện MsgBox nhưng trước khi bạn nhấn Enter. Mà nếu không muốn nhìn màn hình thì bỏ MsgBox đi thôi.
Nếu muốn phát âm thanh trước MsgBox thì chuyển Application.Speech.Speak "Bad data" hoặc Call sndPlaySound32("C:\Windows\Media\Windows Logon.wav", 1) lên trước dòng có MsgBox (ở 2 chỗ). Thế thôi.
Bài đã được tự động gộp:

thanks bạn nha. ban cho minh xin so dt minh gui ban card dt nha. dùng mạng j lun.
 
Có câu chuyện thế này về chuyện "nhập sai thì phát âm thanh"

Phòng nọ có cô đòi hỏi cái phần mềm vô dữ liệu nó phải "bíp" một cái khi cô ta nhập sai. Người viết phần mềm này là bạn tôi.
Được một thời gian sau, cả phòng cùng làm việc với cô ta phát khùng luôn vì cứ đến lúc cô ta bắt tay vào việc thì cứ vài giây lại "bíp" một cái, chả cho ai yên ổn cả. Họ năn nỉ cô ta tắt cái ấy đi nhưng cô nhất định không với lý do "nếu tôi gõ sai, ai chịu trách nhiệm?"

Được một thời gian sau, chính cô ta lại nhờ người bạn tôi gỡ cái "bíp" ấy ra. Lý do: các người khác trong phòng dùng tiếng "bíp" để biết được là cô ta đang làm việc hay đang lướt mạng.
 
Không cần thiết đâu. Tôi đã viết rồi mà.

Bạn ơi. Cho mình hỏi . Thay vì mình nhập data vào cột A. Thì giờ mình nhập vào cột B . Nhưng mình thay đổi công thức từ A sang B xong mình nhập vào A nó vẫn chạy .bạn giúp mình nha.
 
Lần chỉnh sửa cuối:
Bạn ơi. Cho mình hỏi . Thay vì mình nhập data vào cột A. Thì giờ mình nhập vào cột B . Nhưng mình thay đổi công thức từ A sang B xong mình nhập vào A nó vẫn chạy .bạn giúp mình nha.
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.
 
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

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!
 

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

Back
Top Bottom