Sự kiện trong VBA ?

Liên hệ QC

moihocvba

Thành viên thường trực
Tham gia
16/8/20
Bài viết
211
Được thích
50
Chào anh chị GPE!
Trong file này em muốn khi bất kỳ thay đổi ô nào từ cột C trở qua phải thì ở cột B sẽ hiển thị username máy tính đã chỉnh sửa dòng đó, vấn đề em gặp ở đây là khi đổi từng dòng thì được, nhưng nếu copy dán nhiều dòng dán vào cùng lúc thì nó cũng chỉ áp dụng dòng đầu tiên. Anh chị giúp em làm sao có thể áp dụng nhiều dòng cùng lúc khi copy ah.
Anh chị xem code em viết cần bổ sung chỗ nào ạ!
Em cám ơn!
 

File đính kèm

  • Copy of Khoa O Tu Dong2.xlsm
    69.7 KB · Đọc: 14
Chào anh chị GPE!
Trong file này em muốn khi bất kỳ thay đổi ô nào từ cột C trở qua phải thì ở cột B sẽ hiển thị username máy tính đã chỉnh sửa dòng đó, vấn đề em gặp ở đây là khi đổi từng dòng thì được, nhưng nếu copy dán nhiều dòng dán vào cùng lúc thì nó cũng chỉ áp dụng dòng đầu tiên. Anh chị giúp em làm sao có thể áp dụng nhiều dòng cùng lúc khi copy ah.
Anh chị xem code em viết cần bổ sung chỗ nào ạ!
Em cám ơn!
Sửa khúc cũ:
Mã:
Cells(Target.Row, 2) = "=UserName()"
Cells(Target.Row, 2).Value = Cells(Target.Row, 2).Value
Thành:
Mã:
Dim rngRws As Range 'Khai báo đầu code
For Each rngRws In Target.Rows
    Cells(rngRws.Row, 2) = UserName()
Next
 
Upvote 0
Sửa khúc cũ:
Mã:
Cells(Target.Row, 2) = "=UserName()"
Cells(Target.Row, 2).Value = Cells(Target.Row, 2).Value
Thành:
Mã:
Dim rngRws As Range 'Khai báo đầu code
For Each rngRws In Target.Rows
    Cells(rngRws.Row, 2) = UserName()
Next
Dạ em đã làm được rồi ạ.
Cho em hỏi thêm một chỗ nữa ạ, cũng tương tự như vậy, khi nhập bất kỳ vào ô nào ở cột A thì dòng tương ứng ô đó sẽ mang thuộc tính Lock = True và khóa lại, còn nếu rỗng thì cho thuộc tính là Lock = Fasle
Em cũng bị lỗi là khi kéo xuống thì chỉ có ô đầu bị áp dụng. Đây là code của em, em nên sửa chỗ nào vậy ạ? Em cám ơn!

Mã:
    If Not Intersect(Target, Range("A4:A65000")) Is Nothing Then
             ActiveSheet.Unprotect MatKhauMatDinh
                 Dim i As Long
                 i = Target.Row
                 If Target.Value <> "" Then
                     Range("A" & i & ":XFD" & i).Locked = True
                     KHoaCotB
                 Else
                      Range("A" & i & ":XFD" & i).Locked = False
                      KHoaCotB
                 End If
            If Range("CD1").Value = 0 Then
            ActiveSheet.Protect MatKhauMatDinh
            End If
    
    End If
 
Upvote 0
Chào anh chị GPE!
Trong file này em muốn khi bất kỳ thay đổi ô nào từ cột C trở qua phải thì ở cột B sẽ hiển thị username máy tính đã chỉnh sửa dòng đó, vấn đề em gặp ở đây là khi đổi từng dòng thì được, nhưng nếu copy dán nhiều dòng dán vào cùng lúc thì nó cũng chỉ áp dụng dòng đầu tiên. Anh chị giúp em làm sao có thể áp dụng nhiều dòng cùng lúc khi copy ah.
Anh chị xem code em viết cần bổ sung chỗ nào ạ!
Em cám ơn!
Bạn thử vậy xem được không.
Mã:
Range(Cells(Target.Row, 2), Cells(Target.Row + Target.Rows.Count - 1, 2)) = "=UserName()"
 
Upvote 0
Dạ em đã làm được rồi ạ.
Cho em hỏi thêm một chỗ nữa ạ, cũng tương tự như vậy, khi nhập bất kỳ vào ô nào ở cột A thì dòng tương ứng ô đó sẽ mang thuộc tính Lock = True và khóa lại, còn nếu rỗng thì cho thuộc tính là Lock = Fasle
Em cũng bị lỗi là khi kéo xuống thì chỉ có ô đầu bị áp dụng. Đây là code của em, em nên sửa chỗ nào vậy ạ? Em cám ơn!

Mã:
    If Not Intersect(Target, Range("A4:A65000")) Is Nothing Then
             ActiveSheet.Unprotect MatKhauMatDinh
                 Dim i As Long
                 i = Target.Row
                 If Target.Value <> "" Then
                     Range("A" & i & ":XFD" & i).Locked = True
                     KHoaCotB
                 Else
                      Range("A" & i & ":XFD" & i).Locked = False
                      KHoaCotB
                 End If
            If Range("CD1").Value = 0 Then
            ActiveSheet.Protect MatKhauMatDinh
            End If
   
    End If
Code bạn nhìn rối rắm lắm, nên sửa lại toàn bộ rồi mới tính chuyện tinh chỉnh lại sau. Loanh quanh mấy chỗ khóa cột dòng.. thì nên viết một sub rồi truyền tham số vùng cần khóa vào.
Để kiểm tra sheet có khóa không có thể sử dụng "If ActiveSheet.ProtectContents = True Then" chứ không cần phải viết kết quả 1,0 vào ô CD1.
Để sửa dữ liệu trong vùng khóa thì khi khóa nên dùng "ActiveSheet.Protect Password:="123", UserInterfaceOnly:=True" , không nhất thiết phải unprotect rồi lại protect.
Mình hướng dẫn vậy thôi, bạn tự nghiên cứu thêm nhé!
 
Upvote 0
Dạ em đã làm được rồi ạ.
Cho em hỏi thêm một chỗ nữa ạ, cũng tương tự như vậy, khi nhập bất kỳ vào ô nào ở cột A thì dòng tương ứng ô đó sẽ mang thuộc tính Lock = True và khóa lại, còn nếu rỗng thì cho thuộc tính là Lock = Fasle
Em cũng bị lỗi là khi kéo xuống thì chỉ có ô đầu bị áp dụng. Đây là code của em, em nên sửa chỗ nào vậy ạ? Em cám ơn!

Mã:
    If Not Intersect(Target, Range("A4:A65000")) Is Nothing Then
             ActiveSheet.Unprotect MatKhauMatDinh
                 Dim i As Long
                 i = Target.Row
                 If Target.Value <> "" Then
                     Range("A" & i & ":XFD" & i).Locked = True
                     KHoaCotB
                 Else
                      Range("A" & i & ":XFD" & i).Locked = False
                      KHoaCotB
                 End If
            If Range("CD1").Value = 0 Then
            ActiveSheet.Protect MatKhauMatDinh
            End If
   
    End If
Tôi có thắc mắc là nếu gõ vào một giá trị ở cột A xong Enter (Lúc này hàng vừa nhập đã khóa) và nhìn lại thấy nó sai và muốn sửa phải làm sao, chắc mở khóa mới sửa được. Thứ hai nếu nhập dữ liệu vào từ cột D xong nhấn Enter (Lúc này username được ghi vào cột B), và quay trở lại xóa dữ liệu ô vừa nhập nhưng username vẫn còn. Nói chung là chưa hiểu lắm về nhu cầu của bạn, tôi sửa chút code cho bạn nếu có gì chưa đúng thì tính tiếp.
 

File đính kèm

  • Copy of Khoa O Tu Dong2.xlsm
    67 KB · Đọc: 8
Upvote 0
Dạ em đã làm được rồi ạ.
Cho em hỏi thêm một chỗ nữa ạ, cũng tương tự như vậy, khi nhập bất kỳ vào ô nào ở cột A thì dòng tương ứng ô đó sẽ mang thuộc tính Lock = True và khóa lại, còn nếu rỗng thì cho thuộc tính là Lock = Fasle
Em cũng bị lỗi là khi kéo xuống thì chỉ có ô đầu bị áp dụng. Đây là code của em, em nên sửa chỗ nào vậy ạ? Em cám ơn!
Dạ để cho gọn và dễ hiểu thì em xin phép hỏi anh chị như thế này ạ:

Nếu nhập bất kỳ ký tự nào khác rỗng vào ô ở cột A thì dòng tương ứng sẽ mang thuộc tính Lock = True, những dòng còn lại mà cột A trống thì thuộc tính Lock = False.

Nếu như code em ghi như thế này thì nó chỉ được khi mình tác động vào 1 ô riêng lẻ, nếu mình copy dữ liệu dán vào nhiều ô ở cột A cùng lúc thì không được:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)

   If Not Intersect(Target, Range("A4:A65000")) Is Nothing Then
                  Dim i As Long
                 i = Target.Row
                 If Target.Value <> "" Then
                     Range("A" & i & ":XFD" & i).Locked = True
                 Else
                      Range("A" & i & ":XFD" & i).Locked = False
                 End If
            End If
    End If

End Sub

E muốn khi tác cùng lúc nhiều ô vẫn được thì em phải sửa lại chỗ này như thế nào ạ!
Em xin cảm ơn rất nhiều!
 
Upvote 0
Sửa khúc cũ:
Mã:
Cells(Target.Row, 2) = "=UserName()"
Cells(Target.Row, 2).Value = Cells(Target.Row, 2).Value
Thành:
Mã:
Dim rngRws As Range 'Khai báo đầu code
For Each rngRws In Target.Rows
    Cells(rngRws.Row, 2) = UserName()
Next
Hình như không dùng vòng lặp cũng được.
intersect(target.entirerow, target.parent.columns(2)).value = username()
 
Upvote 0
Bạn mô tả khúc này thành văn xuôi xem nào.
Thớt này có tật muốn làm nhiều chuyện phức tạp mà bỏ qua hai giai đoạn căn bản hết sức quan trọng:
1. học cách suy luận, sắp xếp lô gic và diễn tả vấn đề.
2. học căn bản cú pháp và trật tự lệnh VBA

Căn cứ theo những chuyện phức tạp mà thớt muốn thực hiện thì đáng lẽ phải ở trình độ đã nâng cao (sau khi nâng cao), Nhưng kỹ thuật viết code chỉ nằm mãi ở mức trung bình, có nhiều cú pháp thuộc dạng mới bắt đầu học. Tôi tin chắc là do suy nghĩ phức tạp quá nên đầu óc không chịu làm quen với căn bản.
 
Upvote 0
Thớt này có tật muốn làm nhiều chuyện phức tạp mà bỏ qua hai giai đoạn căn bản hết sức quan trọng:
1. học cách suy luận, sắp xếp lô gic và diễn tả vấn đề.
2. học căn bản cú pháp và trật tự lệnh VBA
Ngay cả tiêu đề cũng chưa biết cách đặt cho khỏi vi phạm nội quy
 
Upvote 0
Ngay cả tiêu đề cũng chưa biết cách đặt cho khỏi vi phạm nội quy
Nó là phần 1 tôi nói. Thiowts khong chịu bỏ thời gian sắp xếp lô gic cho nên không biết những yếu điểm để đưa vào tiêu đề.

Chú: "yếu điểm" là những điểm quan trọng (tiếng Anh là key points/areas). Nhiều người hiểu lầm với "nhược điểm" là những chỗ nhược, chỗ xấu (weak points)
 
Upvote 0
1. học cách suy luận, sắp xếp lô gic và diễn tả vấn đề.
Tương tự như bài 1 mà. Bài 1 hỏi về sửa code cho trường hợp dán 1 lần nhiều giá trị vào C4:XFD65000, còn bài 3 và cũng là bài 7 hỏi về sửa code cho trường hợp dán 1 lần nhiều giá trị vào A4:A65000. Tóm lại có code cho sự thay đổi 1 ô người muốn sửa thành code phục vụ trường hợp SỬA NHIỀU Ô ĐỒNG THỜI (copy và paste). Hiểu yêu cầu bài 1 (bằng chứng là bài 2) thì không lý gì lại không hiểu yêu cầu bài 3 và 7.
 
Upvote 0
Dạ em cám ơn các thầy đã hỗ trợ và góp ý cho em. Yêu cầu này khó quá, mà em cũng không biết cách diễn đạt sao cho mấy thầy hiểu. Em xin lỗi, em sẽ tìm cách khác ạ!
Em cám ơn rất nhiều ạ!
 
Upvote 0
Dạ em cám ơn các thầy đã hỗ trợ và góp ý cho em. Yêu cầu này khó quá, mà em cũng không biết cách diễn đạt sao cho mấy thầy hiểu. Em xin lỗi, em sẽ tìm cách khác ạ!
Em cám ơn rất nhiều ạ!
Vấn đề bài 3 tương tự vấn đề bài 1 nên cách giải quyết tương tự. Code giải quyết cho bài 3 đã có ở bài 6. Tuy code chưa chuẩn nhưng nếu người ta đề nghị thì cũng nên cho ý kiến. Hoặc chấp nhận hoặc yêu cầu thêm. Lờ bài 6 thì còn ai muốn giúp nữa. Mình muốn được giúp thì không nên lờ những bài mà người ta bỏ công ra giúp mình.
 
Upvote 0
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("A4:A65000")) Is Nothing Then
Dim i As Long
i = Target.Row
If Target.Value <> "" Then
Range("A" & i & ":XFD" & i).Locked = True
Else
Range("A" & i & ":XFD" & i).Locked = False
End If

End If
End If

End Sub
Cẩn thận khi cắt bớt code.
Tôi không hiểu sao đoạn này không bị VBA chê. Có tất cả 2 If-Then mà có tới 3 End If

Sửa cái chỗ tô đỏ và xanh thành:
Dim rg As Range
i = Target.Row
Set rg = Range(Cells(i, "A", Cells(i, "XFD")
For i = 0 To Tatrget.Rows.Count - 1
rg.Offset(i, 0).Locked = (Target.Cells(i, 1).Value <> "")
Next i
 
Upvote 0
Cẩn thận khi cắt bớt code.
Tôi không hiểu sao đoạn này không bị VBA chê. Có tất cả 2 If-Then mà có tới 3 End If

Sửa cái chỗ tô đỏ và xanh thành:
Dim rg As Range
i = Target.Row
Set rg = Range(Cells(i, "A", Cells(i, "XFD")
For i = 0 To Tatrget.Rows.Count - 1
rg.Offset(i, 0).Locked = (Target.Cells(i, 1).Value <> "")
Next i
Người ta dán giá trị vào hàng loạt ô thì đúng rồi, nhưng không có gì chắc là người ta chỉ dán vào cột A.

Thực ra code bài 1 bao gồm cả cái hỏi trong bài 1 và cả cái hỏi trong bài 7. Bài 7 người ta cắt riêng ra vì phần liên quan C:XFD đã được trả lời. Nếu ghép code trên vào tập tin thực ở bài 1 thì tèo vì người ta lúc thì dán vào C:XFD lúc vào A, mà rất có thể cả và̀o C:XFD và cả vào A trong 1 và chỉ 1 nốt nhạc.
 
Upvote 0
Người ta dán giá trị vào hàng loạt ô thì đúng rồi, nhưng không có gì chắc là người ta chỉ dán vào cột A.

Thực ra code bài 1 bao gồm cả cái hỏi trong bài 1 và cả cái hỏi trong bài 7. Bài 7 người ta cắt riêng ra vì phần liên quan C:XFD đã được trả lời. Nếu ghép code trên vào tập tin thực ở bài 1 thì tèo vì người ta lúc thì dán vào C:XFD lúc vào A, mà rất có thể cả và̀o C:XFD và cả vào A trong 1 và chỉ 1 nốt nhạc.
Đó là cái chỗ "nói chuyện kém mạch lạc" của thớt.
Bài #7 cách bài #6 đến hơn 1 ngày. Thớt không hề đá động đến nó.
Và theo tôi hiểu thì code bài #7 chỉ liên quan đến khoá từng phần của một vùng dữ liệu.
Tính của tôi thì ít khi làm từ a đến z. Hỏi cách code thì tôi mách cho cách code thôi.
Chuyện "code tréo quẹo nhau" thì bai #6 đã nhắc rồi. Tôi nghĩ rằng nhắc lại chỉ phí hơi thôi. Đầu óc thớt đã có sạn rồi.
 
Upvote 0
Web KT

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

Back
Top Bottom