史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 軟體應用問題討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2015-06-09, 09:18 PM   #1 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

基本上 Excel 的內建公式與 VBA 自訂公式 ... 各有千秋

怎麼說... 內建公式比較簡單易上手 ... 自訂公式需要有一定程度的程式設計的基礎
以本樓來說兩者都可以達到效果 ... 但是若是某個概念去做的話,如 SUM() 來說
VBA 自訂公式,就很糟糕 ... 主要問題不是演算結果,而是 () 的輸入範圍的關係。

以內建公式來說 SUM () 也好或是其他的公式,很多都是可以接受 A1:B3 這類的
連續範圍的輸入,有的甚至混合其他的如資料+儲存格+連續範圍,都 OK。
這點反觀 VBA 自訂公式,就迪西以目前網路上找到的結果是,如前述那樣的狀況,
且無比較理想或適當的範例可以求解。

以此樓的問題來說,若以內建公式的話,對於「資料的選擇輸入範圍」比較理想,
比較不方便的地方,是要不斷的修改 COUNTIF 的條件 ... 可以利用記事本,先編
公式好了在貼過來。
若是以 VBA 自訂公式的話,這個「資料的選擇輸入範圍」,要先按住「ctrl」一個
一個點,資料範圍少就算了 ... 很多且多到一個量以上 ... 就知道痛苦了 ...。

基本在很多狀況是混用的 ... 能解決問題比較重要 ...
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。
不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。

天線寶寶說再見啦~ ... 天線寶寶說再見啦~

迪西:「再見~ 再見~」

Otaku Culture Party 關心您 ...
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
有 3 位會員向 getter 送花:
a471 (2015-06-09),atie (2015-06-09),runonetime (2015-06-09)
感謝您發表一篇好文章
舊 2015-06-15, 10:02 PM   #2 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設 終於迪西讓那個自訂函數可以向 SUM () 一樣了 可能啦~

那個 VBA 迪西這兩天找了一個範例,僅只能使用一組 連續參照的範例,
被迪西意外想到以某種方式實現,在 (值) 的輸入上可以像 SUM () 一樣
有彈性的使用了。

初步已在 Excel 2003/2010 上面跑過 ... 效果對不對就 ... 再討論

COUNT_NRN 以 (數值) 為條件的統計計算方式,功能、使用方式跟 COUNT 差不多
語法:
Function COUNT_NRN(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRN ver. 1a 
  '     動作1:資料選擇範圍
  '
  ' 以 (數值) 為條件的計算資料出現的次數,
  ' 當有重複的(值)時後,該值只計算一次。
  ' 使用方式、功能類似於 COUNT 內建函數。
  '
  ' Value:可以是 (數值) 、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRN = Count
End Function


COUNT_NRA 以 (字串) 為條件的統計計算方式,功能、使用方式跟 COUNTA 差不多
語法:
Function COUNT_NRA(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRA ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以 (字串) 為條件的計算資料出現的次數,
  ' 當有重複的(值)時後,該值只計算一次。
  ' 使用方式、功能類似於 COUNTA 內建函數。
  '
  ' Value:可以是 (字串) 、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRA = Count
End Function


COUNT_NR2 以 (數值 + 字串) 為條件的統計計算方式,功能、使用方式跟 COUNT、或 COUNTA 差不多
語法:
Function COUNT_NR2(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NR2 ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以 (數值 + 字串) 為條件的計算資料出現的次數,
  ' 當有重複的(值)時後,該值只計算一次。
  ' 使用方式、功能類似於 COUNT、或 COUNTA 內建函數。
  '
  ' Value:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NR2 = Count
End Function


COUNT_NRS 以 (數值 + 字串) 為條件的統計計算方式,以 (模式) 選擇條件的統計計
算方式,基本用法 OUNT_NRS(模式,數值,數值,…)
模式一定要有,不可以略過 0~2
0 表示以(數值)計算。
1 表示以(字串)計算。
2 表試以(數值 + 字串)計算

後面的 數值 部份則可以如 SUM 一樣的選取。
語法:
Function COUNT_NRS(ByVal mode As Byte, ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRS ver. 1b
  '     動作1:資料選擇範圍
  '
  ' 以 (模式) 選擇條件的計算資料出現的次數,
  ' 當有重複的(值)時後,該值只計算一次。
  ' 使用方式、功能類似於 COUNTIF 內建函數。
  ' 引數的使用方式 類似於 函數(模式,值,值,…)
  ' Mode:
  '       0 表示以(數值)計算。COUNT_NRS(0,A1:B8,111,566)
  '       1 表示以(字串)計算。COUNT_NRS(1,A1:B8,C1,D5,"ABC","AAV")
  '       2 表試以(數值 + 字串)計算。COUNT_NRS(2,A1:B8,C1,D5,111,"AAV")
  ' Value:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
 Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    Select Case mode
      Case 0
        GoTo term_1
      Case 1
        GoTo term_2
      Case 2
        GoTo term_3
      Case Else
        GoTo term_3
    End Select
term_1:
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    GoTo term_Next
term_2:
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_3:
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_Next:
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRS = Count
End Function

此帖於 2015-06-16 09:11 PM 被 getter 編輯. 原因: 修改程式註解,部份文字
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
有 2 位會員向 getter 送花:
a471 (2015-06-16),atie (2015-06-15)
感謝您發表一篇好文章
舊 2015-06-17, 12:43 PM   #3 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設 給 Excel 自訂函數加 [描述] 說明

參考一:替 [自定義函數] 添加 [描述]

作法基本上是在「VBA 編輯器」下
1.檔案功能表的「檢視\瀏覽物件」或是按下 [F2] 按鍵。
2.畫面中的 [All Libraries] 下拉選單,選項改成 [VBAProject]。
3.在 [物件類別] 視窗內點選自訂函數的模組名稱(預設通常是 Module1 )。
3.在 [成員] 視窗內右鍵點選該自訂函數。
4.在跳出的功能表中選擇 [屬性],則出現 [成員選項] 對話方塊。
5.在 [描述(D)] 文字框內輸入 “描述文字”
6.按 [確定] 按鈕完成程序

文中作者發現? 咦!當完成上述步驟後,回工作表視窗去點選 [插入函數],
在 [使用者定義] 類別找到該函數時,發現並未出現剛剛輸入的“描述”?

7.當步驟 6 好了後,在該模組下的程式編輯視窗,隨便加個 Sub/Function 程序(空的也行)後,
 再去看看就出現了!

隨便加個 Sub/Function 程序:
語法:
Sub a123()

End Sub
或是

語法:
Function a123()

End Function
8.當確認過後,可以試著把這個隨便加個 Sub/Function 程序,砍掉在試試。ok 就可以存檔了。




之後有提到一個,用 VBA Sub 程式來添加 [描述] 說明,直接有效。
其程式碼如下

比較正式的寫法
語法:
Sub addDescription()
Application.MacroOptions Macro:="自訂函數的 [名稱]", _ 
                                     Description:="自訂函數的 [描述說明]"
End Sub
或是

語法:
Sub addDescription()
Application.MacroOptions "自訂函數的 [名稱]", _
                 Description:="自訂函數的 [描述說明]"
End Sub

這個增加 addDescription 是一個手動巨集,換言之還要到巨集裡面去執行這個
「addDescription 」巨集程式,最少一次才會有效,執行過後要記得存檔,不然
下次重開活頁簿要又要去執行該巨集程式。
可以把這個名稱改成 Auto_Open 的話。在開啟該活頁簿的同時也會同時執行。



其實這是使用了 Application.MacroOptions 的功能 MSDN 詳細中文說明
使用方式也是另外找到 ArgumentDescriptions:=[{"引數 1 的說明","引數 1 的說明", ...}]

其對應就是,依序對應到實際的引數上面。若是 Array 型的引數,只有一個引數說明時
全部共用一個。若試只有少數幾個時,前面照順序排列,之後沒有的公共最後一筆引數
說明。

這個 ArgumentDescriptions 經過測試 Excel 2003 不能使用,只有新版本的,如
Excel 2010、2013 才能用。Excel 2007 迪西不知道,也許可以。

比較正式的寫法
語法:
Sub addDescription()
Application.MacroOptions Macro:="自訂函數的 [名稱]", _ 
                                     Description:="自訂函數的 [描述說明]", _
                                     ArgumentDescriptions:=[{"引數 1 的說明","引數 1 的說明", ...}]
End Sub
或是

語法:
Sub addDescription()
Application.MacroOptions "自訂函數的 [名稱]", _
                 Description:="自訂函數的 [描述說明]", _
                 ArgumentDescriptions:=[{"引數 1 的說明","引數 1 的說明", ...}]
End Sub

Excel 2003 的要給引數加說明的方式,經過找尋文章測試,不是很理想,就不舉例了。

─────────────────────────────────────────────────────────

參考二:如何讓Excel的自訂函數顯示說明文字

基本上就是 Application.MacroOptions 的功能

參考二經過測試會無效的原因是,這個 DescribeFunction 是一個手動巨集,換言之還
要到巨集裡面去執行這個「DescribeFunction」巨集程式,最少一次才會有效,執行過
後要記得存檔,不然下次重開活頁簿要又要去執行該巨集程式。
可以把這個名稱改成 Auto_Open 的話。在開啟該活頁簿的同時也會同時執行。

─────────────────────────────────────────────────────────

VBA 自訂函數的 匯入、匯出、移除

寫好的相關「自訂函數」要匯出,在 「VBA 編輯器」下面
1.在專案小試窗上面,點選「模組」裡面的「模組名稱」。可以是巨集指令的,也可以是
 自訂函數的「模組名稱」。預設通常是 Module1。
2.接就是「檔案\匯出檔案」或是直接按下滑鼠右鍵,選「匯出檔案」。
3.會得到一個「模組名稱」.bas 的檔案,當然檔名可以再改。


當然也可以匯入,在 「VBA 編輯器」下面
「檔案\匯入檔案」。或是蠆在在專案小試窗上面的空白處,按下滑鼠右鍵,選「匯入檔案」。


有匯入、匯出,表示就會有「移除」,在 「VBA 編輯器」下面
1.在專案小試窗上面,點選「模組」裡面的「模組名稱」。可以試巨集指令的,也可以是
 自訂函數的「模組名稱」。預設通常是 Module1。
2.接就是「移除 XXX模組名稱」或是直接按下滑鼠右鍵,選「移除 XXX模組名稱」。

會問你要不要先從存成檔案在移除。這個就看人了。

此帖於 2015-06-18 01:21 PM 被 getter 編輯.
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
向 getter 送花的會員:
a471 (2015-06-17)
感謝您發表一篇好文章
舊 2015-06-17, 12:55 PM   #4 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

以本樓的問題,迪西加上說明描述後的程式

Excel 2003:

COUNT_NR2:數值和字串
語法:
Sub Auto_Open()
  ' COUNT_NR2 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NR2", _
  Description:="以數值和字串為條件,計算不包含重複資料出現的次數。參考 COUNT、COUNTA。" & Chr(13) & Chr(10) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"
End Sub


Function COUNT_NR2(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NR2 ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值和字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT、COUNTA 內建函數。
  '
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NR2 = Count
End Function

COUNT_NRA:字串
語法:
Sub Auto_Open()
  ' COUNT_NRA 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRA", _
  Description:="以字串為條件,計算不包含重複資料出現的次數。參考 COUNTA。" & Chr(13) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"
End Sub


Function COUNT_NRA(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRA ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTA 內建函數。
  '
  ' Value, …:可以是 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRA = Count
End Function

COUNT_NRN:數值
語法:
Sub Auto_Open()
  ' COUNT_NRN 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRN", _
  Description:="以數值為條件,計算不包含重複資料出現的次數。參考 COUNT。" & Chr(13) & Chr(10) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"
End Sub


Function COUNT_NRN(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRN ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT 內建函數。
  '
  ' Value, …:可以是 (數值)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRN = Count
End Function

COUNT_NRS:模式選擇
語法:
Sub Auto_Open()
  ' COUNT_NRS 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRS", _
  Description:="以模式選擇過濾條件,計算不包含重複資料出現的次數。" & Chr(13) & Chr(10)) & _
               "  Mode:0 表示以數值計算。 1 表示以字串計算。 2 表示以數值和字串計算。" & Chr(13) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"
End Sub


Function COUNT_NRS(ByVal Mode As Byte, ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRS ver. 1b
  '     動作1:資料選擇範圍
  '
  ' 以模式選擇過濾條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTIF 內建函數。
  ' 引數的使用方式 類似於 函數(模式,值,值,…)
  ' Mode:0 表示以(數值)計算。COUNT_NRS(0,A1:B8,111,566)
  '       1 表示以(字串)計算。COUNT_NRS(1,A1:B8,C1,D5,"ABC","AAV")
  '       2 表示以(數值和字串)計算。COUNT_NRS(2,A1:B8,C1,D5,111,"AAV")
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
 Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    Select Case Mode
      Case 0
        GoTo term_1
      Case 1
        GoTo term_2
      Case 2
        GoTo term_3
      Case Else
        GoTo term_3
    End Select
term_1:
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    GoTo term_Next
term_2:
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_3:
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_Next:
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRS = Count
End Function

4 個函數一起
語法:
Sub Auto_Open()
  ' COUNT_NR2 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NR2", _
  Description:="以數值和字串為條件,計算不包含重複資料出現的次數。參考 COUNT、COUNTA。" & Chr(13) & Chr(10) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"

  ' COUNT_NRN 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRN", _
  Description:="以數值為條件,計算不包含重複資料出現的次數。參考 COUNT。" & Chr(13) & Chr(10) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"

  ' COUNT_NRA 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRA", _
  Description:="以字串為條件,計算不包含重複資料出現的次數。參考 COUNTA。" & Chr(13) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"

  
  ' COUNT_NRS 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRS", _
  Description:="以模式選擇過濾條件,計算不包含重複資料出現的次數。" & Chr(13) & Chr(10)) & _
               "  Mode:0 表示以數值計算。 1 表示以字串計算。 2 表示以數值和字串計算。" & Chr(13) & Chr(10) & _
               "  Value, …:可以是數值、字串、單一參照值、連續參照值。"
End Sub


Function COUNT_NR2(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NR2 ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值和字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT、COUNTA 內建函數。
  '
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NR2 = Count
End Function


Function COUNT_NRN(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRN ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT 內建函數。
  '
  ' Value, …:可以是 (數值)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRN = Count
End Function


Function COUNT_NRA(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRA ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTA 內建函數。
  '
  ' Value, …:可以是 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRA = Count
End Function


Function COUNT_NRS(ByVal Mode As Byte, ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRS ver. 1b
  '     動作1:資料選擇範圍
  '
  ' 以模式選擇過濾條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTIF 內建函數。
  ' 引數的使用方式 類似於 函數(模式,值,值,…)
  ' Mode:0 表示以(數值)計算。COUNT_NRS(0,A1:B8,111,566)
  '       1 表示以(字串)計算。COUNT_NRS(1,A1:B8,C1,D5,"ABC","AAV")
  '       2 表示以(數值和字串)計算。COUNT_NRS(2,A1:B8,C1,D5,111,"AAV")
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
 Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    Select Case Mode
      Case 0
        GoTo term_1
      Case 1
        GoTo term_2
      Case 2
        GoTo term_3
      Case Else
        GoTo term_3
    End Select
term_1:
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    GoTo term_Next
term_2:
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_3:
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_Next:
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRS = Count
End Function
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
向 getter 送花的會員:
a471 (2015-06-17)
感謝您發表一篇好文章
舊 2015-06-17, 01:01 PM   #5 (permalink)
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

以本樓的問題,迪西加上說明描述後的程式

Excel 2010:

COUNT_NR2:數值和字串
語法:
Sub Auto_Open()
  ' COUNT_NR2 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NR2", _
  Description:="以數值和字串為條件,計算不包含重複資料出現的次數。參考 COUNT、COUNTA。", _
  ArgumentDescriptions:=[{":可以是數值、字串、單一參照值、連續參照值。"}]
End Sub


Function COUNT_NR2(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NR2 ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值和字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT、COUNTA 內建函數。
  '
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NR2 = Count
End Function

COUNT_NRA:字串
語法:
Sub Auto_Open()
  ' COUNT_NRA 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRA", _
  Description:="以字串為條件,計算不包含重複資料出現的次數。參考 COUNTA。", _
  ArgumentDescriptions:=[{":可以是數值、字串、單一參照值、連續參照值。"}]
End Sub


Function COUNT_NRA(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRA ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTA 內建函數。
  '
  ' Value, …:可以是 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRA = Count
End Function

COUNT_NRN:數值
語法:
Sub Auto_Open()
  ' COUNT_NRN 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRN", _
  Description:="以數值為條件,計算不包含重複資料出現的次數。參考 COUNT。", _
  ArgumentDescriptions:=[{":可以是數值、字串、單一參照值、連續參照值。"}]
End Sub


Function COUNT_NRN(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRN ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT 內建函數。
  '
  ' Value, …:可以是 (數值)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRN = Count
End Function

COUNT_NRS:模式選擇
語法:
Sub Auto_Open()
  ' COUNT_NRS 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRS", _
  Description:="以模式選擇過濾條件,計算不包含重複資料出現的次數。", _
  ArgumentDescriptions:=[{":0 表示以數值計算。 1 表示以字串計算。 2 表示以數值和字串計算。",":可以是數值、字串、單一參照值、連續參照值"}]
End Sub


Function COUNT_NRS(ByVal Mode As Byte, ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRS ver. 1b
  '     動作1:資料選擇範圍
  '
  ' 以模式選擇過濾條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTIF 內建函數。
  ' 引數的使用方式 類似於 函數(模式,值,值,…)
  ' Mode:0 表示以(數值)計算。COUNT_NRS(0,A1:B8,111,566)
  '       1 表示以(字串)計算。COUNT_NRS(1,A1:B8,C1,D5,"ABC","AAV")
  '       2 表示以(數值和字串)計算。COUNT_NRS(2,A1:B8,C1,D5,111,"AAV")
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
 Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    Select Case Mode
      Case 0
        GoTo term_1
      Case 1
        GoTo term_2
      Case 2
        GoTo term_3
      Case Else
        GoTo term_3
    End Select
term_1:
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    GoTo term_Next
term_2:
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_3:
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_Next:
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRS = Count
End Function

4 個函數一起
語法:
Sub Auto_Open()
  ' COUNT_NR2 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NR2", _
  Description:="以數值和字串為條件,計算不包含重複資料出現的次數。參考 COUNT、COUNTA。", _
  ArgumentDescriptions:=[{":可以是數值、字串、單一參照值、連續參照值。"}]

  ' COUNT_NRN 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRN", _
  Description:="以數值為條件,計算不包含重複資料出現的次數。參考 COUNT。", _
  ArgumentDescriptions:=[{":可以是數值、字串、單一參照值、連續參照值。"}]

  ' COUNT_NRA 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRA", _
  Description:="以字串為條件,計算不包含重複資料出現的次數。參考 COUNTA。", _
  ArgumentDescriptions:=[{":可以是數值、字串、單一參照值、連續參照值。"}]
  
  ' COUNT_NRS 自動載入 [描述] 說明
  Application.MacroOptions Macro:="COUNT_NRS", _
  Description:="以模式選擇過濾條件,計算不包含重複資料出現的次數。", _
  ArgumentDescriptions:=[{":0 表示以數值計算。 1 表示以字串計算。 2 表示以數值和字串計算。",":可以是數值、字串、單一參照值、連續參照值"}]
End Sub


Function COUNT_NR2(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NR2 ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值和字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT、COUNTA 內建函數。
  '
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NR2 = Count
End Function


Function COUNT_NRN(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRN ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以數值為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNT 內建函數。
  '
  ' Value, …:可以是 (數值)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRN = Count
End Function


Function COUNT_NRA(ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRA ver. 1a
  '     動作1:資料選擇範圍
  '
  ' 以字串為條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTA 內建函數。
  '
  ' Value, …:可以是 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
  Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear
  
  For i = LBound(Value_new) To UBound(Value_new)
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i

  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRA = Count
End Function


Function COUNT_NRS(ByVal Mode As Byte, ParamArray Value() As Variant)
  '═════════════════════════
  '     COUNT_NRS ver. 1b
  '     動作1:資料選擇範圍
  '
  ' 以模式選擇過濾條件的計算資料出現的次數,
  ' 當有重複的 (值) 時後,該值只計算一次。
  ' 參考 COUNTIF 內建函數。
  ' 引數的使用方式 類似於 函數(模式,值,值,…)
  ' Mode:0 表示以(數值)計算。COUNT_NRS(0,A1:B8,111,566)
  '       1 表示以(字串)計算。COUNT_NRS(1,A1:B8,C1,D5,"ABC","AAV")
  '       2 表示以(數值和字串)計算。COUNT_NRS(2,A1:B8,C1,D5,111,"AAV")
  ' Value, …:可以是 (數值) 或 (字串)、單一參照值、連續參照值,
  ' 數量尚最少 1 個,多個資料時,以 "," 區分。
  '═════════════════════════
 Dim i, j, Count, arg, Value_new() As Variant
  On Error Resume Next
  
  Count = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Count = Count + 1
    Next arg
  Next i
  Err.Clear
  
  ReDim Value_new(Count - 1)
  
  j = 0
  For i = LBound(Value) To UBound(Value)
    Err.Clear
    For Each arg In Value(i)
      Value_new(j) = arg
      j = j + 1
    Next arg
    If Err.Number = 92 Then Value_new(j - 1) = Value(i)
  Next i
  Err.Clear

  For i = LBound(Value_new) To UBound(Value_new)
    Select Case Mode
      Case 0
        GoTo term_1
      Case 1
        GoTo term_2
      Case 2
        GoTo term_3
      Case Else
        GoTo term_3
    End Select
term_1:
    If WorksheetFunction.IsNumber(Value_new(i)) = False Then Value_new(i) = ""
    GoTo term_Next
term_2:
    If WorksheetFunction.IsNonText(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_3:
    If WorksheetFunction.IsLogical(Value_new(i)) Then Value_new(i) = ""
    GoTo term_Next
term_Next:
    If i = UBound(Value_new) Then Exit For
    For j = i + 1 To UBound(Value_new)
      If Value_new(i) = "" Then Exit For
      If Value_new(i) = Value_new(j) Then Value_new(j) = ""
    Next j
  Next i
  
  Count = 0
  For Each arg In Value_new
    If arg <> "" Then Count = Count + 1
  Next arg
  COUNT_NRS = Count
End Function
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
有 2 位會員向 getter 送花:
a471 (2015-06-17),atie (2015-06-18)
感謝您發表一篇好文章
發文 回覆



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

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
請問Excel列印的問題 Ken1655 軟體應用問題討論區 3 2004-05-23 09:23 AM
EXCEL VBA專案被鎖?? suchunta 軟體應用問題討論區 0 2004-05-19 04:29 PM
EXCEL 文件中有可以一次大量更改 超鏈結 的方法嗎!? 995 一般電腦疑難討論區 12 2003-11-27 11:50 AM
Microsoft Excel 問題 ascendaniel 一般電腦疑難討論區 3 2003-11-21 10:08 PM


所有時間均為台北時間。現在的時間是 05:29 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1