冰淇
Lv 6
冰淇 發問時間: 電腦與網際網路軟體 · 8 年前

用execel-vba計算連續數字 如何程式精簡

原題見

用execel-vba計算連續數字

http://tw.knowledge.yahoo.com/question/question?qi...

檔案見

http://www.funp.net/95642

可否請准提部林 大大精修

謝謝

已更新項目:

請問准大

xR(2,1) 和 xR.offset(1,0) 是否相同

並請準大

將意見移至回答區

謝謝

2 個解答

評分
  • 8 年前
    最佳解答

    Sub 統計連續正負值()

    Dim xR As Range, uS1, uS2, uS3

    For Each xR In Range("A1", [A65536].End(xlUp))

      uS1 = xR + uS1

      If xR * xR(2, 1) > 0 Then GoTo 101

      If xR > 0 And uS1 > uS2 Then uS2 = uS1

      If xR < 0 And uS1 < uS3 Then uS3 = uS1

      uS1 = 0

    101: Next

    [C1] = uS2: [C2] = uS3

    End Sub

    2012-07-05 22:01:59 補充:

    冰大:

    xR(2,1)  > xR.Cells(2,1) 的簡略,同 xR.offset(1,0)

    我慣用 Cells!offset 幾乎不用在程式碼中,看個人或情況擇用即可!

    2012-07-05 22:17:41 補充:

    看了一下您的原碼,中規中矩!

    在迴圈部份,我一定會抓出最後一筆資料的位置,再跑迴圈,

    Do ~ Loop Until 一般我不用,除非無法判斷資料列數,

    因為有時資料中間存在著〔空格〕!

    至於〔解題邏輯〕,各有各的,不能依此論高低,

    這題我這樣解,下次遇到類似的,可能又是另一邏輯解法!

    在〔函數〕上的經驗,可輔成VBA,可惜目前多位大師已鮮少出手,

    他們的函數解,值得一學!

    到〔Worlon.大師〕的知識+個人首頁翻翻,應可找到很多精彩公式!

    VBA部份,〔東邪.大師〕的程式碼,若能學一兩手,可進階的!

    2012-07-06 12:37:07 補充:

    EXCEL VBA.統計〔連續正數或負數〕,取出〔最大.最小〕和值

                           <.准提部林.>

    -------------------------------

    ■程式碼:

     Sub 統計連續正負值()

     Dim xR As Range, uS1, uS2, uS3

     For Each xR In Range("A1", [A65536].End(xlUp))

       uS1 = xR + uS1

       If xR * xR(2, 1) > 0 Then GoTo 101

       If xR > 0 And uS1 > uS2 Then uS2 = uS1

       If xR < 0 And uS1 < uS3 Then uS3 = uS1

       uS1 = 0

     101: Next

     [C1] = uS2: [C2] = uS3

     End Sub

     

    ■範例說明:

    數值VBA 流程23uS1=uS1+A1=23.A1*A2>0 (Y).NEXT35uS1=uS1+A2=58.A2*A3>0 (N).uS1>uS2.uS2 = 58.uS1=0-56uS1=uS1+A3=-56.A3*A4>0 (Y).NEXT-41uS1=uS1+A4=-97.A4*A5>0 (N).uS1<uS3.uS3 = -97.uS1=026uS1=uS1+A5=26.A5*A6>0 (Y).NEXT10uS1=uS1+A6=36.A6*A7>0 (Y).NEXT54uS1=uS1+A7=90.A7*A8>0 (N).uS1>uS2.uS2 = 90.uS1=0-2uS1=uS1+A8=-2.A8*A9>0 (Y).NEXT-10uS1=uS1+A9=-12.A9*A10>0 (Y).NEXT-14uS1=uS1+A10=-26.A10*A11>0 (N).uS3<uS1.uS3 = -97.uS1=012uS1=uS1+A11=12.A11*A12>0 (Y).NEXT33uS1=uS1+A12=45.A12*A13>0 (N).uS2>uS1.uS2 = 90.uS1=0

    -------------------------------

  • 8 年前

    程式的源碼是很精簡了,的確不錯的作品。

    拙見供參:

    源碼精簡,未必對執行效率有助益。

    If xR * xR(2, 1) > 0 Then GoTo 101 這式子有二個地方可優化:

    1.判斷式 xR * xR(2, 1) > 0 用到了較耗時的乘法,可用他法替代。

    2.GoTo 非必要,少用。

    另外存在著程式邏輯的贅餘,若能再加改善就更好了。

還有問題?馬上發問,尋求解答。