Board logo

標題: 找出陣列出現最多及次多資料 [打印本頁]

作者: chwqk    時間: 2010-6-2 03:47     標題: 找出陣列出現最多及次多資料

如何在陣列資料中 找出出現最多資料 及次多資料
資料中出現最多的是 "外五期" 有6個
資料中出現次多的是 "法s權" 有5個
但要如何快速篩選出來???[attach]1084[/attach]
作者: Hsieh    時間: 2010-6-2 09:00

回復 1# chwqk
a2:j10定義名稱y
第一多次的顯示位置定義為x
如L1為第一多次的顯示位置
L1陣列公式{=INDIRECT("R"&MOD(MIN(IF(COUNTIF(y,y)=LARGE(COUNTIF(y,y),1),COLUMN(y)*10+ROW(y),"")),10)&"C"&INT(MIN(IF(COUNTIF(y,y)=LARGE(COUNTIF(y,y),1),COLUMN(y)*10+ROW(y),""))/10),0)}

如L2為第二多次的顯示位置
L2陣列公式{=INDIRECT("R"&MOD(MIN(IF(COUNTIF(y,y)=LARGE(COUNTIF(y,y),1+COUNTIF(y,x)),COLUMN(y)*10+ROW(y),"")),10)&"C"&INT(MIN(IF(COUNTIF(y,y)=LARGE(COUNTIF(y,y),1+COUNTIF(y,x)),COLUMN(y)*10+ROW(y),""))/10),0)}

    [attach]1085[/attach]
作者: zz5151353    時間: 2010-6-2 11:58

本帖最後由 zz5151353 於 2010-6-2 16:27 編輯

小弟也來一個
K2 公式
複製往下一格

{=INDIRECT("R"&TEXT(MIN(IF((A$2:J$10<>"")*(COUNTIF(K$1:K1,A$2:J$10)=0),ROW(A$2:J$10)*1000+COLUMN(A$3:J$10),65536256)),"0C000"),)}

再提供另一思維或許比較容易理解
請看檔案紅色區域地方
作者: gong    時間: 2010-6-2 15:37

{=INDIRECT("R"&TEXT(MIN(IF((A$2:J$10"")*(COUNTIF(K$1:K1,A$2:J ...
zz5151353 發表於 2010-6-2 11:58

(COUNTIF(K$1:K1,A$2:J$10)=0
不瞭解這段作用為何,可以指點一下嗎?

全句似乎只找到第一個出現的文字,與是否出現最多次無關

整句架構的概念好極了,架構值得推薦學習
作者: Andy2483    時間: 2023-5-15 09:41

本帖最後由 Andy2483 於 2023-5-15 09:43 編輯

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教

執行結果:
[attach]36355[/attach]


Option Explicit
Sub TEST()
Dim Brr, V, Y, i&, j&, N1&, N2&, T$, P1$, P2$
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
Brr = [A2:J10]
'↑令Brr變數是 二維陣列,以[A2:J10]儲存格值帶入陣列中
For i = 1 To UBound(Brr, 1)
'↑設順迴圈!i從1到Brr縱向最大索引列號
'(UBound(Brr, 1)可以簡化為UBound(Brr)
   For j = 1 To UBound(Brr, 2)
   '↑設順迴圈!i從1到Brr橫向最大索引欄號
      T = Brr(i, j)
      '↑令T變數是 i迴圈列j迴圈欄Brr陣列值
      '用個變數裝陣列值的好處:
      '1.讓陣列值定義為字串,納入字典不必加"" 例如:Y(Brr(i,j) & "")=""
      '2.縮短程式碼長度,因為Brr(i, j)在下個程序被用了3次

      If T <> "" Then Y(T) = Y(T) + 1
      '↑如果陣列值不是空的!就令以T變數是key,item是自身累加1
      '這是要記錄同個key出現了幾次

   Next
Next
N1 = Application.Large(Y.items, 1)
'↑令N1變數是Y字典裡item的最大值
N2 = Application.Large(Y.items, 2)
'↑令N2變數是Y字典裡item的第二大值
For i = 1 To Y.Count
'↑設順迴圈!i從1 到Y字典key數量
   If Y(Y.keys()(i - 1)) = N1 Then P1 = P1 & " " & Y.keys()(i - 1)
   '↑如果以key查對應item是最大值!就令該key納入P1字串變數後方
Next
For Each V In Y.keys
'↑設逐項迴圈!令V變數是 Y字典裡的其中一個key
   If Y(V) = N2 Then P2 = P2 & " " & V
   '↑如果以V變數(key)查對應item是第二大值!就令該key納入P2字串變數後方
Next
MsgBox "第一多_" & N1 & "次: " & P1 & Chr(10) & _
       "第二多_" & N2 & "次: " & P2
'↑跳出提示窗顯示組合字串
Set Y = Nothing: Erase Brr
'↑令釋放變數
End Sub




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