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

Liên hệ QC

ohay102

Thành viên mới
Tham gia
13/10/06
Bài viết
15
Được thích
1
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ũ https://www.giaiphapexcel.com/diendan/threads/tự-động-chạy-macro-khi-thay-đổi-giá-trị-cell.7019/
PHP:
Private Sub Worksheet_Calculate()
    'Call SubXYZ
End Sub

.
 
Upvote 0
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ũ https://www.giaiphapexcel.com/diendan/threads/tự-động-chạy-macro-khi-thay-đổi-giá-trị-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.
 
Upvote 0
PHP:
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 đó:
Mã:
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.
 
Upvote 0
Đ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 thay đổi, thế thì 1 trong 2 ô A1 và A2 là nhân tố có thể thay đổi, vậy thì sự kiện thay đổi vì lấy E3 làm Target, thì lấy 2 ô kia tham chiếu Mục tiêu.
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
 
Lần chỉnh sửa cuối:
Upvote 0
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ài đã được tự động gộp:

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?
1636606041243.png
 
Lần chỉnh sửa cuối:
Upvote 0
Thế bạn muốn chạy sự kiện trên ô nào của sheet nào vậy?
Bài đã được tự động gộp:

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?
View attachment 269006
mình đã làm nhưng nó báo lỗi " run-time error'1004 mình không chuyên nên không biết xử lý nhờ bạn chỉ nốt
 

File đính kèm

  • 20211111_134814.jpg
    20211111_134814.jpg
    100.4 KB · Đọc: 19
Upvote 0
1636615072461.png

Trước dòng này thêm dòng

Sheet3.select
 
Upvote 0
Ý mình là macro tự chạy chứ không phải nhấp vào ô 2 vùng gọi lệnh ẩn hay hiện anh ạ
Bạn nói mục đích của bạn rõ hơn đi. Dùng spinbutton để làm gì? Tại sao không dùng sự kiện của nó? Dụng ý của ẩn hiện hàng là gì? Phải chăng khi công thức cho kết quả thì hiện dòng, còn những công thức không kết quả thì ẩn dòng?
 
Upvote 0
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
 

File đính kèm

  • callsub.xlsm
    36.8 KB · Đọc: 4
Upvote 0
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.

1636641870829.png
 
Lần chỉnh sửa cuối:
Upvote 0
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:
Mã:
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:
Mã:
Sub SpinChange()
    Call AnHienDongHD2
End Sub
4) Sửa lại thủ tục AnHienDongHD2 cho bớt rườm rà:
Mã:
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é.
 

File đính kèm

  • callsub.xlsm
    37.4 KB · Đọc: 15
Upvote 0
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 đó:
Mã:
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.
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 ạ
 
Upvote 0
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.
 
Upvote 0
Web KT

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

Back
Top Bottom