返回列表 上一主題 發帖

[發問] 連續N筆資料判別

其實有些寫法我真的看不懂
但我都用測試的方式來理解各位的語言
VBA真是一條不歸路 (誤
莫讓他人錯誤傷害自己

TOP

回復  准提部林

感謝準大糾正XD

其實我已發現問題了,只是懶的改~

想說讀資料與寫資料都用同一個 ...
n7822123 發表於 2021-1-1 16:33



If Brr(R, 1) <> T Then T = Brr(R, 1): S = T
這一行我讀不懂
測試如果把它移除,就不會出現"連續小" 的標記跟訊息
Brr(R, 1) <> T ( T是從何而來?
莫讓他人錯誤傷害自己

TOP

本帖最後由 luhpro 於 2021-1-6 23:57 編輯
If Brr(R, 1)  T Then T = Brr(R, 1): S = T
If Brr(R, 1) <> T Then T = Brr(R, 1): S = T
這一行我讀不懂
測試如果把它移除,就不會出現"連續小" 的標記跟訊息
Brr(R, 1) <> T ( T是從何而來?
y54161212 發表於 2021-1-6 14:43

這種比較簡單的概念我就代勞一下:
程式開頭就定義了 T% 表示它是個整數,
一開始沒特別去賦值時預設值是0,
也就是說第1次是跟0比較.

  Brr(R, 1) = IIf(Arr(R, 1) > CL, 1, -1) ' 比較後指定加減數
  S = S + Brr(R, 1) ' 大於時 + 1, 小於時 - 1, 加到 +8 或 -8 時就是連續8次 大於 或 小於 了
  If S = N Then 連續大 = True: S = S - 1: Brr(R, 2) = 1  ' 這裡是 "大於" 區 S=8後 S=S-1 就變回 7, 下次再加1就又=8 可再次觸發本行的條件
  If S = -N Then 連續小 = True: S = S + 1: Brr(R, 3) = 1 ' "小於" 區, 原理同上.
  If Brr(R, 1) <> T Then T = Brr(R, 1): S = T  ' 其實就是保存本次的值以備下一次比較是不是值不同了用.

這裡順便也提供一下我當時修改後的解法, (以3#做母版修改)
嘗試改成顯示 0 而不是 -1 作實現.
  1. Sub 判斷品質異常()
  2. Const N = 7   '設定連續次數
  3. Dim Rn&, R%, S%, T%, CL!
  4. Dim 連續大 As Boolean, 連續小 As Boolean
  5. Rn = Cells(Rows.Count, 1).End(xlUp).Row - 2
  6. If Rn < 1 Then Exit Sub
  7. CL = [C1]
  8. With [C3].Resize(Rn, 3)
  9.   Arr = .Offset(, -2).Resize(, 5).Value
  10.   .ClearContents
  11. End With
  12. For R = 1 To Rn
  13.   Arr(R, 3) = IIf(Arr(R, 1) > CL, 1, 0)
  14.   S = S + (Arr(R, 3) = 0) * 2 + 1
  15.   If S = N Then S = S - 1: 連續大 = True: Arr(R, 4) = 1
  16.   If S = -N Then S = S + 1: 連續小 = True: Arr(R, 5) = 1
  17.   If Arr(R, 3) <> T Then T = Arr(R, 3): S = T
  18. Next R
  19. [A3].Resize(Rn, 5) = Arr
  20. If 連續大 Then MsgBox "連續7點在中心線同側(大於)"
  21. If 連續小 Then MsgBox "連續7點在中心線同側(小於)"
  22. End Sub
複製代碼

TOP

這種比較簡單的概念我就代勞一下:
程式開頭就定義了 T% 表示它是個整數,
一開始沒特別去賦值時預設值是 ...
luhpro 發表於 2021-1-6 23:32



  Brr(R, 1) = IIf(Arr(R, 1) > CL, 1, -1)
  S = S + Brr(R, 1) : MsgBox S
'If S = N Then 連續大 = True: S = S - 1: Brr(R, 2) = 1  
'If S = -N Then 連續小 = True: S = S + 1: Brr(R, 3) = 1 '
  If Brr(R, 1) <> T Then T = Brr(R, 1) : MsgBox T: S = T  :MsgBox S

昨天用這種方式
終於搞懂了最後一行的意義....

謝謝您的協助編寫註解
莫讓他人錯誤傷害自己

TOP

        靜思自在 : 心中常存善解、包容、感思、知足、惜福。
返回列表 上一主題