Kích hoạt Worksheet Change khi giá trị cell thay đổi theo hàm Excel (2 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

Vo Duy Minh

Thành viên hoạt động
Tham gia
21/3/19
Bài viết
113
Được thích
32
Chào cac bạn
Rất mong nhận được sự hỗ trợ của các bạn với vấn đề sau.
Như trong file đính kèm, tôi dùng code dưới đây để ghi lại thời gian trong cột D (Sheet 1) khi giá trị dòng tương ứng ở cột C hiển thị (bất kỳ giá trị nào), và khi xóa giá trị ở cột C thì thời gian hiển thị trên cột D dòng tương ứng cũng tự delete.
Giá trị thời gian này sẽ không thay đổi.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("C2:C1000"), Range(Target.Address)) Is Nothing Then
If Range("C" & Target.Row).Value = "" Then
Range("D" & Target.Row).ClearContents
Else
Range("D" & Target.Row).Value = Time
End If
End If
End Sub

Vấn đề của tôi là giá trị (bất kỳ) ở cột C được thiết lập theo giá trị nhập vào ở một trang khác, trong file đính kèm là Sheet 2, cột A, dòng tương ứng.
Khi nhập giá trị vào cột A Sheet 2 thì giá trị ở cột C Sheet 1 dòng tương ứng sẽ hiển thị.
Tuy nhiên, khi giá trị ở cột C hiển thị thì thời gian không hiển thị trên cột D. Giá trị thời gian trên cột D chỉ có thể hiển thị (hoăc tự delete) khi cần phải nhấn Enter cho hàm Excel với giá trị trên cột C.

Rất mong nhận được sự hỗ trợ của các bạn để code VBA trện có thể kích hoạt ngay khi tôi nhập liệu vào cột A của Sheet 2.
Tôi cũng xin lỗi nếu như việc trình bày không được rõ ràng cho các bạn.
 

File đính kèm

Chào cac bạn
Rất mong nhận được sự hỗ trợ của các bạn với vấn đề sau.
Như trong file đính kèm, tôi dùng code dưới đây để ghi lại thời gian trong cột D (Sheet 1) khi giá trị dòng tương ứng ở cột C hiển thị (bất kỳ giá trị nào), và khi xóa giá trị ở cột C thì thời gian hiển thị trên cột D dòng tương ứng cũng tự delete.
Giá trị thời gian này sẽ không thay đổi.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("C2:C1000"), Range(Target.Address)) Is Nothing Then
If Range("C" & Target.Row).Value = "" Then
Range("D" & Target.Row).ClearContents
Else
Range("D" & Target.Row).Value = Time
End If
End If
End Sub

Vấn đề của tôi là giá trị (bất kỳ) ở cột C được thiết lập theo giá trị nhập vào ở một trang khác, trong file đính kèm là Sheet 2, cột A, dòng tương ứng.
Khi nhập giá trị vào cột A Sheet 2 thì giá trị ở cột C Sheet 1 dòng tương ứng sẽ hiển thị.
Tuy nhiên, khi giá trị ở cột C hiển thị thì thời gian không hiển thị trên cột D. Giá trị thời gian trên cột D chỉ có thể hiển thị (hoăc tự delete) khi cần phải nhấn Enter cho hàm Excel với giá trị trên cột C.

Rất mong nhận được sự hỗ trợ của các bạn để code VBA trện có thể kích hoạt ngay khi tôi nhập liệu vào cột A của Sheet 2.
Tôi cũng xin lỗi nếu như việc trình bày không được rõ ràng cho các bạn.
Cột C với A liên kết với nhau bằng cách nào bạn.Mình dùng điện thoại không xem file.
 
Upvote 0
thời gian hiển thị trên cột D dòng tương ứng cũng tự delete.
Giá trị thời gian này sẽ không thay đổi.
Bạn chắc làm văn tốt, bài làm dài ghê, đọc xong nghĩ nát óc luôn. Giá mà ngày xưa mình viết dài dai dỏm dở, cố cho nhiều trang chắc cũng lên được 6, 7 điểm.
Có điều nhập ở sheet nào thì phải nhét code vào sheet đấy, muốn chơi lớn thì nhét vào workbook.
Workbook hay là có thể ảnh hưởng cả file, hay đến nỗi mà mình chưa hiểu nó hoạt động ra sao. :wallbash::wallbash::wallbash:
 
Upvote 0
Cột C với A liên kết với nhau bằng cách nào bạn.Mình dùng điện thoại không xem file.
Cột C với A liên kết với nhau bằng cách nào bạn.Mình dùng điện thoại không xem file.
Chào bạn Snow25
Cột C của Sheet 1 liên kết với cột A của Sheet 2 bằng hàm thông thường, chẳng hạn hàm cho cell C5 của Sheet 1 là If(Sheet2!A5<>"","Time","").
Rất cám ơn bạn đã quan tâm
 
Upvote 0
Chào bạn Snow25
Cột C của Sheet 1 liên kết với cột A của Sheet 2 bằng hàm thông thường, chẳng hạn hàm cho cell C5 của Sheet 1 là If(Sheet2!A5<>"","Time","").
Rất cám ơn bạn đã quan tâm
Trong lúc chờ đợi code xịn hơn. Để có thể xem giờ được thì dùng tạm code dở hơi này. Nhưng phải nhét vào sheet2.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Sheet2.Range("a" & Target.Row).Value = "" Then
      Sheet1.Range("d" & Target.Row).ClearContents
   Else
      Sheet1.Range("D" & Target.Row).Value = Time
   End If
End Sub
 
Upvote 0
Chào bạn Snow25
Cột C của Sheet 1 liên kết với cột A của Sheet 2 bằng hàm thông thường, chẳng hạn hàm cho cell C5 của Sheet 1 là If(Sheet2!A5<>"","Time","").
Rất cám ơn bạn đã quan tâm
Muốn khi thay đổi hàm thì sub event được gọi và thực thi thì phải sử dụng sự kiện (event) : _Caculate
 
Upvote 0
Chào bạn Snow25
Cột C của Sheet 1 liên kết với cột A của Sheet 2 bằng hàm thông thường, chẳng hạn hàm cho cell C5 của Sheet 1 là If(Sheet2!A5<>"","Time","").
Rất cám ơn bạn đã quan tâm
Bạn nên đặt sự kiện ở sheets cột A và điền dữ liệu sang sheets cột C và D không nên dùng công thức như trong file.
 
Upvote 0
Muốn khi thay đổi hàm thì sub event được gọi và thực thi thì phải sử dụng sự kiện (event) : _Caculate
Cụ thể như thế nào bạn? Tôi có 10 ô dùng công thức nhưng chỉ 1 ô được tính toán lại do các tham số đầu vào thay đổi thì làm sao để xác định được ô đó.
 
Upvote 0
Muốn khi thay đổi hàm thì sub event được gọi và thực thi thì phải sử dụng sự kiện (event) : _Caculate
Ồ, cái này thì nhét vào sheet1 được nè. Có cải tiến code cho chuẩn hơn được không bạn nhỉ? Tất nhiên code này mót dạo nên hơi chán đời rồi.
Mã:
Private Sub Worksheet_Calculate()
i = ActiveCell.Row
   If Sheet2.Range("a" & i).Value = "" Then
      Sheet1.Range("d" & i).ClearContents
   Else
      Sheet1.Range("D" & i).Value = Time
   End If
End Sub
Bài đã được tự động gộp:

Mót chưa hết, vẫn còn sót.
Hàng về bạn ơi. Mót thêm. :wallbash: :wallbash: :wallbash:
 
Upvote 0
Hạn chế dùng "Calculate"
Nó cập nhật liên tục, cả khi các ô không liên quan vẫn cập nhật, làm chậm bảng tính.
Một gợi ý khác: Nhập ở sheet khác, khi quay lại sheet1 để xem dữ liệu, thì sheet sẽ cập nhập:
Đặt trong Sheet1:
Worksheet_Activate.
 
Upvote 0
Bạn chắc làm văn tốt, bài làm dài ghê, đọc xong nghĩ nát óc luôn. Giá mà ngày xưa mình viết dài dai dỏm dở, cố cho nhiều trang chắc cũng lên được 6, 7 điểm.
Có điều nhập ở sheet nào thì phải nhét code vào sheet đấy, muốn chơi lớn thì nhét vào workbook.
Workbook hay là có thể ảnh hưởng cả file, hay đến nỗi mà mình chưa hiểu nó hoạt động ra sao. :wallbash::wallbash::wallbash:
Chào bạn "cantailieu",
Cám ơn bạn đã quan tâm. Tôi đặt code vào Sheet1 và nếu nhập liệu vào cột C thì hoàn toàn không có vấn đề gì.
Cái khó khăn của tôi là giá trị của cột C lại do hàm Excel từ cột A của Sheet2 nên nó không kích hoạt được code Worksheet Change.
Tôi cũng xin lỗi bạn đã viết không rõ ràng cho bạn nắm vấn đề.

P/S: Tôi không chắc mình làm văn tốt, nhưng hơn 20 năm dạy môn Viết học thuật tiếng Anh ở Đại học, sinh viên tôi mà viết quá số từ quy định là tôi trừ điểm thẳng tay.
Một lần nữa, cám ơn bạn đã quan tâm.
Trong lúc chờ đợi code xịn hơn. Để có thể xem giờ được thì dùng tạm code dở hơi này. Nhưng phải nhét vào sheet2.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Sheet2.Range("a" & Target.Row).Value = "" Then
      Sheet1.Range("d" & Target.Row).ClearContents
   Else
      Sheet1.Range("D" & Target.Row).Value = Time
   End If
End Sub
 
Upvote 0
Hạn chế dùng "Calculate"
Nó cập nhật liên tục, cả khi các ô không liên quan vẫn cập nhật, làm chậm bảng tính.
Một gợi ý khác: Nhập ở sheet khác, khi quay lại sheet1 để xem dữ liệu, thì sheet sẽ cập nhập:
Đặt trong Sheet1:
Worksheet_Activate.
Em thử nhưng lại không lấy được số dòng bên sheet2 để gán cho sheet1 bác ạ.
Dim i As Integer
i = Sheets("Sheet2").ActiveCell.Row
 
Upvote 0
Rất cám ơn sự quan tâm của tất cả các bạn.
Tôi xin lỗi đã phản hồi chậm cho các bạn.
Tôi thấy code bạn "cantailieu" rất thích hợp với yêu cầu của tôi. Tôi không biết có thể có code nào xịn hơn không như bạn đã nói, nhưng chắn chắn tôi sẽ sử dụng code bạn gợi ý cho tôi.
Một lần nữa, xin cám ơn tất cả các bạn đã quan tâm.
 
Upvote 0
Do bạn viết không rõ thôi, chứ văn vẻ mình đùa ấy mà. Mình vướng mấy cái open, change này nên cũng tò mò nó chạy sao ấy mà.
Với lại Sheet1 hay 2 trên đều có cách cả rồi, mỗi tội code không Pro thôi.
 
Upvote 0
Do bạn viết không rõ thôi, chứ văn vẻ mình đùa ấy mà. Mình vướng mấy cái open, change này nên cũng tò mò nó chạy sao ấy mà.
Với lại Sheet1 hay 2 trên đều có cách cả rồi, mỗi tội code không Pro thôi.
Tôi xin lỗi đã viết không rõ lắm cho bạn (và các bạn khác) để nắm rõ vấn đề.
Còn về việc Pro hay không thì trước mắt giải quyết được vấn đề là quan trọng nhất.
Xin cám ơn bạn rất nhiều.
 
Upvote 0
Còn cái này đối với mình thì nó là lâng cao. :wallbash: :wallbash: :wallbash:
Vẫn phải trong sheet2, mục đích là xóa nhiều dòng A thì bên Sheet 1 sẽ xóa nhiều dòng D. Code thì chạy nhưng mình chả hiểu tại sao nó chạy được. :wallbash::wallbash::wallbash:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("A:A"), Range(Target.Address)) Is Nothing Then
   If WorksheetFunction.CountA(Sheet2.Range(Target.Address)) = 0 Then
      Sheet1.Range(Target.Address).Offset(, 3).ClearContents
   Else
      Sheet1.Range(Target.Address).Offset(, 3).Value = Time
   End If
End If
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom