PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 疑難雜症區
帳戶
密碼
 

  回應
 
主題工具
edjc
Junior Member
 
edjc的大頭照
 

加入日期: Jul 2004
您的住址: Verthandi的懷裡
文章: 766
引用:
作者老柏(第三)
感謝

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


還好啦,反正我在公司無聊也是在玩玩VBA
順便練習怎麼寫跟簡化
目前有的也寫成模組起來方便以後套用
     
      
舊 2011-07-02, 09:03 PM #11
回應時引用此文章
edjc離線中  
azteq
Advance Member
 

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


寫的非常漂亮~~~
 
舊 2011-07-04, 10:42 AM #12
回應時引用此文章
azteq離線中  
老柏(第三)
*停權中*
 
老柏(第三)的大頭照
 

加入日期: Nov 2010
文章: 116
引用:
作者edjc
我用最笨的公式寫看看(兩段式IF判斷式)
你可以試試看




寫法都一樣

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

它會把所有值加總平均後跟0.5比,比0.5大的話再跟1比,比1小的話才能輸出值
我要的是:
把所有值先挑過,符合條件的才放進去加總平均,不符合條件的根本不會放進去一起平均
舊 2011-07-05, 07:35 PM #13
回應時引用此文章
老柏(第三)離線中  
edjc
Junior Member
 
edjc的大頭照
 

加入日期: Jul 2004
您的住址: Verthandi的懷裡
文章: 766
引用:
作者老柏(第三)
經過測試,很抱歉,不能用
比如說這個
=if(AVERAGE(E12:O31)<1,if(AVERAGE(E12:O31) >0.5,AVERAGE(E12:O31),),)

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


真是抱歉,沒把你要的要求看清楚
晚點再來想想怎麼寫比較順
舊 2011-07-06, 09:23 AM #14
回應時引用此文章
edjc離線中  
azteq
Advance Member
 

加入日期: Dec 2002
文章: 441
延續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..............
試試看吧

此文章於 2011-07-06 09:59 AM 被 azteq 編輯.
舊 2011-07-06, 09:51 AM #15
回應時引用此文章
azteq離線中  
edjc
Junior Member
 
edjc的大頭照
 

加入日期: Jul 2004
您的住址: Verthandi的懷裡
文章: 766
引用:
作者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..............
試試看吧


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

還有多問一下,那個大括號{ },有什麼用途呀?
舊 2011-07-06, 05:39 PM #16
回應時引用此文章
edjc離線中  
azteq
Advance Member
 

加入日期: Dec 2002
文章: 441
引用:
作者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))

此文章於 2011-07-06 06:08 PM 被 azteq 編輯.
舊 2011-07-06, 06:04 PM #17
回應時引用此文章
azteq離線中  
azteq
Advance Member
 

加入日期: Dec 2002
文章: 441
補上一個釋例檔

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

總平均、標準差是用我版上的寫法
最大值和最小值是用 巢狀函數的寫法
但通通用陣列公式來處理。
舊 2011-07-06, 06:31 PM #18
回應時引用此文章
azteq離線中  
edjc
Junior Member
 
edjc的大頭照
 

加入日期: Jul 2004
您的住址: Verthandi的懷裡
文章: 766
還有這種寫法,受教了
舊 2011-07-06, 11:58 PM #19
回應時引用此文章
edjc離線中  
老柏(第三)
*停權中*
 
老柏(第三)的大頭照
 

加入日期: Nov 2010
文章: 116
引用:
作者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 =

他就會把你填入的公式以陣列公式的方式入
舊 2011-07-12, 01:06 PM #20
回應時引用此文章
老柏(第三)離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是11:21 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2026。