PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   想請教Excal的條件式問題 (https://www.pcdvd.com.tw/showthread.php?t=934589)

edjc 2011-07-02 09:03 PM

引用:
作者老柏(第三)
感謝

原本我想說我自己寫不要當伸手牌,沒想到您自己貼上範例給我看,謝謝


還好啦,反正我在公司無聊也是在玩玩VBA
順便練習怎麼寫跟簡化
目前有的也寫成模組起來方便以後套用

azteq 2011-07-04 10:42 AM

引用:
作者edjc
還好啦,反正我在公司無聊也是在玩玩VBA
順便練習怎麼寫跟簡化
目前有的也寫成模組起來方便以後套用


寫的非常漂亮~~~

老柏(第三) 2011-07-05 07:35 PM

引用:
作者edjc
我用最笨的公式寫看看(兩段式IF判斷式)
你可以試試看




寫法都一樣

經過測試,很抱歉,不能用
比如說這個
=if(AVERAGE(E12:O31)<1,if(AVERAGE(E12:O31) >0.5,AVERAGE(E12:O31),),)

它會把所有值加總平均後跟0.5比,比0.5大的話再跟1比,比1小的話才能輸出值
我要的是:
把所有值先挑過,符合條件的才放進去加總平均,不符合條件的根本不會放進去一起平均

edjc 2011-07-06 09:23 AM

引用:
作者老柏(第三)
經過測試,很抱歉,不能用
比如說這個
=if(AVERAGE(E12:O31)<1,if(AVERAGE(E12:O31) >0.5,AVERAGE(E12:O31),),)

它會把所有值加總平均後跟0.5比,比0.5大的話再跟1比,比1小的話才能輸出值
我要的是:
把所有值先挑過,符合條件的才放進去加總平均,不符合條件的根本不會放進去一起平均


真是抱歉,沒把你要的要求看清楚
晚點再來想想怎麼寫比較順

azteq 2011-07-06 09:51 AM

延續edjc兄規劃,H1是上限,H2是下限(如有特殊需求,請自行改成>=)

用陣列公式
=AVERAGE(IF((E12:O31>H2)*(E12:O31<H1),E12:O31))

公式寫入後,按ctrl-shift-enter
儲存格內的公式會變成
{=AVERAGE(IF((E12:O31>H2)*(E12:O31<H1),E12:O31))}

其他就如此這般改成STDEV、MAX、MIN..............
試試看吧

edjc 2011-07-06 05:39 PM

引用:
作者azteq
延續edjc兄規劃,H1是上限,H2是下限(如有特殊需求,請自行改成>=)

用陣列公式
=AVERAGE(IF((E12:O31>H2)*(E12:O31<H1),E12:O31))

公式寫入後,按ctrl-shift-enter
儲存格內的公式會變成
{=AVERAGE(IF((E12:O31>H2)*(E12:O31<H1),E12:O31))}

其他就如此這般改成STDEV、MAX、MIN..............
試試看吧


我照樣輸入之後好像無法使用
怪哉(檢查...

還有多問一下,那個大括號{ },有什麼用途呀?

azteq 2011-07-06 06:04 PM

引用:
作者edjc
我照樣輸入之後好像無法使用
怪哉(檢查...

還有多問一下,那個大括號{ },有什麼用途呀?


要先把 =AVERAGE(......... 這些東西key進去,key好後,不是按 enter

而是按 Ctrl + Shift + Enter ,公式兩旁便會出現大括弧將陣列公式包起來

那個大括號只是用來表示,這個是陣列公式
陣列公式提供陣列來暫存待處理的數據, 再配合你使用的函數作計算

以底下這個為例

{=AVERAGE(IF((E12:O31>H2)*(E12:O31<H1),E12:O31))}


換作寫成vba, 大概像下面的樣子
(在下很久沒寫vba,而且本來程度就很有限
所以隨便湊一湊,看得懂大概的意思就好)

set A1() as array
B1=0
for I = 1 to 11 ' O-E=11
for J = 1 to 20
if cell(I,J) > H2 and cell(I,J) < H1
A1(B1)= cell(I,J)
B1=B1+1
endif
next J
next I

C1=average(A1(0)+A1(1).....A1(B1-1))

azteq 2011-07-06 06:31 PM

補上一個釋例檔

http://07hd.com/0E6A9H4IAZEY/array.xls.html

總平均、標準差是用我版上的寫法
最大值和最小值是用 巢狀函數的寫法
但通通用陣列公式來處理。

edjc 2011-07-06 11:58 PM

還有這種寫法,受教了 :like: :like: :like: :)

老柏(第三) 2011-07-12 01:06 PM

引用:
作者azteq
要先把 =AVERAGE(......... 這些東西key進去,key好後,不是按 enter

而是按 Ctrl + Shift + Enter ,公式兩旁便會出現大括弧將陣列公式包起來

那個大括號只是用來表示,這個是陣列公式
陣列公式提供陣列來暫存待處理的數據, 再配合你使用的函數作計算

以底下這個為例

{=AVERAGE(IF((E12:O31>H2)*(E12:O31<H1),E12:O31))}


換作寫成vba, 大概像下面的樣子
(在下很久沒寫vba,而且本來程度就很有限
所以隨便湊一湊,看得懂大概的意思就好)

set A1() as array
B1=0
for I = 1 to 11 ' O-E=11
for J = 1 to 20
if cell(I,J) > H2 and cell(I,J) < H1
A1(B1)= cell(I,J)
B1=B1+1
endif
next J
next I

C1=average(A1(0)+A1(1).....A1(B1-1))

感謝

對於vba的寫法也給您參考一下
一般輸入公式或值可以用以下這兩種指令
CExcel.Range("e5").Formula =
CExcel.Range("e5").Value =

CExcel是你指定的活頁,Range是放你要填入什麼位置


陣列函數是用這個指令
CExcel.Range("e2").FormulaArray =

他就會把你填入的公式以陣列公式的方式入


所有的時間均為GMT +8。 現在的時間是05:50 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。