trungtamcnc
Thành viên hoạt động



- Tham gia
- 5/4/10
- Bài viết
- 124
- Được thích
- 9
Cảm ơn bác đã quan tâm, công thức của bác đã bao quát được rồi ạ. Nhưng em muốn có code để khi chia sẻ sheet đỡ phải nhiều thao tác và file dữ liệu của em còn đúng chỗ này không code được thôi.Cái này dùng công thức là được rồi bạn.
Cảm ơn bác đã quan tâm, công thức của bác đã bao quát được rồi ạ. Nhưng em muốn có code để khi chia sẻ sheet đỡ phải nhiều thao tác và file dữ liệu của em còn đúng chỗ này không code được thôi.
Công thức của bác rất hay, nhưng bác xem lại chỗ môn Sử, Địa, GD. Không có kết quả ạ!
Nhờ bác động viên mà em viết được rồi:Bạn làm nghề giáo dục thì đáng lẽ bạn phải biết là không nên nhờ từ a đến z.
Bạn muốn code VBA thì bạn tự code, chỗ nào bí thì đưa code lên nhờ chỉnh sửa giùm.
Thử code này.Công thức của bác rất hay, nhưng bác xem lại chỗ môn Sử, Địa, GD. Không có kết quả ạ!
Của bác:
View attachment 276833
Của em:
View attachment 276834
Sub abc()
Dim i As Long, lr As Long, dic As Object, arr, kq, dk As String, a As Long, b As Long, tong As Double, dem As Integer, j As Integer
Set dic = CreateObject("scripting.dictionary")
With Sheets("Sh_01")
lr = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A2:AD" & lr).Value
For i = 2 To UBound(arr)
For j = 9 To 19
If Len(arr(i, j)) > 0 Then
dk = arr(i, 30) & "#" & arr(1, j)
If Not dic.exists(dk) Then
dic.Add dk, Array(arr(i, j), 1)
Else
dic.Item(dk) = Array(dic.Item(dk)(0) + arr(i, j), dic.Item(dk)(1) + 1)
End If
End If
Next j
Next i
End With
With Sheets("Baocaoso")
lr = .Range("A" & Rows.Count).End(xlUp).Row
If lr > 17 Then .Range("B17:J" & lr).ClearContents
arr = .Range("A16:J" & lr).Value
For j = 2 To 10
tong = 0
dem = 0
For i = 3 To UBound(arr)
dk = arr(i, 1) & "#" & arr(1, j)
If dic.exists(dk) Then
arr(i, j) = Format(dic.Item(dk)(0) / dic.Item(dk)(1), "#.##")
tong = tong + arr(i, j)
dem = dem + 1
End If
Next i
If dem Then arr(2, j) = tong / dem
Next j
.Range("A16:J" & lr).Value = arr
End With
Set dic = Nothing
End Sub
Khi dùng đít sần mà cần tính nhiều hơn một trị tổng thì dùng user defined type dễ hơn.Thử code này.
....
[/CODE]
Bạn chủ bài đăng có thể tham khảo lúc rỗi:Nhờ bác động viên mà em viết được rồi:
. . . . .
Sub TKeDiemTB()
Dim T As Integer 'Bién Dòng '
Dim I As Integer 'Biên Côt '
Dim J As Integer
Dim WF As Object, Sh As Worksheet: On Error GoTo LoiCT
Set Sh = Sheet4: Sh.Select
T = Sh.Cells(Rows.Count, 1).End(xlUp).Row
Set WF = Application.WorksheetFunction
For J = 18 To 29
For I = 2 To 10
' On Error Resume Next '
Sheet3.Cells(J, I) = _
WF.Round(WF.AverageIf(Sh.Range(Cells(3, 30), Cells(T, 30)), Sheet3.Cells(J, 1), Sh.Range(Cells(3, I + 7), Cells(T, I + 7))), 2)
Next I
Next J
Sheet3.Select
Err_: Exit Sub
LoiCT:
If Err = 1004 Then
Resume Next
Else
MsgBox Error, , Err: GoTo Err_
End If
End Sub
Cảm ơn bác. Đúng là có vấn đề về lỗi 1004 ạ.Bạn chủ bài đăng có thể tham khảo lúc rỗi:
PHP:Sub TKeDiemTB() Dim T As Integer 'Bién Dòng ' Dim I As Integer 'Biên Côt ' Dim J As Integer Dim WF As Object, Sh As Worksheet: On Error GoTo LoiCT Set Sh = Sheet4: Sh.Select T = Sh.Cells(Rows.Count, 1).End(xlUp).Row Set WF = Application.WorksheetFunction For J = 18 To 29 For I = 2 To 10 ' On Error Resume Next ' Sheet3.Cells(J, I) = _ WF.Round(WF.AverageIf(Sh.Range(Cells(3, 30), Cells(T, 30)), Sheet3.Cells(J, 1), Sh.Range(Cells(3, I + 7), Cells(T, I + 7))), 2) Next I Next J Sheet3.Select Err_: Exit Sub LoiCT: If Err = 1004 Then Resume Next Else MsgBox Error, , Err: GoTo Err_ End If End Sub
Tuy nhiên trong macro này còn sai sót, như chưa xóa kết quả do lần chạy (code) trước đưa lại,. . . .