Private sub worksheet_change byval target as range là gì

The Target.Row value is always greater than or equal to 1 and this code line simply means (TRUE) <= 33 which will always return TRUE since TRUE is -1 and -1 <= 33. Even you used Target.Row >= 10 (or something else bigger than 1), then it might have returned FALSE in that case but still means (FALSE) <= 33 which still returns TRUE since FALSE is 0 and 0 <= 33.

Basically, this code line always returns TRUE and I can't see how it does the trick, therefore, I removed the marked solution from that post.

Even you meant the following with "And" (ignoring the unnecessary first comparison in the code line):

However, it is still not obvious how this solves the question.

Perhaps this could be an explanation (with "And" that I posted above): You want to execute the Worksheet_Change procedure only when a cell between Row 1 and Row 33 is changed, but then other sub-routines must not be changing any cell value in that range. You should also keep in mind that if other subs are changing too many cells (5000?), then even if the changed cells are not in that range, each of them will still hit the Worksheet_Change event to execute that conditional line that will slow down your code.

@davesexcel's solution on the other hand, (Application.EnableEvents), looks like a good suggestion that could be implemented in order to solve the original question by setting the Application.EnableEvents property False at the beginning and set it back to True at the end of the procedure.

Basically, it could be something like this.

VBA Code:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Row > 10 And Target.Row <= 15 Then
    ' call a sub routine
ElseIf Target.Row > 15 And Target.Row <= 30 Then
    ' call another sub routine
End If
Application.EnableEvents = True
End Sub

So, if you could explain your exact solution that solves the problem, then it is perfectly fine to mark your post as the solution as it will also help future readers. Otherwise (and if the Application.EnableEvents solution that daveexcel suggested doesn't help to solve the problem for some reason, even with the possible implementation I posted above), please do not mark a post that doesn't include a solution.

Trong file em gửi, mong các thành viên giúp đỡ về sự kiện Worksheet_Change ở Sheet "XUAT" làm sao khi em copy dữ liệu khoảng 8000 dòng vào mà không báo lỗi và vẫn chạy kết quả sang các cột bên cạnh chứ không cẩn phải enter từng dòng một.

Vì file là kết quả của em tự mày mò trên diễn đàn nên trình độ VBA của em không có căn bản. Em mong sự hướng dẫn nhiệt tình của các thành viên GPE.

http://up.4share.vn/f/5261656760646762/NXT2015.xlsm

xoá bớt dữ liệu đi úp lên GPe mình coi xem.. nếu được mình làm cho

  • 3

    Chào cả nhà GPE đầu năm mới an lành hạnh phúc!

Trong file em gửi, mong các thành viên giúp đỡ về sự kiện Worksheet_Change ở Sheet "XUAT" làm sao khi em copy dữ liệu khoảng 8000 dòng vào mà không báo lỗi và vẫn chạy kết quả sang các cột bên cạnh chứ không cẩn phải enter từng dòng một.

Vì file là kết quả của em tự mày mò trên diễn đàn nên trình độ VBA của em không có căn bản. Em mong sự hướng dẫn nhiệt tình của các thành viên GPE.

http://up.4share.vn/f/5261656760646762/NXT2015.xlsm

bạn thêm vào chổ này nhé

PHP:

 On Error Resume Next
If Not Intersect(Target, [H1].Resize(SoDg)) Is Nothing Then
    GPE

Còn copy vào mà nó update thì hình như phải dùng Worksheet_Selection , con worksheet_Change thì phải thao tác trực tiếp nó mới update.

Mình chỉ biết có vậy, cùng nhau ngâm cứu nha.

  • 4

Option Explicit Const SoDg As Integer = 9999 Dim Sh As Worksheet, Rng As Range Private Sub Worksheet_Change(ByVal Target As Range) Dim sRng As Range: Dim j As Byte

If Not Intersect(Target, [H1].Resize(SoDg)) Is Nothing Then GPE Set sRng = Rng.Find(Target.Offset(, -4).Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then For j = 2 To 198 Target.Offset(, j - 1).Value = Target.Value * sRng.Offset(, j).Value * (1 + 0.01 * sRng.Offset(1, j).Value) Next j End If ElseIf Not Intersect(Target, [C2].Resize(SoDg)) Is Nothing Then GPE Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then Target.Offset(, 1).Value = sRng.Offset(, 1).Value End If End Sub Sub GPE() Set Sh = ThisWorkbook.Worksheets("TABLE") Set Rng = Sh.Range(Sh.[B5], Sh.[B65536].End(xlUp)) End Sub

Em gửi đoạn code VBA trong Sheet " XUAT" cho những ai ghé ngang Topic dễ đọc và cho em nhận xét nhanh hơn. Em cám ơn nhiều.

Em mong các thành viên cho GPE giúp em cho tính năng Worksheet_change tự động cập nhật và chạy dữ liệu ra kết quả sang các cột bên cạnh, khi mình copy dữ liệu sang cột " Số lượng" .

Chân thành cám ơn. File em đã đính kèm trong link bên trên rồi đó mấy bạn.

  • 5

https://www.mediafire.com/?i5sh7nt4on5og15

Mình gửi lại link Mediafire cho mấy bạn dễ download hơn.

Trong link mình đã cố gắng thu gọn lại dữ liệu hết mức rồi anh "kieu manh" ơi. Em mới thử nghiệm với khoảng 40 dòng thôi ah, chứ không phải 8000 dòng. Nên anh có thể down file về giúp giùm em sớm ạ.

Em chân thành cám ơn.

  • 6

Em có tham khảo các bài viết trên diễn đàn, nhưng sao em không biết chỉnh code cho Worksheet_change không bị lỗi khi copy và chạy ra kết quả bình thường. Mong mọi người giúp đỡ!!

Em thấy có một bài của thầy ndu96081631 cũng viết bằng tính năng Worksheet_change nhưng copy bình thường và ko báo lỗi. Nhưng em ko biết chỉnh code làm sao cho phù hợp với mình. Tiện đây em xin gửi lại bài viết của ndu96081631 cho mọi người ghé ngang so sánh code của thầy và trong file của em

http://www.giaiphapexcel.com/forum/...ết-dùng-mã-vba-thay-thế-cho-hàm-vlookup/page4

  • 7

    Em có tham khảo các bài viết trên diễn đàn, nhưng sao em không biết chỉnh code cho Worksheet_change không bị lỗi khi copy và chạy ra kết quả bình thường. Mong mọi người giúp đỡ!!

Em thấy có một bài của thầy ndu96081631 cũng viết bằng tính năng Worksheet_change nhưng copy bình thường và ko báo lỗi. Nhưng em ko biết chỉnh code làm sao cho phù hợp với mình. Tiện đây em xin gửi lại bài viết của ndu96081631 cho mọi người ghé ngang so sánh code của thầy và trong file của em

http://www.giaiphapexcel.com/forum/...ết-dùng-mã-vba-thay-thế-cho-hàm-vlookup/page4

Mình đã trả lời cho bạn rồi còn gì nữa. Thêm cái này code

Cụ thể vào chổ này:

PHP:

 On Error Resume Next
If Not Intersect(Target, [H1].Resize(SoDg)) Is Nothing Then
    GPE

Khi copy dữ liệu vào, khi phát sinh lỗi thì code sẽ reset lại, cứ thế copy thoải mái. Không được thì bạn thử thêm cách này nhé.

PHP:

Private Sub Worksheet_Change(ByVal Target As Range)
'Dim ........
On Error Resume Next
Application.EnableEvents = False
' Code cua ban
Application.EnableEvents = True
End Sub

  • 8

Thanks a NQ_AT, em đã thử cách của anh hướng dẫn và thành công về việc copy ko bị lỗi. Nhưng còn vấn đề để nó chạy ra kết quả số liệu thì nó chưa làm được anh ơi.

Như vậy, em cũng phải enter cho từng dòng một để nó chạy kết quả, mà dữ liệu em sẽ copy vào khoảng 8000 dòng, nên em hỏi có cách khắc phục này luôn ko anh???

  • 9

    Thanks a NQ_AT, em đã thử cách của anh hướng dẫn và thành công về việc copy ko bị lỗi. Nhưng còn vấn đề để nó chạy ra kết quả số liệu thì nó chưa làm được anh ơi.
Như vậy, em cũng phải enter cho từng dòng một để nó chạy kết quả, mà dữ liệu em sẽ copy vào khoảng 8000 dòng, nên em hỏi có cách khắc phục này luôn ko anh???

Cái này mình botay, biết chút ít VBA thôi, phải nhờ các anh Cao thủ GPE trợ giúp vậy.

Private sub worksheet_change byval target as range là gì

dhn46

Hướng tới tương lai
  • 10

Bạn dùng sự kiện Worksheet_Change(ByVal Target As Range) thì sẽ gặp lỗi khi copy paste là điều tất nhiên thôi.

Nếu bạn viết được Code này thì bạn có thể chuyển nó thành dạng Sub và gán vào nút lệnh để tính toán. 1 lần bấm chắc cũng không mất quá nhiêu thời gian.

Private sub worksheet_change byval target as range là gì

  • 11

    Bạn dùng sự kiện Worksheet_Change(ByVal Target As Range) thì sẽ gặp lỗi khi copy paste là điều tất nhiên thôi.

Không hẳn vậy đâu! Nên nhớ rằng Target không phải luôn là 1 Cell. Vậy nên để làm việc với sự kiện Worksheet_Change khi Target = nhiều cells, ta sẽ dùng For... Next để giải quyết Vụ này tôi làm hoài trên GPE rồi, cú pháp chung mà tôi hay dùng là vầy:

Mã:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim [B][COLOR=
# 0000cd]cel[/COLOR][/B] As Range, rng As Range
  If Not Intersect(Range("Gì gì đó"), Target) Is Nothing Then
    Set rng = Intersect(Range("Gì gì đó"), Target)
    For Each [B][COLOR=
# 0000cd]cel[/COLOR][/B] In rng
      ''Code xử lý tại đây, tham chiếu đến biến [B][COLOR=
# 0000cd]cel[/COLOR][/B] (chứ không tham chiếu đến Target)
    Next
  End If
End Sub

Lần chỉnh sửa cuối: 9/1/15

  • 12

Thầy ndu96081631 ơi, thầy chỉnh code phía trên giùm em được ko?? Em đã thử cú pháp thầy hướng dẫn rồi, nhưng em làm nó ko chạy được thầy ơi!! Em không có căn bản, chỉ là em lượm lặt code VBA tham khảo trên diễn đàn GPE rồi chế lại theo ý em thôi. Nên gặp sự cố em ko biết chỉnh cho bài bản.

Thầy chỉnh lại code trong sheet" XUAT" giùm em nha, em đã cố hết sức ở bài hướng dẫn của thầy nhưng em thực sự ko làm nỗi. Mong thầy giúp đỡ em. Chân thành cám ơn

  • 13

Em đã thử viết theo cú pháp của thầy như sau, nhưng em ko làm nó chạy được thầy ơi. Em cố gắng viết lại như sau:

Option Explicit Const SoDg As Integer = 9999 Dim Sh As Worksheet, rng As Range Private Sub Worksheet_Change(ByVal Target As Range) Dim cel As Range, rng As Range Dim sRng As Range: Dim j As Byte

If Not Intersect(Range([H1:H65536]), Target) Is Nothing Then Set rng = Intersect(Range([H1:H65536]), Target) For Each cel In rng If Not Intersect(cel, [H1].Resize(SoDg)) Is Nothing Then GPE Set sRng = rng.Find(cel.Offset(, -4).Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then For j = 2 To 208 cel.Offset(, j - 1).Value = cel.Value * sRng.Offset(, j).Value * (1 + 0.01 * sRng.Offset(1, j).Value) Next j

ElseIf Not Intersect(cel, [C2].Resize(SoDg)) Is Nothing Then GPE Set sRng = rng.Find(cel.Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then cel.Offset(, 1).Value = sRng.Offset(, 1).Value End If Next

End If

End Sub

Sub GPE() Set Sh = ThisWorkbook.Worksheets("TABLE") Set rng = Sh.Range(Sh.[B5], Sh.[B65536].End(xlUp)) End Sub

Mong thầy chỉ giúp em sai chỗ nào và sửa code giùm em với. Mong sự hướng dẫn của thầy và các thành viên trên GPE !! Chân thành cám ơn mọi người.

  • 14

Các member GPE, ai ghé ngang Topic giúp em chỉnh code phía trên với. Mong các anh chị hỗ trợ để em hoàn thành file Nhập - Xuất - Tồn phía trên. Đó là sản phẩm đầu tay của em trong suốt 02 tháng cày diễn đàn GPE này. keke

Chân thành cám ơn mấy anh chị

  • 15

    Các member GPE, ai ghé ngang Topic giúp em chỉnh code phía trên với. Mong các anh chị hỗ trợ để em hoàn thành file Nhập - Xuất - Tồn phía trên. Đó là sản phẩm đầu tay của em trong suốt 02 tháng cày diễn đàn GPE này. keke
Chân thành cám ơn mấy anh chị

Bạn tham khảo bài này xem sao nha, bài này dùng Array, mình thấy sẽ tự update khi worksheet_change

http://www.giaiphapexcel.com/forum/...Xin-viết-dùng-mã-vba-thay-thế-cho-hàm-vlookup

  • 16

Anh NQ_AT, cho e hỏi cái bài anh gửi dùng Array thì áp dụng về code của file em khi nhân hệ số tiêu hao như thế nào vậy anh, thật ra em chưa rành VBA, chỉ là học lóm trên GPE thôi, nên anh chỉ giúp em.

Cụ thể là đoạn code này viết lại sao anh:

Set sRng = Rng.Find(Target.Offset(, -4).Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then For j = 2 To 208 Target.Offset(, j - 1).Value = Target.Value * sRng.Offset(, j).Value * (1 + 0.01 * sRng.Offset(1, j).Value) Next j End IfChân thành cám ơn anh giúp đỡ !!

  • 17

    Anh NQ_AT, cho e hỏi cái bài anh gửi dùng Array thì áp dụng về code của file em khi nhân hệ số tiêu hao như thế nào vậy anh, thật ra em chưa rành VBA, chỉ là học lóm trên GPE thôi, nên anh chỉ giúp em.

Cụ thể là đoạn code này viết lại sao anh:

Set sRng = Rng.Find(Target.Offset(, -4).Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then For j = 2 To 208 Target.Offset(, j - 1).Value = Target.Value * sRng.Offset(, j).Value * (1 + 0.01 * sRng.Offset(1, j).Value) Next j End IfChân thành cám ơn anh giúp đỡ !!

hihih, cái đó botay, mình cũng đang mò kim đấy bể nè, đâu hơn gì bạn, chỉ biết nó lấy thông tin như Vlookup, còn kết hợp với tính toán thì thua.

  • 18

Mong các thành viên GPE ghé ngang Topic chỉnh code giùm mình !!!

Chân thành cám ơn !!

  • 19

Chân thành mong sự giúp đỡ của các thành viên GPE hỗ trợ giùm mình để mình và anh NQ_AT có thể học hỏi nhiều hơn về code trong tính năng Worksheet_Change!!