Hàm đổi text thàng công thức này không auto

Liên hệ QC

hoangexcell

Thành viên tiêu biểu
Tham gia
8/1/08
Bài viết
459
Được thích
132
Donate (Momo)
Donate
Giới tính
Nam
Hi cả nhà,

Mình mới tìm thấy hàm này dùng đúng ý muốn, nhưng lạ là nó không auto tính toán lại, phải kích hoạt lại nó mới tính. Workbook đang để chế độ auto.

Mã:
Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function
Xin ai biết giải thích và nếu có thể khắc phục cho auto được thì mình càng thích. Nếu không thì mình không dùng được. Xin cảm ơn cả nhà!
 
Hi cả nhà,

Mình mới tìm thấy hàm này dùng đúng ý muốn, nhưng lạ là nó không auto tính toán lại, phải kích hoạt lại nó mới tính. Workbook đang để chế độ auto.

Mã:
Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function
Xin ai biết giải thích và nếu có thể khắc phục cho auto được thì mình càng thích. Nếu không thì mình không dùng được. Xin cảm ơn cả nhà!
Ô tô hay không ô tô thì xem lại chỗ này nha bạn:
1678177833500.png
 
Upvote 0
Hình như là do cái này lâu quá rồi không biết đúng không.Bỏ nó đi hoặc để False
Application.Volatile
Đã thử bỏ thì nó không hiện lỗi, nhưng giá trị thì không cập nhật. Phải kích hoạt đúng ô thay đổi thì mới cập nhật. Nguy hiểm hơn luôn.
Chắc bỏ hàm này quá.
 
Upvote 0
Úp cả file đó lên đây đi bạn.
 
Upvote 0
Hàm tính trên một trị nào đó mắc mớ gì nó cập nhật?
Cập nhật xảy ra khi:
1. Cái tham số nó nhận thay đổi.
2. Nó là volatile và có sự thay đổi nào đó trong sheet.
 
Upvote 0
Nếu UDF đó có các link mà dẫn sang sheet khác thì application. volatile vô hiệu nhé
 
Upvote 0
Nếu UDF đó có các link mà dẫn sang sheet khác thì application. volatile vô hiệu nhé
Ok đây là lời giải đáp. Vậy làm sao để nó auto hay hàm này sẽ không thể auto.
Bài đã được tự động gộp:

Úp cả file đó lên đây đi bạn.
Cập nhật dữ liệu ô a1 ở sheet 2 thì hàm auto cập nhật ở sheet 1.
Nhưng file thực mình làm ko biết có phải nhiều dữ liệu không nó không chạy.
 

File đính kèm

  • vidu.xlsm
    14.6 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Trước hết bạn cần biết Application.volatile là gì trước đã.

Hiểu đơn giản:
Đánh thức "tôi" bất kì tác động nào. Tức là hàm sẽ được gọi khi ô tham chiếu thay đổi giá trị hoặc một tác động vào bất kì ô nào trong trang tính.

Bạn nên xóa Application.volatile đi, vì trong trường hợp này là không cần thiết.


Để ví dụ:
Mã:
Function Eval(Ref As String)
Eval = timer
End Function
Function Eval2(Ref As String)
Application.Volatile
Eval2 = timer
End Function

Bạn hãy gọi hai hàm trên và thử thao tác vào ô trang tính được tham chiếu, sau đó thao tác vào ô bất kì.
Bạn sẽ thấy sự khác biệt khi có và không có cài đặt Application.Volatile

Nếu không cài đặt Application.volatile, thì hàm chỉ được gọi khi ô được tham chiếu thay đổi, thì hàm mới được gọi.
 
Lần chỉnh sửa cuối:
Upvote 0
Trước hết bạn cần biết Application.volatile là gì trước đã.

Hiểu đơn giản:
Đánh thức "tôi" bất kì tác động nào. Tức là hàm sẽ được gọi khi ô tham chiếu thay đổi giá trị hoặc một tác động vào bất kì ô nào trong trang tính.

Bạn nên xóa Application.volatile đi, vì trong trường hợp này là không cần thiết.


Để ví dụ:
Mã:
Function Eval(Ref As String)
Eval = timer
End Function
Function Eval2(Ref As String)
Application.Volatile
Eval2 = timer
End Function

Bạn hãy gọi hai hàm trên và thử thao tác vào ô trang tính được tham chiếu, sau đó thao tác vào ô bất kì.
Bạn sẽ thấy sự khác biệt khi có và không có cài đặt Application.Volatile

Nếu không cài đặt Application.volatile, thì hàm chỉ được gọi khi ô được tham chiếu thay đổi, thì hàm mới được gọi.
Cảm ơn bạn, đã hiểu lệnh đó.
Nhưng quay lại vấn đề chính là cái hàm này không auto được đúng không.

Function Eval(Ref As String)

Eval = Evaluate(Ref)

End Function
 
Upvote 0

hoangexcell


Bạn đã hiểu sai cách phương thức Evaluate tính toán.
Bạn đã tham chiếu sai thì sao tự động tính được.

Sử dụng như sau là không đúng:
=Eval("Sheet2!A1")
Đây không phải là tham chiếu, chỉ là một đối số là chuỗi chỉ định là đối tượng ô A1 ở trang tính Sheet2.
Đây chỉ là một chuỗi phương thức Evaluate có thể tính toán.

Phải là:
=Eval(Sheet2!A1)

Ở Sheet2 ô A1 phải là một giá trị với cú pháp có thể tính toán.
Ví dụ:
=Eval(Sheet2!A1)
Thì ô A1 phải là một biểu thức hoặc một tham chiếu có thể tính toán được:
Sheet2!A1 = "=245+" & Sheet2!A2
Hoặc:
Sheet2!A1 = "=Sheet2!A2"

Không có dấu Bằng (=) , thì phương thức Evaluate cũng tự hiểu là Biểu thức và tính toán.


Trong trường hợp =Eval("Sheet2!A1") bạn cần Application.Volatile tuy nhiên phải cần một hàm Eval gõ tại Sheet2, Eval ở Sheet1 tham chiếu đến ô đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Đó. Có file cái là bắt bệnh chuẫn chị lun và ngay.
Lần sau bạn chủ thớt hỏi gì nhớ gửi file đang làm lên nhé.
 
Upvote 0
Đó. Có file cái là bắt bệnh chuẫn chị lun và ngay.
Lần sau bạn chủ thớt hỏi gì nhớ gửi file đang làm lên nhé.
Bệnh chưa bắt chuẩn.
Bệnh này kiên quan đến bảng tính (Excel) nhiều hơn VBA.
Vì thớt dùng chuỗi hằng (string literal) làm tham số cho hàm nên khi thay đổi trị ở sheet2!a1, hàm vẫn tỉnh bơ. Đối với bảng tính, lúc nạp tham số nó đâu có biết "sheet2!a1" là muốn nói ô a1 ở sheet2. Bên trong hàm Eval, hàm Evaluate mới diễn ra được cái chuỗi "sheet2!a1" là tham chiếu đến 1 ô nào đó.
Muốn bảng tính ô tô xe hơi gì đó thì gói chuỗi trong hàm indirect.

Hình dưới đây cho thấy ô sheet2!a1 đổi từ 333 sang 23+45
Bên sheet1, a1 là =Eval("sheet2!a1"), không nhúc nhích.
a2 là =eval(INDIRECT("sheet2!A1")) đổi thành 68

1678211236261.png

Trên bảng tính, hàm Eval nhận kết quả của hàm indirect, ép kiểu thành string, chứ không phải là chuỗi hằng.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom