Board logo

標題: 請教一下!下列的語法可用迴圈來簡化嗎? [打印本頁]

作者: skyutm    時間: 2012-8-23 22:35     標題: 請教一下!下列的語法可用迴圈來簡化嗎?

各位先進大家好!小弟為了設計成績系統依然繼續努力中,但在此又有一個問題想請教,請問一下,下列的語法可以用迴圈簡化嗎?應該怎麼寫。
Sub Worksheet_Change(ByVal Target As Range) '國語成績'
    Dim ch1 As Integer, ch2 As Integer, ch3 As Integer, ch4 As Integer, chsc1 As Integer, chsc2 As Integer, chsc3 As Integer, chsc4 As Integer
    ch1 = Worksheets("基本設定").Range("e2").Value
    ch2 = Worksheets("基本設定").Range("f2").Value
    ch3 = Worksheets("基本設定").Range("g2").Value
    ch4 = Worksheets("基本設定").Range("h2").Value
    chsc1 = Worksheets("期中評量").Range("c3").Value
    chsc2 = Worksheets("期中評量").Range("h3").Value
    chsc3 = Worksheets("期中評量").Range("i3").Value
    chsc4 = Worksheets("期中評量").Range("j3").Value
    Worksheets("期中成績").Range("c5").Value = (chsc1 * ch1 + chsc2 * ch2 + chsc3 * ch3 + chsc4 * ch4) / 100
End Sub

http://www.FunP.Net/795776
作者: skyutm    時間: 2012-8-24 00:29

補充一下,就是這一大串
Worksheets("期中成績").Range("c5").Value = (Range("c3") * ch1 + Range("h3") * ch2 + Range("i3") * ch3 + Range("j3") * ch4) / 100
    Worksheets("期中成績").Range("c6").Value = (Range("c4") * ch1 + Range("h4") * ch2 + Range("i4") * ch3 + Range("j4") * ch4) / 100
    Worksheets("期中成績").Range("c7").Value = (Range("c5") * ch1 + Range("h5") * ch2 + Range("i5") * ch3 + Range("j5") * ch4) / 100
    Worksheets("期中成績").Range("c8").Value = (Range("c6") * ch1 + Range("h6") * ch2 + Range("i6") * ch3 + Range("j6") * ch4) / 100
    Worksheets("期中成績").Range("c9").Value = (Range("c7") * ch1 + Range("h7") * ch2 + Range("i7") * ch3 + Range("j7") * ch4) / 100
    Worksheets("期中成績").Range("c10").Value = (Range("c8") * ch1 + Range("h8") * ch2 + Range("i8") * ch3 + Range("j8") * ch4) / 100
    Worksheets("期中成績").Range("c11").Value = (Range("c9") * ch1 + Range("h9") * ch2 + Range("i9") * ch3 + Range("j9") * ch4) / 100
    Worksheets("期中成績").Range("c12").Value = (Range("c10") * ch1 + Range("h10") * ch2 + Range("i10") * ch3 + Range("j10") * ch4) / 100
    Worksheets("期中成績").Range("c13").Value = (Range("c11") * ch1 + Range("h11") * ch2 + Range("i11") * ch3 + Range("j11") * ch4) / 100
    Worksheets("期中成績").Range("c14").Value = (Range("c12") * ch1 + Range("h12") * ch2 + Range("i12") * ch3 + Range("j12") * ch4) / 100
    Worksheets("期中成績").Range("c15").Value = (Range("c13") * ch1 + Range("h13") * ch2 + Range("i13") * ch3 + Range("j13") * ch4) / 100
    Worksheets("期中成績").Range("c16").Value = (Range("c14") * ch1 + Range("h14") * ch2 + Range("i14") * ch3 + Range("j14") * ch4) / 100
    Worksheets("期中成績").Range("c17").Value = (Range("c15") * ch1 + Range("h15") * ch2 + Range("i15") * ch3 + Range("j15") * ch4) / 100
    Worksheets("期中成績").Range("c18").Value = (Range("c16") * ch1 + Range("h16") * ch2 + Range("i16") * ch3 + Range("j16") * ch4) / 100
    Worksheets("期中成績").Range("c19").Value = (Range("c17") * ch1 + Range("h17") * ch2 + Range("i17") * ch3 + Range("j17") * ch4) / 100
    Worksheets("期中成績").Range("c20").Value = (Range("c18") * ch1 + Range("h18") * ch2 + Range("i18") * ch3 + Range("j18") * ch4) / 100
    Worksheets("期中成績").Range("c21").Value = (Range("c19") * ch1 + Range("h19") * ch2 + Range("i19") * ch3 + Range("j19") * ch4) / 100
    Worksheets("期中成績").Range("c22").Value = (Range("c20") * ch1 + Range("h20") * ch2 + Range("i20") * ch3 + Range("j20") * ch4) / 100
    Worksheets("期中成績").Range("c23").Value = (Range("c21") * ch1 + Range("h21") * ch2 + Range("i21") * ch3 + Range("j21") * ch4) / 100
    Worksheets("期中成績").Range("c24").Value = (Range("c22") * ch1 + Range("h22") * ch2 + Range("i22") * ch3 + Range("j22") * ch4) / 100
    Worksheets("期中成績").Range("c25").Value = (Range("c23") * ch1 + Range("h23") * ch2 + Range("i23") * ch3 + Range("j23") * ch4) / 100
    Worksheets("期中成績").Range("c26").Value = (Range("c24") * ch1 + Range("h24") * ch2 + Range("i24") * ch3 + Range("j24") * ch4) / 100
    Worksheets("期中成績").Range("c27").Value = (Range("c25") * ch1 + Range("h25") * ch2 + Range("i25") * ch3 + Range("j25") * ch4) / 100
    Worksheets("期中成績").Range("c28").Value = (Range("c26") * ch1 + Range("h26") * ch2 + Range("i26") * ch3 + Range("j26") * ch4) / 100
    Worksheets("期中成績").Range("c29").Value = (Range("c27") * ch1 + Range("h27") * ch2 + Range("i27") * ch3 + Range("j27") * ch4) / 100
    Worksheets("期中成績").Range("c30").Value = (Range("c28") * ch1 + Range("h28") * ch2 + Range("i28") * ch3 + Range("j28") * ch4) / 100
    Worksheets("期中成績").Range("c31").Value = (Range("c29") * ch1 + Range("h29") * ch2 + Range("i29") * ch3 + Range("j29") * ch4) / 100
    Worksheets("期中成績").Range("c32").Value = (Range("c30") * ch1 + Range("h30") * ch2 + Range("i30") * ch3 + Range("j30") * ch4) / 100
    Worksheets("期中成績").Range("c33").Value = (Range("c31") * ch1 + Range("h31") * ch2 + Range("i31") * ch3 + Range("j31") * ch4) / 100
    Worksheets("期中成績").Range("c34").Value = (Range("c32") * ch1 + Range("h32") * ch2 + Range("i32") * ch3 + Range("j32") * ch4) / 100
    Worksheets("期中成績").Range("c35").Value = (Range("c33") * ch1 + Range("h33") * ch2 + Range("i33") * ch3 + Range("j33") * ch4) / 100
    Worksheets("期中成績").Range("c36").Value = (Range("c34") * ch1 + Range("h34") * ch2 + Range("i34") * ch3 + Range("j34") * ch4) / 100
    Worksheets("期中成績").Range("c37").Value = (Range("c35") * ch1 + Range("h35") * ch2 + Range("i35") * ch3 + Range("j35") * ch4) / 100
    Worksheets("期中成績").Range("c38").Value = (Range("c36") * ch1 + Range("h36") * ch2 + Range("i36") * ch3 + Range("j36") * ch4) / 100
    Worksheets("期中成績").Range("c39").Value = (Range("c37") * ch1 + Range("h37") * ch2 + Range("i37") * ch3 + Range("j37") * ch4) / 100
    Worksheets("期中成績").Range("c40").Value = (Range("c38") * ch1 + Range("h38") * ch2 + Range("i38") * ch3 + Range("j38") * ch4) / 100
    Worksheets("期中成績").Range("c41").Value = (Range("c39") * ch1 + Range("h39") * ch2 + Range("i39") * ch3 + Range("j39") * ch4) / 100
    Worksheets("期中成績").Range("c42").Value = (Range("c40") * ch1 + Range("h40") * ch2 + Range("i40") * ch3 + Range("j40") * ch4) / 100
    Worksheets("期中成績").Range("c43").Value = (Range("c41") * ch1 + Range("h41") * ch2 + Range("i41") * ch3 + Range("j41") * ch4) / 100
    Worksheets("期中成績").Range("c44").Value = (Range("c42") * ch1 + Range("h42") * ch2 + Range("i42") * ch3 + Range("j42") * ch4) / 100
作者: GBKEE    時間: 2012-8-24 07:35

回復 2# skyutm
  1. Sub nn()
  2.     Dim I As Integer, ch1 As Integer, ch2 As Integer, ch3 As Integer, ch4 As Integer
  3.     For I = 3 To 43
  4.         Worksheets("期中成績").Range("c" & 5 + I - 3).Value = (Range("c" & I) * ch1 + Range("h" & I) * ch2 + Range("i" & I) * ch3 + Range("j" & I) * ch4) / 100
  5.     Next
  6. End Sub
複製代碼

作者: skyutm    時間: 2012-8-24 13:07

回復 3# GBKEE
感謝版大,我知道哪裡出問題了,我昨天是這樣寫
For I = 3 To 40
Worksheets("期中成績").Range(c&(I+2)).Value = (Range("ci"  ) * ch1 + Range("hi"  ) * ch2 + Range("ii" ) * ch3 + Range("ji" ) * ch4) / 100
原來括號內要這樣寫
Worksheets("期中成績").Range("c" & 5 + I - 3).Value = (Range("c" & I) * ch1 + Range("h" & I) * ch2 + Range("i" & I) * ch3 + Range("j" & I) * ch4) / 100
另外,還想再請教您。有關統計成績的語法,就是說考100分的幾人,考90~99分的幾人....
    '成績統計'
    Dim myrange As Range
    For Each myrange In Worksheets("期中評量").Range("c3", Range("c3").End(xlDown))
    If myrange.Value = 100 Then Worksheets("sheet1").Range("a1") = myrange.Count
    這樣的語法是哪裡該修改?謝謝。
作者: GBKEE    時間: 2012-8-24 14:49

本帖最後由 GBKEE 於 2012-8-24 20:56 編輯

回復 4# skyutm
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng  As String, I As Integer, 分數間格 As Integer, Msg As String
  4.     分數間格 = 10             '也可以間格 5分
  5.     Rng = Worksheets("期中評量").Range("c3", Range("c3").End(xlDown)).Address   '計算範圍的Address
  6.     'Application.Min(Range(Rng)) :最低分-> 還要加1個分數間格 來執行迴圈
  7.     For I = 100 To Application.Min(Range(Rng)) - 分數間格 Step -分數間格 '- : 負數迴圈遞減
  8.         If I = 100 Then
  9.             Msg = "100 = " & Application.Evaluate("SumProduct((" & Rng & ">=100)*1 )")
  10.         Else
  11.             Msg = Msg & Chr(10) & I + 分數間格 - 1 & "~" & I & " = " & Application.Evaluate("SumProduct((" & Rng & "<=" & I + 分數間格 - 1 & ")*(" & Rng & ">=" & I & " ))")
  12.         End If
  13.     Next
  14.     MsgBox Msg
  15. End Sub
複製代碼
補上另一寫法
  1. Option Explicit
  2. Sub Ex_CountIf()
  3.     Dim Rng As Range, 間隔 As Integer, A As Integer, B As Integer, I As Integer, AR(1 To 2)
  4.     Set Rng = Range("A1:A" & [A1].End(xlDown).Row)  '統計的範圍
  5.     間隔 = 10
  6.     For I = 100 To Application.Min(Rng) - 間隔 Step -間隔
  7.         B = Application.CountIf(Rng, ">=" & I)
  8.         'COUNTIF 工作表函數: 計算某範圍內符合某搜尋準則的儲存格個數
  9.         If B - A > 0 Then
  10.             AR(1) = AR(1) & "," & IIf(I < 100, I + 間隔 - 1 & "~", "") & I
  11.             AR(2) = AR(2) & "," & B - A
  12.             A = B
  13.         End If
  14.     Next
  15.     AR(1) = Application.Transpose(Split(Mid(AR(1), 2), ","))
  16.     AR(2) = Application.Transpose(Split(Mid(AR(2), 2), ","))
  17.     [B:C] = ""
  18.     [B1].Resize(UBound(AR(1))) = AR(1)
  19.     [C1].Resize(UBound(AR(2))) = AR(2)
  20. End Sub
複製代碼

作者: 假面超人    時間: 2012-8-24 15:23

本帖最後由 假面超人 於 2012-8-24 15:24 編輯

回復 4# skyutm
我也試寫了一個
你試看看

分數是填在C欄位
  1. Sub 統計()

  2. a = 0
  3. b = 0
  4. c = 0
  5. d = 0
  6. e = 0
  7. f = 0
  8. myRowCount = Sheets("期中評量").Range("C1").CurrentRegion.Rows.Count '判斷C1到最後一筆資料有列

  9. For i = 1 To myRowCount
  10.     myrange = Sheets("期中評量").Range("c" & i)
  11.     Select Case myrange
  12.         Case "100"
  13.             a = a + 1
  14.         Case "90" To "99"
  15.             b = b + 1
  16.         Case "80" To "89"
  17.             c = c + 1
  18.         Case "70" To "79"
  19.             d = d + 1
  20.         Case "60" To "69"
  21.             e = e + 1
  22.         Case "0" To "69"
  23.             f = f + 1
  24.     End Select
  25.         
  26. Next i

  27. Sheets("sheet1").Range("A1").Value = a '100分總數
  28. Sheets("sheet1").Range("A2").Value = b '90-99總數
  29. Sheets("sheet1").Range("A3").Value = c '80-89 總數
  30. Sheets("sheet1").Range("A4").Value = d '70-79 總數
  31. Sheets("sheet1").Range("A5").Value = e '60-69 總數
  32. Sheets("sheet1").Range("A6").Value = f '0-59 不及格總數
  33. End Sub
複製代碼

作者: skyutm    時間: 2012-8-24 18:25

感謝兩位!我先去試試,再上來報告成果。
作者: GBKEE    時間: 2012-8-24 21:31

本帖最後由 GBKEE 於 2012-8-25 05:55 編輯

回復 6# 假面超人
  1. 'Case "0" To "69" 應是-> Case "0" To "59"
  2. '但 6,7,8,9,無法計算到, 可是 101 會計算到
  3. '建議修改如下
  4. For I = 1 To myRowCount
  5.     myrange = Sheets("期中評量").Range("c" & I)
  6.     Select Case myrange
  7.         Case 100
  8.             A = A + 1
  9.         Case 90 To 99
  10.             B = B + 1
  11.         Case 80 To 89
  12.             c = c + 1
  13.         Case 70 To 79
  14.             d = d + 1
  15.         Case 60 To 69
  16.             E = E + 1
  17.         Case 0 To 59
  18.             f = f + 1
  19.     End Select
複製代碼

作者: 假面超人    時間: 2012-8-24 22:13

回復 8# GBKEE

真的A....
沒測試到6.7.8.9
原來有加""和沒加""差那麼多,這是bug嗎?還是?

另外
Select Case myrange.Value
這一行會出現錯誤,我把value拿掉就OK了!!
作者: GBKEE    時間: 2012-8-25 05:58

回復 9# 假面超人
.Value 不知為何會加上的,已更正了




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