Hỏi thay đổi giá trị của 1 ô (trong 1 vùng dữ liệu )

Liên hệ QC

AlanEvol

Thành viên mới
Tham gia
19/8/21
Bài viết
23
Được thích
3
Chào mọi người, em có 1 vùng dữ liệu vừa xác định vừa không xác định.
Vùng này xác định bằng Current.Region của 1 ô cố định trong sheet.
Nhưng không xác định vì vùng này thường xuyên bị thêm bớt nhưng liền kề các ô trước. (nên dùng Current.Region để xác định vùng này từ 1 ô cố định)
Em thưc hiện câu lệnh khi thay đổi 1 ô trong vùng này thì sẽ thực hiện 1 vba hiện hình biểu thị cho vùng này đã thay đổi, và ngược lại.
Câu lệnh em như sau:
Private Sub worksheet_change(ByVal target As Range)
If Not Application.Intersect(Range("F7").CurrentRegion, Range(target.Address)) Is Nothing Then
Shapes("UpOn").Visible = msoTrue
Shapes("UpOff").Visible = msoFalse
Else
Shapes("UpOn").Visible = msoFalse
Shapes("UpOff").Visible = msoTrue
End If
End sub
Mọi thứ đều ổn nhưng xảy ra 1 trường hợp là. Khi em xoá 1 ô trong vùng thì nó ko xác định rằng dữ liệu trong vùng này đã thay đổi.
Mong mọi người giúp em fix trường hợp này ạ (khi em xoá 1 ô trong vùng thì hình biểu thị vùng này đã thay đổi hiện).
 
Code này được hiểu nếu sự thay đổi nào đó trên sheet mà tại ô F7 có dữ liệu (không có ô trống) với một ô liền kề (kể cả là khối ô liền kề với F7) đều có dữ liệu thì nó sẽ xảy ra sự kiện này (TH1):

Shapes("UpOn").Visible = msoTrue
Shapes("UpOff").Visible = msoFalse

Còn ngược lại nó chỉ xảy ra sự kiện này (TH2):

Shapes("UpOn").Visible = msoFalse
Shapes("UpOff").Visible = msoTrue

Nói nôm na như vầy cho bạn dễ hiểu, hãy nhìn hình:

1629376465270.png

Ô màu đỏ là ô F7 nếu 2 cột màu vàng đều có dữ liệu, thì dù bạn có nhập vào vùng màu xanh hay xóa nó vẫn xảy ra TH1 còn bạn làm gì đó ngoài vùng này thì nó xảy ra TH2.
 
Lần chỉnh sửa cuối:
Upvote 0
Code này được hiểu nếu sự thay đổi nào đó trên sheet mà tại ô F7 có dữ liệu (không có ô trống) với một ô liền kề (kể cả là khối ô liền kề với F7) đều có dữ liệu thì nó sẽ xảy ra sự kiện này (TH1):

Shapes("UpOn").Visible = msoTrue
Shapes("UpOff").Visible = msoFalse

Còn ngược lại nó chỉ xảy ra sự kiện này (TH2):

Shapes("UpOn").Visible = msoFalse
Shapes("UpOff").Visible = msoTrue

Nói nôm na như vầy cho bạn dễ hiểu, hãy nhìn hình:

View attachment 264361

Ô màu đỏ là ô F7 nếu 2 cột màu vàng đều có dữ liệu, thì dù bạn có nhập vào vùng màu xanh hay xóa nó vẫn xảy ra TH1 còn bạn làm gì đó ngoài vùng này thì nó xảy ra TH2.
Vậy làm sao để khi em thêm 1 ô trong vùng rồi. Rồi sau đó em xoá thì Visible=true vậy ạ
 
Upvote 0
Vậy làm sao để khi em thêm 1 ô trong vùng rồi. Rồi sau đó em xoá thì Visible=true vậy ạ
Bạn cần xác định vùng trước, ví dụ cột F hay F7:F20 hoặc F7:O15 ... thì tôi sẽ hướng dẫn cho bạn, khi nhập nó True, khi xóa nó False.
 
Upvote 0
Bạn cần xác định vùng trước, ví dụ cột F hay F7:F20 hoặc F7:O15 ... thì tôi sẽ hướng dẫn cho bạn, khi nhập nó True, khi xóa nó False.
Dạ tại vùng này của em nó không xác định đó ạ nó được thêm bớt liên tục. em xác định bằng cách dùng Current.Region của 1 ô ạ
 
Upvote 0
Dạ tại vùng này của em nó không xác định đó ạ nó được thêm bớt liên tục. em xác định bằng cách dùng Current.Region của 1 ô ạ
Dữ liệu thế nào là không xác định được? Ví dụ hàng tính từ hàng 7 trở đi, cột thì tính từ cột F trở đi, sao lại có thể không xác định được nhỉ?
 
Upvote 0
Dạ em có 1 vùng dữ liệu. Ý tưởng em là mỗi khi em cập nhật vùng dữ liệu này thì nó hiện ra cái hình biểu thị cho dữ liệu đã dc sữa (và sau đó update vùng này sang sheet khác). Nên là nó ko xác định cụ thể được. VD hiện tại nó đang là F7:G23. Nhưng sau đó ngta nhập thêm 1 dòng xuống thì nó thành F7:G24. hoặc ngta xoá đi 1 dòng là F7:G:22. Nên vùng này nó ko có cho trước được. Em phải dùng lệnh Range("F7").CurrentRegion để khoanh những dữ liệu gần khu vực đó ạ
 
Upvote 0
Dạ em có 1 vùng dữ liệu. Ý tưởng em là mỗi khi em cập nhật vùng dữ liệu này thì nó hiện ra cái hình biểu thị cho dữ liệu đã dc sữa (và sau đó update vùng này sang sheet khác). Nên là nó ko xác định cụ thể được. VD hiện tại nó đang là F7:G23. Nhưng sau đó ngta nhập thêm 1 dòng xuống thì nó thành F7:G24. hoặc ngta xoá đi 1 dòng là F7:G:22. Nên vùng này nó ko có cho trước được. Em phải dùng lệnh Range("F7").CurrentRegion để khoanh những dữ liệu gần khu vực đó ạ
Bạn làm thế không được đâu, vùng xác định của bạn là cột F đến cột G và hàng từ hàng 7 trở đi mới là đúng.
Xóa cũng là thay đổi, Ghi cũng là một thay đổi, bạn muốn sao đây? Nếu F23:G23 một ghi một xóa thì sao (ô F23 xóa, ô G23 ghi)?
 
Upvote 0
Bạn làm thế không được đâu, vùng xác định của bạn là cột F đến cột G và hàng từ hàng 7 trở đi mới là đúng.
Xóa cũng là thay đổi, Ghi cũng là một thay đổi, bạn muốn sao đây? Nếu F23:G23 một ghi một xóa thì sao (ô F23 xóa, ô G23 ghi)?
Dạ nếu như em để từ hàng 7 trở đi thì câu lệnh em đúng. Khó cho em là cái vùng đó nó không xác định ạ. Em dùng lệnh CurrentRegion(F7) để xác định vùng. Vì phải thêm liền kề thí nó mới tính là trong vùng em cần, còn thêm cách khoảng thì không tính ạ VD như sau
 

File đính kèm

  • photo_2021-08-19_20-18-50.jpg
    photo_2021-08-19_20-18-50.jpg
    45 KB · Đọc: 4
  • photo_2021-08-19_20-20-22.jpg
    photo_2021-08-19_20-20-22.jpg
    45.6 KB · Đọc: 3
Upvote 0
Dạ nếu như em để từ hàng 7 trở đi thì câu lệnh em đúng. Khó cho em là cái vùng đó nó không xác định ạ. Em dùng lệnh CurrentRegion(F7) để xác định vùng. Vì phải thêm liền kề thí nó mới tính là trong vùng em cần, còn thêm cách khoảng thì không tính ạ VD như sau
Cái nhược điểm của CurrentRegion là những ô có liên quan nó đều tính hết, nếu cột I được nhập cạnh bên nó cũng xác định luôn. Để tôi làm cho bạn sự kiện này, để bạn dễ dàng dùng hơn. Chờ tôi tạo file đã, không có file tôi không biết làm sao, hoặc bạn gửi cái file đó lên đi, đừng gửi hình.
 
Upvote 0
Cái nhược điểm của CurrentRegion là những ô có liên quan nó đều tính hết, nếu cột I được nhập cạnh bên nó cũng xác định luôn. Để tôi làm cho bạn sự kiện này, để bạn dễ dàng dùng hơn. Chờ tôi tạo file đã, không có file tôi không biết làm sao, hoặc bạn gửi cái file đó lên đi, đừng gửi hình.
Dạ đây ạ mong anh xem giúp em
 

File đính kèm

  • VBA .xlsm
    22 KB · Đọc: 2
Upvote 0
Dạ đây ạ mong anh xem giúp em
Hỏi cho rõ để làm cho bạn một lần chứ không lại phát sinh dây dưa:

1629380446689.png

1) Nếu như hàng 9 bị người nào đó xóa thì sự kiện gì xảy ra?
2) Nếu hàng 19 ô xanh thêm vào mà ô đỏ bỏ trống thì sự kiện gì xảy ra?
 
Upvote 0
Hỏi cho rõ để làm cho bạn một lần chứ không lại phát sinh dây dưa:

View attachment 264370

1) Nếu như hàng 9 bị người nào đó xóa thì sự kiện gì xảy ra?
2) Nếu hàng 19 ô xanh thêm vào mà ô đỏ bỏ trống thì sự kiện gì xảy ra?
Dạ em có quy ước là nếu xoá ô 9 thì người sửa phải tự lùi lên ạ. Người thay đổi bảng này phải có trách nhiệm đóng khung lại thành 1 khối ô ạ. VDd họ thêm vào ô 19 thì họ phải format lại theo dịch dạng như ô 1 2 để thành 1 bảng. CÒn nếu họ xoá ô 9 thì họ phải dịch lên và tự format lại cho thành 1 bảng ạ.
 
Upvote 0
Dạ em có quy ước là nếu xoá ô 9 thì người sửa phải tự lùi lên ạ. Người thay đổi bảng này phải có trách nhiệm đóng khung lại thành 1 khối ô ạ. VDd họ thêm vào ô 19 thì họ phải format lại theo dịch dạng như ô 1 2 để thành 1 bảng. CÒn nếu họ xoá ô 9 thì họ phải dịch lên và tự format lại cho thành 1 bảng ạ.
Trùi ui, tôi đang nói cái vụ hiện và ẩn, nếu xóa hàng 9 nó hiện hay ẩn, nếu thêm ô xanh mà không thêm ô đỏ nó hiện hay ẩn!
 
Upvote 0
Loại bài này phải được đưa vô ngăn 'Lập trình. . .'
 
Upvote 0
Trùi ui, tôi đang nói cái vụ hiện và ẩn, nếu xóa hàng 9 nó hiện hay ẩn, nếu thêm ô xanh mà không thêm ô đỏ nó hiện hay ẩn!
Dạ xoá hàng 9 nó hiện ạ. Nếu thêm ô xanh mà ko thêm ô đỏ vẫn hiện ạ. Thêm hay xoá 1 ô bất kỳ trong vùng đó đều hiện ạ
Bài đã được tự động gộp:

Loại bài này phải được đưa vô ngăn 'Lập trình. . .'
Dạ lần sau em sẽ sửa sai.
 
Upvote 0
Dạ xoá hàng 9 nó hiện ạ. Nếu thêm ô xanh mà ko thêm ô đỏ vẫn hiện ạ. Thêm hay xoá 1 ô bất kỳ trong vùng đó đều hiện ạ
Bài đã được tự động gộp:


Dạ lần sau em sẽ sửa sai.
Tôi đã chuyển topic này vô box Lập trình rồi, an tâm.

Bạn thử với code dưới đây:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Row > 3 And Target.Column < 3 Then
        If Target.Offset(-1).Value > "" Then
            Shapes("UpOn").Visible = msoTrue
            Shapes("UpOff").Visible = msoFalse
        Else
            Shapes("UpOn").Visible = msoFalse
            Shapes("UpOff").Visible = msoTrue
        End If
    End If
End Sub
 

File đính kèm

  • VBA .xlsm
    27.5 KB · Đọc: 2
Upvote 0
Tôi đã chuyển topic này vô box Lập trình rồi, an tâm.

Bạn thử với code dưới đây:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Row > 3 And Target.Column < 3 Then
        If Target.Offset(-1).Value > "" Then
            Shapes("UpOn").Visible = msoTrue
            Shapes("UpOff").Visible = msoFalse
        Else
            Shapes("UpOn").Visible = msoFalse
            Shapes("UpOff").Visible = msoTrue
        End If
    End If
End Sub
Dạ bác ơi em thử được rồi ạ. Nhưng file em là nó bắt đầu từ ô F7 ạ. Mong bác chỉnh mã sang cho phù hợp Ô Technical ở F7 giúp em với. Sẵn giải thích cho em ý nghĩa câu lệnh với ạ.
 
Upvote 0
Dạ bác ơi em thử được rồi ạ. Nhưng file em là nó bắt đầu từ ô F7 ạ. Mong bác chỉnh mã sang cho phù hợp Ô Technical ở F7 giúp em với. Sẵn giải thích cho em ý nghĩa câu lệnh với ạ.

Bạn xem nhé, có đúng ý bạn chưa.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next ''Bo qua loi (trong truong hop nay neu chon nhieu ô de xoa se bi loi)
    
    ''Target la vi tri o dang duoc chon
    
    ''Neu ô có hàng lon hon 6 (tuc la tu hàng 7 tro di) và so cot la 6 hoac 7 (cot F và G) thi thuc hien:
    If Target.Row > 6 And (Target.Column = 6 Or Target.Column = 7) Then
        ''Neu ô lien ke o tren có du lieu thì thuc hien:
        If Target.Offset(-1).Value > "" Then
            Shapes("UpOn").Visible = msoTrue
            Shapes("UpOff").Visible = msoFalse
        Else
            Shapes("UpOn").Visible = msoFalse
            Shapes("UpOff").Visible = msoTrue
        End If
    End If
End Sub
 

File đính kèm

  • VBA-HTN.xlsm
    27.9 KB · Đọc: 2
Upvote 0
Bạn xem nhé, có đúng ý bạn chưa.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next ''Bo qua loi (trong truong hop nay neu chon nhieu ô de xoa se bi loi)
   
    ''Target la vi tri o dang duoc chon
   
    ''Neu ô có hàng lon hon 6 (tuc la tu hàng 7 tro di) và so cot la 6 hoac 7 (cot F và G) thi thuc hien:
    If Target.Row > 6 And (Target.Column = 6 Or Target.Column = 7) Then
        ''Neu ô lien ke o tren có du lieu thì thuc hien:
        If Target.Offset(-1).Value > "" Then
            Shapes("UpOn").Visible = msoTrue
            Shapes("UpOff").Visible = msoFalse
        Else
            Shapes("UpOn").Visible = msoFalse
            Shapes("UpOff").Visible = msoTrue
        End If
    End If
End Sub
Dạ vâng ạ. Em đã thử và đã thành công. Em chân thành cảm ơn
 
Upvote 0
Web KT

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

Back
Top Bottom