Lỗi lạ với Evaluate(Replace(..))

Liên hệ QC

quocturtle

Thành viên chính thức
Tham gia
22/3/12
Bài viết
68
Được thích
3
Chào mọi người
Mình có một function đơn giản như sau:

Mã:
Function func01(str As String, X As Variant)
func01 = Evaluate(Replace(str, "x", X))
End Function

Cơ bản thì hàm này dùng như sau: ví dụ mình có hàm f(x) = ln(x) + x^2. Mình muốn tính f(x) với x = 2 chẳng hạng thì mình có 2 cách
Cách 1: =Ln(A1) + A1^2. Với A1=2 <-- Cái này ko có gì đáng nói
Cách 2: dùng hàm mình viết func01. Mình nhập là =func01("ln(x)+x^2",A1) trong đó A1=2. Hàm func01 sẽ thay thế các giá trị x bằng giá trị ở A1, tức 2. Kết quả ra tương đương với cách 1.

Tuy nhiên bây giờ có 1 vấn đề mà mấy ngày nay mình hỏi khắp nơi ko ra là như vậy:

nếu hàm func01("x",A1) tức là A1 thế nào thì func01 trả ra thế đấy.
Vấn đề bắt đầu từ đây,
1. Hàm func01 xài được với mọi trường hợp, mọi hàm trừ duy nhất khi là func01("x",A1) và giá trị A1=1. Chỉ duy nhất trường hợp này trả ra giá trị lỗi. Mọi người xem Cell C12 trong file Excel đính kèm giúp mình

2. Nếu các bạn mởi 1 sheet độc lập, viết lại hàm func01 y chang thì.
2.1 Dừng lại ở đây thì hàm func01 trả ra giá trị đúng với func01("x",A1)=1 với A1=1
2.2 Nếu thêm UserForm các thứ thì lỗi lại bị. ???

Ruốt cuộc mình chẳng biết vấn đề là từ đâu ra nữa
Anh em bạn bè gần xa, có ai cao thủ vụ này giúp mình với.

Cảm ơn mọi người
 

File đính kèm

  • Regression_PHAN.xlsm
    44.6 KB · Đọc: 7
Mã:
Function func01(str As String, X As Variant)
    func01 = Evaluate("=" & Replace(str, "x", X))
End Function
 
Upvote 0
Thực ra code còn lỗi khác. Trên máy tôi có lỗi theo hình. Tất cả những chỗ mà giá trị truyền vào hàm là số thập phân sẽ bị lỗi. Tại sao? Vì trên máy tôi dùng dấu phẩy là dấu thập phân nên vd. 1,25 sẽ được truyền vào là 1,25. Trong khi đó Evaluate dùng dấu chấm "." là dấu thập phân nên sẽ có lỗi.
Đề nghị:
- thêm "=" & như bạn phuocam hoặc thêm "(" & và & ")" đều được.
- thêm 1 Replace để biến "," nếu có thành "."
Mã:
Function func01(str As String, X As Variant)
    str = "(" & Replace(Replace(str, "x", X), Mid(3 / 2, 2, 1), ".") & ")"
    func01 = Evaluate(str)
End Function
Tôi chỉ xét 2 vấn đề. Tùy theo dạng str có thể có mà có thể phải xét thêm.

evaluate.jpg
 
Upvote 0
+Tạo một sheet mới và gõ hàm =func01("x", chạy bình thường.
+Quay lại sheet cũ, tạo thêm một cái nút bấm nữa, =func01("x",2) chạy lỗi.
+Xóa hết hai nút bấm, =func01("x",2),=func01("x",1) chạy bình thường.
---> Tại nút bấm, vô duyên dữ
 
Upvote 0
+Tạo một sheet mới và gõ hàm =func01("x", chạy bình thường.
+Quay lại sheet cũ, tạo thêm một cái nút bấm nữa, =func01("x",2) chạy lỗi.
+Xóa hết hai nút bấm, =func01("x",2),=func01("x",1) chạy bình thường.
---> Tại nút bấm, vô duyên dữ
Nếu cut/paste cái nút ấy, sẽ thấy "con số gây lỗi" từ từ đổi theo mỗi lần cut/paste. 3, 4, 6, 8, ...
 
Upvote 0
Nếu cut/paste cái nút ấy, sẽ thấy "con số gây lỗi" từ từ đổi theo mỗi lần cut/paste. 3, 4, 6, 8, ...

Mình có để ý thấy vụ này gây ra từ sau khi tạo mấy cái UserForm, tạo cái nút bấm ấy. Nên thành ra tới h mình ngồi mãi, chẳng hiểu tại sao sai cắt cớ như vậy.

Mình tạo worksheet mới hoàn toàn, gõ lại từ đầu thử mà cũng vẫn bị :(
Cái h chẳng biết phải làm ngoại trự viết lại cái hàm func01 kiểu chấp vá thế này:

Mã:
Function func01(str As String, Xval As Variant)
If str = "x" And Xval = 1 Then
    func01 = 1
Else
    func01 = Evaluate(Replace(str, "x", Xval))
End If
End Function
Bài đã được tự động gộp:

Thực ra code còn lỗi khác. Trên máy tôi có lỗi theo hình. Tất cả những chỗ mà giá trị truyền vào hàm là số thập phân sẽ bị lỗi. Tại sao? Vì trên máy tôi dùng dấu phẩy là dấu thập phân nên vd. 1,25 sẽ được truyền vào là 1,25. Trong khi đó Evaluate dùng dấu chấm "." là dấu thập phân nên sẽ có lỗi.
Đề nghị:
- thêm "=" & như bạn phuocam hoặc thêm "(" & và & ")" đều được.
- thêm 1 Replace để biến "," nếu có thành "."
Mã:
Function func01(str As String, X As Variant)
    str = "(" & Replace(Replace(str, "x", X), Mid(3 / 2, 2, 1), ".") & ")"
    func01 = Evaluate(str)
End Function
Tôi chỉ xét 2 vấn đề. Tùy theo dạng str có thể có mà có thể phải xét thêm.

View attachment 223085

Ah ah, xin lỗi bạn nhiều. Do đặc thù mình xài theo hệ của Mỹ nên xài đấu thập phân là đấu "."
Mình quên mất vụ này. Vụ thập phân thì mình có kiểm tra trên máy mình dùng "." thấy ổn. Chỉ có mỗi cái "x" và số "1" là bị thôi.
Cảm ơn bạn đã để ý.

223107


Bài đã được tự động gộp:

+Tạo một sheet mới và gõ hàm =func01("x", chạy bình thường.
+Quay lại sheet cũ, tạo thêm một cái nút bấm nữa, =func01("x",2) chạy lỗi.
+Xóa hết hai nút bấm, =func01("x",2),=func01("x",1) chạy bình thường.
---> Tại nút bấm, vô duyên dữ

Nó vậy nên kiểu ... :( :( :(
Buồn, kiểu chẳng hiểu sao bị lỗi cắt cớ vậy
Bài đã được tự động gộp:

Mã:
Function func01(str As String, X As Variant)
    func01 = Evaluate("=" & Replace(str, "x", X))
End Function

Cảm ơn bạn nhiều, "=" giải quyết được hết mọi chuyện.
Bài đã được tự động gộp:
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom