snasui.com ยินดีต้อนรับ ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ ระบุ Version ของ Excel
Sub ClsOverScore() ' เคลียร์คะแนนที่เกินจำนวนคนที่มีชื่อ
Dim lastRow As Long
Dim i As Long, r As Range, j As Long
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
With ActiveSheet
Set r = .Range("D5")
Do While r.Offset(i, 0).Value <> ""
i = i + 1
j = r.Offset(i, 0).Row
Loop
lastRow = .Range("D" & .Rows.Count).End(xlUp).Row
.Range("E" & j, .Range("R" & lastRow)).ClearContents
.Range("T" & j, .Range("U" & lastRow)).ClearContents
.Range("Y" & j, .Range("AL" & lastRow)).ClearContents
.Range("AN" & j, .Range("AO" & lastRow)).ClearContents
End With
MsgBox "เคลียร์คะแนนที่เกินมาเสร็จเรียบร้อยแล้ว"
Range("E5").Select
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Sub ClsOverScore() ' เคลียร์คะแนนที่เกินจำนวนคนที่มีชื่อ
Dim lastRow As Long
Dim i As Long, r As Range, j As Long
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
With ActiveSheet
Set r = .Range("D5")
Do While r.Offset(i, 0).Value <> ""
i = i + 1
j = r.Offset(i, 0).Row
Loop
lastRow = .Range("D" & .Rows.Count).End(xlUp).Row
.Range("E" & j, .Range("R" & lastRow)).ClearContents
.Range("T" & j, .Range("U" & lastRow)).ClearContents
.Range("Y" & j, .Range("AL" & lastRow)).ClearContents
.Range("AN" & j, .Range("AO" & lastRow)).ClearContents
For Each r In .Range("e4:v4, y4:am4")
If r.Value = 0 Then
.Range(.Cells(r.Row + 1, r.Column), _
.Cells(lastRow, r.Column)).ClearContents
End If
Next r
End With
MsgBox "เคลียร์คะแนนที่เกินมาเสร็จเรียบร้อยแล้ว"
Range("E5").Select
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Sub ClsOverBothWays_Final_WithEventFix()
Dim r As Range, i As Long
Dim checkCols As Range
Dim startRow As Long, endRow As Long
' --- จุดสำคัญ: ต้องปิด Events ตั้งแต่เริ่ม ---
Application.ScreenUpdating = False
Application.EnableEvents = False
' Application.Calculation = xlCalculationManual
On Error GoTo CleanExit ' ป้องกันกรณี Error แล้ว Events ไม่ยอมเปิดกลับ
Set checkCols = ActiveSheet.Range("E4:R4, T4:U4, Y4:AL4, AN4:AO4")
startRow = 5
endRow = 49
With ActiveSheet
' 1. เคลียร์ตามคะแนนเต็ม (แถว 4)
For Each r In checkCols
If Val(r.Value) <= 0 Then
.Range(.Cells(startRow, r.Column), .Cells(endRow, r.Column)).ClearContents
End If
Next r
' 2. เคลียร์ตามชื่อเด็ก (คอลัมน์ D)
For i = startRow To endRow
If Trim(.Cells(i, "D").Value) = "" Or .Cells(i, "D").Value = 0 Then
Intersect(.Rows(i), checkCols.EntireColumn).ClearContents
End If
Next i
End With
' MsgBox "เคลียร์คะแนนที่เกินมาเสร็จเรียบร้อยแล้ว"
' ActiveSheet.Range("E5").Select
CleanExit:
' --- จุดสำคัญ: ต้องเปิด Events กลับมาเสมอเพื่อให้ระบบกันก๊อปปี้ทำงานต่อได้ ---
' Application.Calculation = xlCalculationAutomatic ' คืนค่าการคำนวณ
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox "เคลียร์คะแนนที่เกินมาเสร็จเรียบร้อยแล้ว"
End Sub
'Sub ClsOverBothWays_Final_WithEventFix()
' ' ... (ตัวแปรเดิม) ...
'
' Application.ScreenUpdating = False
' Application.EnableEvents = False
' ' --- เพิ่มบรรทัดนี้เพื่อลดภาระการคำนวณหน้าจอ ---
' Application.Calculation = xlCalculationManual
'
' On Error GoTo CleanExit
'
' ' --- บรรทัดสำคัญ: ปลดการเลือก Shape ทันทีที่เริ่มรัน ---
' ActiveSheet.Range("A1").Select
'
' ' ... (Logic การเคลียร์ข้อมูลเดิมของคุณ) ...
'CleanExit:
' Application.Calculation = xlCalculationAutomatic ' คืนค่าการคำนวณ
' Application.EnableEvents = True
' Application.ScreenUpdating = True
' MsgBox "เคลียร์คะแนนที่เกินมาเสร็จเรียบร้อยแล้ว"
'End Sub