Đưa String chứa biểu thức điều kiện vào hàm if (2 người xem)

  • Thread starter Thread starter dhn46
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

dhn46

Hướng tới tương lai
Tham gia
1/3/11
Bài viết
3,251
Được thích
3,870
dhn46 có String
Mã:
s = ">3"
Hỏi là cách nào để đưa String s vào biểu thức có dạng như sau
Mã:
Arr=Array(1,2,3,4,5)
For i = 1 to 5
[B]    If Arr(i) & s then[/B]
       Debug.Print i
   End if
Next
Tức là là sao để đoạn in đậm sẽ được hiểu theo
Mã:
If Arr(i) > 3 then
......................
dhn46 mong nhận được sự giúp đỡ của anh chị
Xin cảm ơn!
 
Lần chỉnh sửa cuối:
dhn46 có String
Mã:
s = ">3"
Hỏi là cách nào để đưa String s vào biểu thức có dạng như sau
Mã:
Arr=Array(1,2,3,4,5)
For i = 1 to 5
[B]     If Arr(i) & s then[/B]
        Debug.Print i
     End if
Next
[code]
Tức là là sao để đoạn in đậm sẽ được hiểu theo
[code]
If Arr(i) > 3 then
......................
dhn46 mong nhận được sự giúp đỡ của anh chị
Xin cảm ơn!

1. Nên nhớ là mảng trả về bởi Array() có chỉ số từ 0, tức For i = 0 to 4.
2. Dùng Evaluate?
Mã:
    For i = 0 To 4
        If Evaluate(Arr(i) & s) Then
            Debug.Print i
        End If
    Next

Đại loại thế, bạn tự thử nghiệm.
 
Upvote 0
dhn46 cảm ơn bác Siwtom
1. Nên nhớ là mảng trả về bởi Array() có chỉ số từ 0, tức For i = 0 to 4.
Cháu đang thử nghiệm trên Option Base 1

Khi áp dụng Evaluate thì với điều kiện đơn lẻ như ">1","<5" hay "=2" thì được nhưng khi cháu thử nghiệm với các điều kiện kết hợp khác thì chưa đạt. Ví dụ:
Mã:
s1=">2"
s2="<5"

For i = 1 To 5
    If Evaluate(Arr(i) & s1 & " and " Arr(i) & s2) Then
        Debug.Print i
    End If
Next

Mục đích của câu hỏi là: làm thế nào để phần điều kiện dưới dạng string trở thành một phần của cấu trúc If
Mã:
If [COLOR=#ff0000][B]........ [/B][/COLOR]then

Xin cảm ơn mọi người
 
Upvote 0
dhn46 cảm ơn bác Siwtom

Cháu đang thử nghiệm trên Option Base 1

Khi áp dụng Evaluate thì với điều kiện đơn lẻ như ">1","<5" hay "=2" thì được nhưng khi cháu thử nghiệm với các điều kiện kết hợp khác thì chưa đạt. Ví dụ:
Mã:
s1=">2"
s2="<5"

For i = 1 To 5
    If Evaluate(Arr(i) & s1 & " and " Arr(i) & s2) Then
        Debug.Print i
    End If
Next

Mục đích của câu hỏi là: làm thế nào để phần điều kiện dưới dạng string trở thành một phần của cấu trúc If
Mã:
If [COLOR=#ff0000][B]........ [/B][/COLOR]then

Xin cảm ơn mọi người

Theo tôi không thực hiện được. Tất nhiên với số đk cụ thể thì có thể viết, vd.

Mã:
If Evaluate(Arr(i) & s1) and Evalute(Arr(i) & s2) Then

Nhưng để viết tổng quát thì không được. Vả lại còn trường hợp các đk được kết hợp bởi OR nữa.

Với AND thì code đại loại là:

Mã:
...
For index = LBound(Crit) to UBound(Crit)
    result = Evaluate(Arr(i) & Crit(index)
    if not result then Exit For
Next
If result then MsgBox Arr(i) & " thoa moi dieu kien"
 
Upvote 0
Vâng bác hiểu đúng ý cháu rồi ạ. Đúng là cháu muốn tìm cái tổng quát này. Suy nghĩ ban đầu chỉ là thay thế toàn bộ đoạn điều kiện s trong If s then rồi thực hiện lệnh. Bởi cái s đó có thể được xây dựng bởi người dùng dựa trên tham số đầu vào.

dhn46 cảm ơn bác Siwtom!
 
Upvote 0
Vâng bác hiểu đúng ý cháu rồi ạ. Đúng là cháu muốn tìm cái tổng quát này. Suy nghĩ ban đầu chỉ là thay thế toàn bộ đoạn điều kiện s trong If s then rồi thực hiện lệnh. Bởi cái s đó có thể được xây dựng bởi người dùng dựa trên tham số đầu vào.

dhn46 cảm ơn bác Siwtom!

Tất nhiên nhiều khi viết tổng quát thì lại khác. VD. do không có ý tưởng nào khác nên trong Function MyFilter2DArray tôi viết khác. Nhưng trong th cụ thể vd. "=" thì lại viết khác, tức bỏ "=" trong Crit(...) và code vd. là

Mã:
...
For index = LBound(Crit) to UBound(Crit)
    result = Arr(i) = Crit(index)
    if not result then Exit For
Next
If result then MsgBox Arr(i) & " thoa moi dieu kien"

Th cụ thể "<", "<=", ">" hoặc ">=" thì cũng tương tự. Tức trong bài cụ thể có thể ta không dùng "dao vạn năng" hay "dao mổ trâu".
 
Upvote 0
Tất nhiên nhiều khi viết tổng quát thì lại khác. VD. do không có ý tưởng nào khác nên trong Function MyFilter2DArray tôi viết khác. Nhưng trong th cụ thể vd. "=" thì lại viết khác, tức bỏ "=" trong Crit(...) và code vd. là

Mã:
...
For index = LBound(Crit) to UBound(Crit)
    result = Arr(i) = Crit(index)
    if not result then Exit For
Next
If result then MsgBox Arr(i) & " thoa moi dieu kien"

Th cụ thể "<", "<=", ">" hoặc ">=" thì cũng tương tự. Tức trong bài cụ thể có thể ta không dùng "dao vạn năng" hay "dao mổ trâu".

Bản thân câu lệnh lập trình đã vạn năng rồi, giờ sao lại muốn string hóa truyền vào IF vậy nhỉ?

Vì bản chất các dấu >,>=,<,<=, = hay And, Or,.... là các toán tử và thế nên không thể thay thế String thế được --- NẾU có thì thấy có khả năng Overloading operators của C++ (ngônq ngữ lập trình C++) với VB thì không có thì phải. --> trong VBA phải lập thành options và không tổng quát

trên các bài trên cách rất sáng tạo bác siwtom đề cập trên, với cách dùng Evaluate (tức là chuyển sang sử dụng hàm của application. với suy nghĩ thế thì góp vui ý sau:

với

Mã:
s1=">2"
s2="<5"

For i = 1 To 5
    If Evaluate(Arr(i) & s1 & " and " Arr(i) & s2) Then
        Debug.Print i
    End If
Next

thì nên là

Mã:
s1=">2"
s2="<5"

For i = 1 To 5
    If Evaluate( "AND(" & Arr(i) & s1 & " ," Arr(i) & s2 &")" ) Then
        Debug.Print i
    End If
Next

(nhưng cũng thật loằng ngoằng ... hihii
 
Upvote 0
Vâng dhn46 cám ơn anh vodoi2x đã quan tâm câu hỏi.

- Nguyên nhân dhn46 đặt ra bài toán vì ý tưởng hàm trích lọc tổng quát. Các hàm trích lọc khi có 2 điều kiện như Filter2DArray cải tiến của bác SiwTom thì code rất dài và mới dừng lại ở 2, nếu việc đưa chuỗi s vào trong if...then thì giới hạn đó sẽ được xoá bỏ dễ dàng hơn, đặc biệt có thể đưa trực tiếp các hàm trong VB vào điều kiện trong hàm tự tạo.
 
Upvote 0
Vâng dhn46 cám ơn anh vodoi2x đã quan tâm câu hỏi.

- Nguyên nhân dhn46 đặt ra bài toán vì ý tưởng hàm trích lọc tổng quát. Các hàm trích lọc khi có 2 điều kiện như Filter2DArray cải tiến của bác SiwTom thì code rất dài và mới dừng lại ở 2, nếu việc đưa chuỗi s vào trong if...then thì giới hạn đó sẽ được xoá bỏ dễ dàng hơn, đặc biệt có thể đưa trực tiếp các hàm trong VB vào điều kiện trong hàm tự tạo.

Không phải vô cớ mà trong bài #6 tôi có nhắc tới Function MyFilter2DArray
Chính vì muốn xét hơn 2 điều kiện nên tôi mới viết Function MyFilter2DArray

http://www.giaiphapexcel.com/forum/...cột-lọc-tùy-ý-cột-số-tới-2-điều-kiện

Tất nhiên code phức tạp vì cho phép điều kiện đa dạng

Từ hồi đó (gần 10 tháng trước) tới nay tôi cũng không suy nghĩ, tìm tòi, sửa gì nữa vì không có hứng.
 
Upvote 0
Vâng dhn46 cám ơn anh vodoi2x đã quan tâm câu hỏi.

- Nguyên nhân dhn46 đặt ra bài toán vì ý tưởng hàm trích lọc tổng quát. Các hàm trích lọc khi có 2 điều kiện như Filter2DArray cải tiến của bác SiwTom thì code rất dài và mới dừng lại ở 2, nếu việc đưa chuỗi s vào trong if...then thì giới hạn đó sẽ được xoá bỏ dễ dàng hơn, đặc biệt có thể đưa trực tiếp các hàm trong VB vào điều kiện trong hàm tự tạo.

Nếu Dhn46 quan tâm dạng bài thế, thì trong tin học người ta nói nhiều đến thuật toán kinh điển: Thuật toán BaLan ngược (còn gọi: Bàn phím Balan ngược, hay Ký pháp BaLan ngược... nhiều sách tiếng Việt cũng đề cập thuật toán này) - liên quan xử lý biểu thức với các toán tử ... đưa vào dạng chuỗi, rùi tính toán thế nào

Cái này chắc bác Siwtom quá rành .... cứ theo chân bác ý thui.
 
Upvote 0
Web KT

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

Back
Top Bottom