- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
8#
發表於 2022-11-7 10:24
| 只看該作者
本帖最後由 Andy2483 於 2022-11-7 10:34 編輯
回復 7# 准提部林
謝謝前輩指導
後學初步認識Function 自訂義函數,原來它可以用在VBA程式碼裡,也可以當儲存格公式的函數
以下學習心得註解請前輩再指導!
Function GetRangeColor(xA As Range, xArea As Range, xType%)
'↑Function()函數 程式是一系列的 Visual Basic 語句,由 Function 和 End 函數 語句所括住。
'函數 程式與 副程式 類似,但函數也可以傳回值。
'(xA As Range, xArea As Range, xType%)=(顏色格,資料區域,計算模式)
'以下以[E3]為例: =GetRangeColor($D3,$A$1:$A$25,E$1)
'顏色格(xA):$D3 >>指定[D3]儲存格!是因為設計者在後方程序會判讀此格底色 (黃色)
'注意的是:不是因為[D3]儲存格裡有 "黃" 這個字! 是程式判讀此格底色是黃色
'資料區域(xArea):$A$1:$A$25 >>指定這個區域儲存格!是因為設計者在後方程式裡
',判讀哪幾格的底色跟[D3]的底色一樣作為條件
'計算模式(xType):E$1 >>指定設計者統計的哪一個值!設計者在後方程式裡統計了
'合計 個數 平均值 最大值 最小值 >>使用者可以由 1~5 指定
'也可以直接輸入1 =GetRangeColor($D3,$A$1:$A$25,1)
'為什麼不直接輸入 1? 因為如果其它儲存格也用[E1]當變數!把[E1]改2 就會一起變!不必一一改
'結論:判讀 $A$1:$A$25 儲存格裡,如果底色是黃色,就在 [E3]儲存格 顯示 合計 值
Dim xR As Range, X, S(5), C&
'↑宣告變數,S(5)是批次宣告從S(0)~S(5) 共六個
Application.Volatile
'↑將使用者定義的函數標示為易變。
'每當工作表上任何儲存格發生計算時,都必須重新計算易變函數。
X = xA.Interior.ColorIndex
'↑以[E3]為例:此處已經給 GetRangeColor函數第一個值 6(黃色)
For Each xR In xArea
'↑設順迴圈! 令xR是 資料區域(xArea)裡的一員
If xR.Interior.ColorIndex = X Then
'↑以[E3]為例:如果[A1]是X(黃色) ?? [A1]是黃底!儲存格值是 51
S(0) = Val(xR.Value)
'↑以[E3]為例:就讓第一個S變數是 [A1]的運算值 51
S(1) = S(1) + S(0) '合計
'↑以[E3]為例:讓第二個S變數累加 第一個S變數0+51=51
S(2) = S(2) + 1 '個數
'↑以[E3]為例:讓第三個S變數累加 0+1 = 1
If S(2) > 0 Then S(3) = S(1) / S(2) '平均值
'↑如果第三個S變數大於 0 ??就讓第四個S變數= 第一個S變數/第二個S變數
'↑以[E3]為例:(51/1)=51
'因為如果除式的分母是 0 除式的商值是無限大!這要多一個If 判斷式避掉!
If S(0) > S(4) Then S(4) = S(0) '最大值
'↑如果第一個S變數大於 第五個S變數! 就第五個S變數就換裝第一個S變數
If S(5) = Empty Or S(0) < S(5) Then S(5) = S(0) '最小值
'↑如果第六個S變數是初始值或 第一個S變數小於 第六個S變數!
'就第六個S變數就換裝第一個S變數
End If
Next
GetRangeColor = S(xType)
'↑使用 GetRangeColor 這個自訂義函數!
'條件完整!就讓儲存格或副程式計算值!否則就該偵錯囉!
'如果觸發功能是失效模式 Application.EnableEvents = False,
'GetRangeColor函數也會失效!有失真的疑慮!所以用於儲存格公式裡時!要注意!
End Function
Sub TTT()
Dim C As Range, AR As Range, T%
Set C = [SHEET1!D3]: Set AR = [SHEET1!A1:A25]: T = 1
MsgBox "[E3]儲存格統計[A1:A25]黃底格合計值" & GetRangeColor(C, AR, T)
End Sub
|
|