Nhờ giúp đỡ – Tự động chay macro khi giá trị trong Ô ( có công thức) thay đổi

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Xin được phép mở lại chủ đề nhờ mọi người giúp đỡ vì trước đó cũng có chủ đề tương tự nhưng không giải quyết được vấn đề
Tự động chạy macro khi thay đổi Ô giá trị – nhưng do ô là công thức không thay đổi, không được gọi là macro như vậy nhờ các bác chỉ giúp.
topic cũ
www.giaiphapexcel.com/diendan/threads/t%E1%BB%B1-%C4%91%E1%BB%99ng-ch%E1%BA%A1y-macro-khi-thay-%C4%91%E1%BB%95i-gi%C3%A1-tr%E1%BB%8B-cell.7019/

Điều gì làm thay đổi ô chứa công thức vậy bạn? Ví dụ ô chứa công thức là: E3 và công thức của nó là =A1+A2
Vì nó chứa công thức nên nó không chạy sự kiện Change, thế thì 1 trong 2 ô A1 và A2 là nhân tố có thể thay đổi, vậy thì sự kiện Change thay vì lấy E3 làm Target, thì lấy 2 ô tham chiếu kia làm Target.

Private Sub Worksheet_Calculate()
'Call SubXYZ
End Sub

.

Làm như vậy cũng chưa ổn, bởi vì có khi giá trị của sheet này nhưng công thức lại link từ sheet khác, nếu ta không Active sheet này thì sự kiện không được thực hiện, vậy thì ta phải bao quát hơn mà chọn sự kiện trong ThisWorkbook.

Tại Module của ThisWorkbook ta chép các sự kiện này vào trong đó:

Public pubValue

Private Sub Workbook_Activate()
    pubValue = Sheet1.Range("E3").Value
End Sub

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    If pubValue <> Sheet1.Range("E3").Value Then
        MsgBox "Nó kìa!"
        pubValue = Sheet1.Range("E3").Value
    End If
End Sub

Với ô E3 là ô chứa công thức trong Sheet1 nhằm để chạy sự kiện.

Cảm ơn bạn đã quan tâm, vd ô E3 của minh là điều kiện liên kết công thức từ các sheet khác hoặc mình làm nó thay đổi khi dung spin button

Tôi đã viết tổng quát cho bạn tại bài số #4. Bạn kiểm tra đi.

cảm ơn anh, tôi đã làm theo nhưng không được, có tập tin đang làm nhờ anh xem giúp

Thế bạn muốn chạy sự kiện trên ô nào của sheet nào vậy? Bạn không đọc kỹ bài #4 và tôi kêu bạn làm gì bạn không làm theo, tôi ghi 2 sự kiện và một biến Public bạn cũng không copy đầy đủ, bảo sao nó không chạy?

www.giaiphapexcel.com/diendan/threads/nh%E1%BB%9D-gi%C3%BAp-%C4%91%E1%BB%A1-t%E1%BB%B1-%C4%91%E1%BB%99ng-chay-macro-khi-gi%C3%A1-tr%E1%BB%8B-trong-%C3%94-c%C3%B3-c%C3%B4ng-th%E1%BB%A9c-thay-%C4%91%E1%BB%95i.158434/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 2 ▥ 0
Quảng cáo

Bạn nên đọc

2 Responses

  1. hands says:

    rất cảm ơn anh đã quan tâm, mục đích của tôi là muốn tạo file in hàng loạt và có 1 sheet có macro muốn ẩn hiện một số dòng theo điều kiện , sô dòng đó nằm ở ô T4 sheet3 , mà ô T4 lại là công thức (vlookup) phụ thuộc sheet khác, nên khi tự động nó không gọi maro chạy tự động ẩn hiện dòng được. vậy tôi gửi file nhờ anh xem giúp

    Tôi vẫn không hiểu, Maximum số hàng có 44, nghĩa là thêm 29 hàng là giới hạn tối đa, nhưng bạn cho max của nó là 35???
    Bạn không cần phải dùng VLOOKUP để tham chiếu, bạn chỉ cần cài đặt trên SpinButton là OK. Hãy xem hình:

    Đầu tiên bạn click trái vào Spin, sau đó chọn vào Format Control:

    – Giá trị nhỏ nhất: 5
    – Giá trị lớn nhất: 35
    – Bước nhảy số: 5

    Như vậy tại ô T4 của sheet chay, công thức chỉ là =danhmuc!A1
    Nếu giới hạn 29 dòng là max, thì công thức tại ô T4 sẽ như sau: =IF(danhmuc!A1>29,29,danhmuc!A1)
    Nếu không làm như vậy thì bạn phải insert hàng tới dòng 50 chứ không phải là 44 dòng chứa công thức.1091
    Thôi để tôi làm luôn cho bạn để đỡ mất thời gian:
    1) Công thức tại ô O17 phải bẫy lỗi: =IFERROR(IF(O16+1>$T$4,"",O16+1),"")
    2) Tạo sự kiện cho sheet1 (danhmuc), khi ô A1 thay đổi (bằng cách gõ vào) thì sự kiện Change hoạt động:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "$A$1" Then
            Call AnHienDongHD2
        End If
    End Sub

    3) Gán macro cho SpinButton để khi sử dụng nó sẽ chạy macro:

    Sub SpinChange()
        Call AnHienDongHD2
    End Sub

    4) Sửa lại thủ tục AnHienDongHD2 cho bớt rườm rà:

    Sub AnHienDongHD2()
        Dim bytCount As Byte, bytFirstRow As Byte
        On Error Resume Next
        With Sheet3
            .Rows("16:44").Hidden = False
            bytCount = .Range("T4").Value
            If bytCount < 29 Then
                bytFirstRow = bytCount + 15
                .Rows(bytFirstRow & ":44").Hidden = True
            End If
        End With
    End Sub

    Giờ thì hãy xem file nhé.

  2. hands says:

    nếu trong ô E3 là một công thức thời gian ( cụ thể là tháng) tự thay đổi, thì khi nội dung trong E3 thay đổi thì có chạy được macro không ạ

    Sự kiện change chỉ thay đổi khi ta tác động vào ô đó bằng cách active ô đó, nếu thay đổi khi ô được active thì nó mới chạy được sự kiện.

    Bác sử dụng API SetTimer trong hàm UDF gọi một hàm gọi lại sử dụng hàm lấy địa chỉ Addressof

    Mã nguồn bác tham khảo tại bài này do tôi vừa đăng:
    http://www.giaiphapexcel.com/diendan/threads/163649/

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm