作者genow ()
看板Office
標題[算表] VBA 求陣列中重複次數最多的值
時間Wed Aug 14 09:50:32 2019
軟體:EXCEL
版本:2010
您好:
我有個三維陣列 A(5,3,999)
如果我想知道A(5,3,1:999)中重複次數最多的值是那個
該如何利用VBA求得
我得想法是利用MODE函數
strmax=WorksheetFunction.Mode(mystr(5,3, 1:999))
但是他在1:999這個地方顯示語法錯誤
請問我該如何表達才正確 謝謝
---------------------------
更新
---------------------------
Sub TEST()
len1 = WorksheetFunction.CountA(Range("'工作表1'!A:A"))
Dim mystr(999)
k=1
For i = 2 To len1
len2 = Len(工作表1.Cells(i, 1))
for j = 1 to len2
mystr(K) = Mid(工作表1.Cells(i, 1), j, 2)
K = K + 1
Next
strmax = WorksheetFunction.Mode(mystr) <--出現錯誤
MsgBox strmax
Next
End Sub
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 117.56.73.248 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Office/M.1565747434.A.CF1.html
1F:→ soyoso: 如三維較無合適以該工作表函數mode回傳的話 08/14 10:06
2F:→ soyoso: 可以一、二維陣列,worksheetfunction.mode(變數) 08/14 10:07
3F:→ soyoso: 測試一、二維方面是可行的 08/14 10:07
4F:→ genow: 好的 我來測試一、二維 感謝您的回覆 08/14 10:09
5F:→ genow: 您好 我測完成後發現另一個問題,也就是 08/14 10:24
6F:→ genow: 無法取得類別WorksheetFunction的mode屬性 08/14 10:25
7F:→ genow: 可是我查了office官網確實有這個函數,請問是不是我哪錯了 08/14 10:26
8F:→ genow: 我將程式碼貼上,可以幫我確認一下嗎 感謝 08/14 10:26
※ 編輯: genow (117.56.73.248 臺灣), 08/14/2019 10:30:06
※ 編輯: genow (117.56.73.248 臺灣), 08/14/2019 10:30:43
10F:→ genow: 感謝您的回覆,我疏忽說一件事了,我的工作表1.Cells(1, 1) 08/14 10:47
11F:→ genow: 是字串型態,所以我有將您的建議內容改為Cstr 08/14 10:48
12F:→ genow: 執行結果出現:無法取得類別WorksheetFunction的mode屬性 08/14 10:49
13F:→ genow: 不知道是不是mode無法進行字串計算,還是我改利用其他函數 08/14 10:49
14F:→ soyoso: 改為cstr就為文字型態,mid取後就是這個型態了 08/14 10:50
15F:→ soyoso: 因此回文連結內以cint來轉換 08/14 10:50
16F:→ genow: 也可以進行相同結果計算,例如countif 08/14 10:51
17F:→ soyoso: 先以回文連結內的cint而非cstr來轉換來試試 08/14 10:52
18F:→ soyoso: 假設將a欄內的數字以文字型態來測試 08/14 10:54
21F:→ genow: 在工作表1的儲存格內容為字串型態時,會出現型態不符 08/14 11:03
22F:→ genow: 再請so大大有空幫忙看一下<(__ __)> 08/14 11:05
※ 編輯: genow (117.56.73.248 臺灣), 08/14/2019 11:07:28
23F:→ soyoso: 如是回文連結內的字串,因無法轉換為數字,可以原po回文 08/14 11:13
24F:→ soyoso: 寫到的函數countif,應也不用改為一、二維 08/14 11:14
25F:→ soyoso: 但因countif第一引數是以range,所以這方面可以工作表儲存 08/14 11:15
26F:→ soyoso: 格來輔助 08/14 11:15
27F:→ soyoso: 用原po回文的countif的話,類似這樣 08/14 14:16
29F:推 cutekid: 以原 PO 的說明及他寫的 code 來看,strmax 會放在第二 08/14 14:21
30F:→ cutekid: 層迴圈結束後,然後繼續跑下一筆的 strmax 08/14 14:22
31F:→ cutekid: 以範例來講,應該會跑出三筆結果: AA,無,CC 08/14 14:23
32F:→ soyoso: 內文寫了"A(5,3,1:999)中重複次數最多的值是那個" 08/14 14:23
33F:→ soyoso: 要解讀要跑三筆可以 08/14 14:23
34F:→ soyoso: 我的解讀是a這個陣列內重複次數最多的值是哪個 08/14 14:24
35F:→ soyoso: 且我08/14 10:54的回文就已經將該部分調整到迴圈外 08/14 14:24
36F:→ soyoso: 當然就看原po要的結果是哪個了 08/14 14:29
37F:推 cutekid: 我是看原 po 在 08/14 11:02 回文裡的 code 08/14 14:30
38F:→ soyoso: 內文也寫了WorksheetFunction.Mode(mystr(5,3, 1:999)) 08/14 14:30
39F:→ cutekid: s 說的是,看原 po 要哪個了! 08/14 14:30
40F:→ cutekid: mystr(5,3, 1:999) 我的理解是某個 cell 會被切成 999 個 08/14 14:31
41F:→ soyoso: 我的想法是原po要以函數mode來取變數mystr內出現頻率最高 08/14 14:32
42F:→ soyoso: 的值 08/14 14:32
43F:→ cutekid: 是的,取每個 cell 切成最多 999 個字串後,頻率最高的 08/14 14:33
44F:→ soyoso: 取cell也好,變數也好,我回文只是提供如以原po回文所提的 08/14 14:36
45F:→ soyoso: 以函數countif的話,寫法為何而已 08/14 14:37
46F:推 cutekid: 嗯,我也是! 08/14 14:37
47F:推 cutekid: 還是推 s 大: 使用輔助欄 countif 後 vba 的寫法,厲害(Y) 08/14 14:48