你真的會使用VBA的Select Case嗎?

2021-10-09 06:57:13 字數 3000 閱讀 1625

似乎語法格式和用法都很簡單,但是實際使用過程中可能就不是那回事了。下面示例來自於網友提問:下面的**無論陣列值如何變化,輸出結果最多就到「執行5」,之後的分支永遠無法執行。

sub demo1(

)dim mxx(1to

2), nxx(1to

2)nxx(1)

=0: nxx(2)

=10mxx(1)

=0: mxx(2)

=100

select case mxx(1)

case

is= nxx(1)

and mxx(2)

= nxx(2)

debug.print "執行1"

case

is= nxx(1)

and mxx(2)

> nxx(2)

debug.print "執行2"

case

is= nxx(1)

and mxx(2)

< nxx(2)

debug.print "執行3"

case

is> nxx(1)

and mxx(2)

= nxx(2)

debug.print "執行4"

case

is< nxx(1)

and mxx(2)

= nxx(2)

debug.print "執行5"

case

is> nxx(1)

and mxx(2)

< nxx(2)

debug.print "執行6"

case

is< nxx(1)

and mxx(2)

< nxx(2)

debug.print "執行7"

case

is> nxx(1)

and mxx(2)

> nxx(2)

debug.print "執行8"

case

is< nxx(1)

and mxx(2)

> nxx(2)

debug.print "執行9"

endselect

endsub

其實網友之注意到有些case分支沒有執行,但是並沒有注意到,即使被執行的分支,結果也不一定是對的。例如上述**中

nxx(1)

=0: nxx(2)

=10mxx(1)

=0: mxx(2)

=100

很明顯mxx(1) = nxx(1) and mxx(2) > nxx(2),應該是希望其使用如下的case分支,但是執行結果卻是執行1

case

is= nxx(1)

and mxx(2)

> nxx(2)

debug.print "執行2"

為什麼會出現這個結果呢?這位網友沒有理解case語句的用法,第乙個case分支相當於if mxx(1) = (nxx(1) and mxx(2) = nxx(2)),此時將相關值代入其中,因此條件表示式變為mxx(1) = (0 and 10 > 100),進而簡化為mxx(1) = 0,第乙個分支條件滿足,所以輸出結果為執行1,然後執行end select。由於類似的原因,後續幾個分支不可能被執行。

從**過程分析,可以看出這位網友希望實現的是根據兩個陣列元素的大小關係,進而執行不同的操作,那麼應該使用如下**。

sub demo(

)dim mxx(1to

2), nxx(1to

2)nxx(1)

=0: nxx(2)

=10mxx(1)

=0: mxx(2)

=100

select case

true

case mxx(1)

= nxx(1)

and mxx(2)

= nxx(2)

debug.print "執行1"

case mxx(1)

= nxx(1)

and mxx(2)

> nxx(2)

debug.print "執行2"

case mxx(1)

= nxx(1)

and mxx(2)

< nxx(2)

debug.print "執行3"

case mxx(1)

> nxx(1)

and mxx(2)

= nxx(2)

debug.print "執行4"

case mxx(1)

< nxx(1)

and mxx(2)

= nxx(2)

debug.print "執行5"

case mxx(1)

> nxx(1)

and mxx(2)

< nxx(2)

debug.print "執行6"

case mxx(1)

< nxx(1)

and mxx(2)

< nxx(2)

debug.print "執行7"

case mxx(1)

> nxx(1)

and mxx(2)

> nxx(2)

debug.print "執行8"

case mxx(1)

< nxx(1)

and mxx(2)

> nxx(2)

debug.print "執行9"

endselect

endsub

【**解析】

主要有兩個變化

1.select case true不在此使用變數

2.每個case分支使用乙個and條件表示式

執行**可以得到正確的結果。

你真的會使用google搜尋?

google搜尋可以說是當今世界最好的搜尋工具。但你真的會使用他嗎?如果你聽過高階搜尋語法,那就讓我們一起來學習吧。google在搜尋中使用 or 大寫的 來進行搜尋結果的邏輯操作。例如 使用 a b 代表搜尋結果包含a和b 使用 a b 代表搜尋結果包含a且不寶行b 使用 a or b 代表搜尋結...

你真的會使用assert嗎?

寫這篇部落格源於在閱讀lighttpd源 是遇到的乙個關於assert應用的疑問。buffer buffer init void 這裡的assert b 似乎有問題,實際release版本在執行中難道不會發生malloc返回null的情況嗎?之後在閱讀 writing solid code 一書時找...

你真的會使用assert嗎?

寫這篇部落格源於在閱讀lighttpd源 是遇到的乙個關於assert應用的疑問。複製 複製 buffer buffer init void 複製 複製 這裡的assert b 似乎有問題,實際release版本在執行中難道不會發生malloc返回null的情況嗎?之後在閱讀 writing sol...