[vấn đề vba] bị cộng dồn khi dùng for .... next

Liên hệ QC

YMai

Thành viên mới
Tham gia
10/12/18
Bài viết
16
Được thích
1
Giúp em với ạ.
Mục đích: tự động điền tổng giờ nghỉ có phép(màu cam), không phép(màu xanh) vào từng ô tương ứng AMi, ANi.
217402
Em chưa tìm ra được vấn đề dẫn đến kết quả bị cộng dồn mỗi hàng kế tiếp. Dưới đây là đoạn mã em em viết ạ.
Mã:
Sub nghi_vonglap()
Dim i As Long
For i = 11 To 500
If Range("A" & i).Value = cellblanks Then
ElseIf Range("B" & i).Value Then
'(7)
           Select Case Cells(i, 7).Interior.ColorIndex
           Case 40
                  cp7_i = 8.5 - Cells(i, 7).Value
           Case 24
                  kp7_i = 8.5 - Cells(i, 7).Value
        End Select
 '(8)
           Select Case Cells(i, 8).Interior.ColorIndex
           Case 40
              cp8_i = 8.5 - Cells(i, 8).Value
           Case 24
              kp8_i = 8.5 - Cells(i, 8).Value
       End Select
  '(9)
 Select Case Cells(i, 9).Interior.ColorIndex
           Case 40
              cp9_i = 8.5 - Cells(i, 9).Value
           Case 24
              kp9_i = 8.5 - Cells(i, 9).Value
       End Select
 '(10)
           Select Case Cells(i, 10).Interior.ColorIndex
           Case 40
                  cp10_i = 8.5 - Cells(i, 10).Value
           Case 24
                  kp10_i = 8.5 - Cells(i, 10).Value
       End Select
 '(11)
 Select Case Cells(i, 11).Interior.ColorIndex
           Case 40
                  cp11_i = 8.5 - Cells(i, 11).Value
           Case 24
                 kp11_i = 8.5 - Cells(i, 11).Value
       End Select
 '(12)
           Select Case Cells(i, 12).Interior.ColorIndex
           Case 40
                  cp12_i = 8.5 - Cells(i, 12).Value
           Case 24
                  kp12_i = 8.5 - Cells(i, 12).Value
       End Select
    
  '(13)
 Select Case Cells(i, 13).Interior.ColorIndex
           Case 40
                 cp13_i = 8.5 - Cells(i, 13).Value
           Case 24
                 kp13_i = 8.5 - Cells(i, 13).Value
       End Select
 '(14)
           Select Case Cells(i, 14).Interior.ColorIndex
           Case 40
                 cp14_i = 8.5 - Cells(i, 14).Value
           Case 24
                 kp14_i = 8.5 - Cells(i, 14).Value
       End Select
  '(15)
 Select Case Cells(i, 15).Interior.ColorIndex
           Case 40
                 cp15_i = 8.5 - Cells(i, 15).Value
           Case 24
                  kp15_i = 8.5 - Cells(i, 15).Value
       End Select
 '(16)
           Select Case Cells(i, 16).Interior.ColorIndex
           Case 40
                 cp16_i = 8.5 - Cells(i, 16).Value
           Case 24
                 kp16_i = 8.5 - Cells(i, 16).Value
       End Select
  '(17)
 Select Case Cells(i, 17).Interior.ColorIndex
           Case 40
                 cp17_i = 8.5 - Cells(i, 17).Value
           Case 24
                 kp17_i = 8.5 - Cells(i, 17).Value
       End Select
 '(18)
           Select Case Cells(i, 18).Interior.ColorIndex
           Case 40
                  cp18_i = 8.5 - Cells(i, 18).Value
           Case 24
                  kp18_i = 8.5 - Cells(i, 18).Value
       End Select
 '(19)
 Select Case Cells(i, 19).Interior.ColorIndex
           Case 40
                  cp19_i = 8.5 - Cells(i, 19).Value
           Case 24
kp19_i = 8.5 - Cells(i, 19).Value
       End Select
 '(20)
           Select Case Cells(i, 20).Interior.ColorIndex
           Case 40
                cp20_i = 8.5 - Cells(i, 20).Value
           Case 24
                kp20_i = 8.5 - Cells(i, 20).Value
                  
   End Select
    
  '(21)
 Select Case Cells(i, 21).Interior.ColorIndex
           Case 40
                  cp21_i = 8.5 - Cells(i, 21).Value
           Case 24
                  kp21_i = 8.5 - Cells(i, 21).Value
       End Select
 '(22)
           Select Case Cells(i, 22).Interior.ColorIndex
           Case 40
                  cp22_i = 8.5 - Cells(i, 22).Value
           Case 24
                  kp22i = 8.5 - Cells(i, 22).Value
       End Select
  '(23)
           Select Case Cells(i, 23).Interior.ColorIndex
           Case 40
                  cp23_i = 8.5 - Cells(i, 23).Value
           Case 24
                  kp23_i = 8.5 - Cells(i, 23).Value
       End Select
    
  '(24)
 Select Case Cells(i, 24).Interior.ColorIndex
           Case 40
                  cp24_i = 8.5 - Cells(i, 24).Value
           Case 24
                  kp24_i = 8.5 - Cells(i, 24).Value
       End Select
 '(25)
           Select Case Cells(i, 25).Interior.ColorIndex
           Case 40
                  cp25_i = 8.5 - Cells(i, 25).Value
           Case 24
                  kp25_i = 8.5 - Cells(i, 25).Value
       End Select
 '(26)
           Select Case Cells(i, 26).Interior.ColorIndex
           Case 40
                  cp26_i = 8.5 - Cells(i, 26).Value
           Case 24
                  kp26_i = 8.5 - Cells(i, 26).Value
       End Select
    
  '(27)
 Select Case Cells(i, 27).Interior.ColorIndex
           Case 40
                  cp27_i = 8.5 - Cells(i, 27).Value
           Case 24
                  kp27_i = 8.5 - Cells(i, 27).Value
       End Select
 '(28)
           Select Case Cells(i, 28).Interior.ColorIndex
           Case 40
                  cp28_i = 8.5 - Cells(i, 28).Value
           Case 24
                  kp28_i = 8.5 - Cells(i, 28).Value
       End Select
 '(29)
           Select Case Cells(i, 29).Interior.ColorIndex
           Case 40
                  cp29_i = 8.5 - Cells(i, 29).Value
           Case 24
                  kp29_i = 8.5 - Cells(i, 29).Value
       End Select
    
  '(30)
 Select Case Cells(i, 30).Interior.ColorIndex
           Case 40
                  cp30_i = 8.5 - Cells(i, 30).Value
           Case 24
                  kp30_i = 8.5 - Cells(i, 30).Value
       End Select
 '(31)
           Select Case Cells(i, 31).Interior.ColorIndex
           Case 40
                  cp31_i = 8.5 - Cells(i, 31).Value
           Case 24
                  kp31_i = 8.5 - Cells(i, 31).Value
       End Select
 '(32)
 Select Case Cells(i, 32).Interior.ColorIndex
           Case 40
                  cp32_i = 8.5 - Cells(i, 32).Value
           Case 24
                  kp32_i = 8.5 - Cells(i, 32).Value
       End Select
 '(33)
Select Case Cells(i, 33).Interior.ColorIndex
           Case 40
                  cp33i = 8.5 - Cells(i, 33).Value
           Case 24
                  kp33i = 8.5 - Cells(i, 33).Value
       End Select
  '(34)
 Select Case Cells(i, 34).Interior.ColorIndex
           Case 40
                  cp34_i = 8.5 - Cells(i, 34).Value
           Case 24
                  kp34_i = 8.5 - Cells(i, 34).Value
       End Select
 '(35)
           Select Case Cells(i, 35).Interior.ColorIndex
           Case 40
                  cp35_i = 8.5 - Cells(i, 35).Value
                  kp35_i = 8.5 - Cells(i, 35).Value
       End Select
 '(36)
 Select Case Cells(i, 36).Interior.ColorIndex
           Case 40
                  cp36_i = 8.5 - Cells(i, 36).Value
           Case 24
                  kp36_i = 8.5 - Cells(i, 36).Value
       End Select
 '(37)
           Select Case Cells(i, 37).Interior.ColorIndex
           Case 40
                  cp37_i = 8.5 - Cells(i, 37).Value
           Case 24
                  kp37_i = 8.5 - Cells(i, 37).Value
              End Select
    
            Range("AM" & i) = cp7_i + cp8_i + cp9_i + cp10_i + cp11_i + cp12_i + cp13_i + cp14_i + cp15_i + cp16_i + cp17_i + cp18_i + cp19_i + cp20_i + cp21_i + cp22_i + cp23_i + cp24_i + cp25_i + cp26_i + cp27_i + cp28_i + cp29_i + cp30_i + cp31_i + cp32_i + cp33_i + cp34_i + cp35_i + cp36_i + cp37_i
            Range("AN" & i) = kp7_i + kp8_i + kp9_i + kp10_i + kp11_i + kp12_i + kp13_i + kp14_i + kp15_i + kp16_i + kp17_i + kp18_i + kp19_i + kp20_i + kp21_i + kp22_i + kp23_i + kp24_i + kp25_i + kp26_i + kp27_i + kp28_i + kp29_i + kp30_i + kp31_i + kp32_i + kp33_i + kp34_i + kp35_i + kp36_i + kp37_i

End If
Next i
End Sub
 
Code phải gắn với dữ liệu (file) thì người ta mới hiểu code nó làm gì. Bạn nên gửi file lên, không có file không ai giúp bạn được đâu.
 
:) cảm ơn bạn nhắc. mình quên đăng file.
Bị cộng dồn là do bạn không xóa giá trị (gán giá trị 0) các biến cp7_i, cp8_i, ..., kp7_i, kp8_i sau khi tính cho mỗi người. Vì vậy, kết quả của người sau sẽ là tổng kết quả của những người trước và kết quả của người đó.
Nhưng mà chẳng ai dùng mấy chục cái select case như bạn cả, họ sẽ viết select case 1 lần và đặt nó trong vòng lặp.
 
Bị cộng dồn là do bạn không xóa giá trị (gán giá trị 0) các biến cp7_i, cp8_i, ..., kp7_i, kp8_i sau khi tính cho mỗi người. Vì vậy, kết quả của người sau sẽ là tổng kết quả của những người trước và kết quả của người đó.
Nhưng mà chẳng ai dùng mấy chục cái select case như bạn cả, họ sẽ viết select case 1 lần và đặt nó trong vòng lặp.
gán giá trị 0 như thế nào bạn? Vì sao mình phải gán?
:( mình thử 1 select case rồi nhưng bị lỗi nên tạm thời tách ra nhiều cái.
 
gán giá trị 0 như thế nào bạn? Vì sao mình phải gán?
:( mình thử 1 select case rồi nhưng bị lỗi nên tạm thời tách ra nhiều cái.
Bạn copy code này vào dòng phía trên dòng End If.
Mã:
cp7_i = 0:  cp8_i = 0:  cp9_i = 0:  cp10_i = 0:  cp11_i = 0:  cp12_i = 0:  cp13_i = 0:  cp14_i = 0:  cp15_i = 0:  cp16_i = 0:  cp17_i = 0:  cp18_i = 0:  cp19_i = 0:  cp20_i = 0:  cp21_i = 0:  cp22_i = 0:  cp23_i = 0:  cp24_i = 0:  cp25_i = 0:  cp26_i = 0:  cp27_i = 0:  cp28_i = 0:  cp29_i = 0:  cp30_i = 0:  cp31_i = 0:  cp32_i = 0:  cp33_i = 0:  cp34_i = 0:  cp35_i = 0:  cp36_i = 0:  cp37_i = 0:
kp7_i = 0:  kp8_i = 0:  kp9_i = 0:  kp10_i = 0:  kp11_i = 0:  kp12_i = 0:  kp13_i = 0:  kp14_i = 0:  kp15_i = 0:  kp16_i = 0:  kp17_i = 0:  kp18_i = 0:  kp19_i = 0:  kp20_i = 0:  kp21_i = 0:  kp22_i = 0:  kp23_i = 0:  kp24_i = 0:  kp25_i = 0:  kp26_i = 0:  kp27_i = 0:  kp28_i = 0:  kp29_i = 0:  kp30_i = 0:  kp31_i = 0:  kp32_i = 0:  kp33_i = 0:  kp34_i = 0:  kp35_i = 0:  kp36_i = 0:  kp37_i = 0:
 
Bị cộng dồn là do bạn không xóa giá trị (gán giá trị 0) các biến cp7_i, cp8_i, ..., kp7_i, kp8_i sau khi tính cho mỗi người. Vì vậy, kết quả của người sau sẽ là tổng kết quả của những người trước và kết quả của người đó.
Nhưng mà chẳng ai dùng mấy chục cái select case như bạn cả, họ sẽ viết select case 1 lần và đặt nó trong vòng lặp.
Dùng Range cho bạn dể hình dung cách vận hành code
Mã:
Sub ABC()
  Dim i As Long, j As Long, eRow As Long
  Dim Cp As Double, Kp As Double, ColorId As Double
  eRow = Range("B" & Rows.Count).End(xlUp).Row
  If eRow < 11 Then MsgBox ("Khong co du lieu"): Exit Sub
  For i = 11 To eRow
    Cp = 0: Kp = 0
    If Len(Range("B" & i).Value) > 0 Then
      For j = 7 To 37
        ColorId = Cells(i, j).Interior.ColorIndex
        If ColorId = 40 Then
          Cp = Cp + 8.5 - Cells(i, j).Value
        ElseIf ColorId = 24 Then
          Kp = Kp + 8.5 - Cells(i, j).Value
        End If
      Next j
      Range("AM" & i) = Cp
      Range("AN" & i) = Kp
    End If
  Next i
End Sub
 
cảm ơn 2 bạn. Đoạn code của HieuCD làm gọn nhẹ hơn so với của mình làm.
 
Web KT
Back
Top Bottom