Board logo

標題: [發問] 有關Excel VBA陣列使用方式... [打印本頁]

作者: VBALearner    時間: 2016-7-31 23:52     標題: 有關Excel VBA陣列使用方式...

本帖最後由 VBALearner 於 2016-7-31 23:53 編輯

Excel VBA的問題
請問如果我有個一維陣列
裡面有10個數字分別對應陣列(1~10)
假設我今天要排序陣列中數值大到小
那我要如何知道排名前5大數值的原始標籤(就是原本的1~10排序被打亂後 如何呼叫)?
感謝回答
  1. option explicit
  2. dim total(50) as variant

  3. for i = 1 to 50
  4. total(i) = application.worksheetfunction.sum(range(cells(i,1),cells(i,10)))
  5. next

  6. sorting....%#$?!
  7. index of top 20?!
複製代碼
或是有其他更好的方式?!
作者: kaiclous    時間: 2016-8-1 16:55

網路上有說明  http://blog.xuite.net/smile1000mile/blog/95167875-EXCEL+VBA%EF%BC%8E%E5%9C%A8%E7%A8%8B%E5%BC%8F%E7%A2%BC%E4%B8%AD%E5%88%A9%E7%94%A8%E3%80%94%E9%99%A3%E5%88%97%E3%80%95%E9%80%B2%E8%A1%8C%E8%B3%87%E6%96%99%E7%9A%84%E3%80%94%E6%8E%92%E5%BA%8F%E3%80%95
作者: VBALearner    時間: 2016-8-1 21:47

回復 2# kaiclous

試用了其程式碼之後 我有幾個問題想再請教

第一個就是application.transpose在裡面的功能是甚麼? 只是單純貼上而已嗎? 我很少看到這個功能...
第二個是application.evaluate是甚麼意思? 我找了一些文章 還是不太清楚他的功能 只知道好像是個蠻好用的語法..?!
第三個就是原本的問題,我還是無法得知在原本的資料序列裡,排行前幾的資料編號是那些,這只是單純排序資料數值而已,還請k大幫忙再看仔細我的問題,謝謝~
作者: lpk187    時間: 2016-8-2 16:39

本帖最後由 lpk187 於 2016-8-2 16:47 編輯

回復 3# VBALearner




1.application.transpose為工作表函數:TRANSPOSE 函數會將儲存格之垂直範圍以水平範圍的格式傳回,詳見Excel說明,常見功能
2.詳見VBE說明 Application.Evaluate 方法
作者: ML089    時間: 2016-8-2 19:48

回復 3# VBALearner

如何知道排名前5大數值的原始標籤(就是原本的1~10排序被打亂後 如何呼叫)?

可以
1. 使用2個一維陣列,一個紀錄原始標籤(或順位),一個紀錄資料陣列
2. 使用2維陣列,一維紀錄原始標籤(或順位),另一維紀錄資料陣列
3. 或原始資料與原始標籤合併,
例如  
1  33 合併為 33001
2  11 合併為 11002
3  44 合併為 44003
排序後取資料後3碼就是原始標籤(或順位)
作者: 准提部林    時間: 2016-8-2 20:45

EXCEL本身的排序功能最好用, 也適合大部份的資料型態(尤其是多欄位的資料),
為何不用它???
作者: VBALearner    時間: 2016-8-3 00:07

本帖最後由 VBALearner 於 2016-8-3 00:18 編輯

回復 5# ML089

喔喔感謝您!!
把編碼加在後面的方法真是太聰明了!!!
作者: VBALearner    時間: 2016-8-3 00:10

本帖最後由 VBALearner 於 2016-8-3 00:19 編輯

回復 6# 准提部林

我會用sorting功能 但是我的資料有標籤號碼 我要排序完後還能讀取相對應的標籤號碼
而且我同時處理多種資料
所以不想貼到worksheet上面處理
然後剛樓上提到的方法我之前也沒想過xD
目的是要找多種資料排名前100大的資料交集的標籤號碼

另外,我可以問您application.transpose的問題嗎? 他好像只是單純貼上的功能?!!
還有application.evaluate,這好像有很多功能....? 其中一種好像是可以把字串變數值? 還有其他...? 不太懂
還請賜教!
作者: 准提部林    時間: 2016-8-3 10:12

application.transpose
為〔轉置〕之用,原設array陣列為〔橫式〕,須轉置一次才能以〔直式-由上而下〕貼入欄位

application.evaluate
用來將〔文字字串〕的〔計算式〕,以工作表函數方式直接計算出其結果,
例如:MsgBox Application.Evaluate("=A1>A2")
因範例題中含〔文字〕的比較大小,VBA與公式的比較結果是不一樣的,
為了達到VBA排序的結果能與工作表排序結果一致,所以利用了Evaluate,
若是〔純數值〕的比較,直接使用 a>B 即可。
作者: VBALearner    時間: 2016-8-3 11:15

回復 9# 准提部林

喔喔完全懂了! 感謝您仔細地回答!!!
原來array還有橫式跟直式的區別...我以為就只是存在記憶體裡面的資料而已,我愛用甚麼形狀貼上就用什麼形狀貼上......恩~總之感謝!
作者: VBALearner    時間: 2016-8-7 22:47

回復 9# 准提部林

咦...這麼看來...Evaluate其實很好用欸?!!
application.worksheetfunction都免叫了
平常用習慣的工作表函數都直接用Evaluate呼叫也行,是吧?!(不科學阿xD~~~)
可是好像沒有很多人在用Evaluate,市面上的書都沒介紹它...
那想請問大大,除了上述功能外,有甚麼Evaluate常用的用法嗎OwO?
謝謝指教!
作者: 准提部林    時間: 2016-8-8 11:17

回復 11# VBALearner


   
程式方法少人用, 一定有它的道理,
微軟會提供不同方法去處理類似需求, 也有它的道理,
所以, 沒有好不好用問題, 只有適不適用?
VBA靠經驗, 慢慢摸, 慢慢磨, 花的時間夠多, 對于資料的處理, 其實就那幾個方法吧!
作者: VBALearner    時間: 2016-8-8 15:20

回復 12# 准提部林

是是! 我慢慢累積琢磨後再來向您請教,感謝您OvO




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)