
จากโค๊ดที่อาจารย์ให้มา ใช้ได้ดีมากครับ แต่จะสอบถามอาจารย์ อีกประการครับ
หากต้องการให้ข้อมูลเรียงลำดับตามชื่อไฟล์ ในคอลัมน์
R2:R10000 เช่น รหัส
ท31102 วิชา
ภาษาไทย มีเรียนทั้ง 3 ห้อง ในชั้น ม.4/1,ม.4/2,ม.4/3 ก็ให้แสดงข้อมูลวิชาภาษาไทย ก่อนของทั้ง 3 ห้อง
แล้วค่อยเว้นบรรทัด 1 บรรทัด ไปแสดงรหัส
ค31102 วิชา
คณิตศาสตร์ คนที่เรียนวิชาคณิตศาสตร์ มีเรียนทั้ง 3 ห้อง ในชั้น ม.4/1,ม.4/2,ม.4/3 ก็ให้แสดงข้อมูลวิชาคณิตศาสตร์ แต่มีบางวิชาที่ทั้ง 3 ห้องเรียนไม่เหมือนกัน ก็ให้แสดงของห้องเดียว หรือ 2 ห้อง เฉพาะที่นักเรียนห้องนั้นๆ มีเรียน เช่นเรียน
รหัส
จ31202 วิชา
ภาษาจีน 2 เป็นห้อง ม.4/3 เท่านั้นที่เรียนรหัสนี้ ก็ให้แสดงรหัสนี้เพียงห้องเดียว ส่วนห้อง ม.4/1,ม.4/2 เรียนวิชาภาษาจีน 2 แต่รหัสวิชาไม่เหมือนกัน ก็ให้แยกออกมาเป็นข้อมูลของห้อง ม.4/1,ม.4/2
ไม่รู้ว่าผมอธิบายได้ชัดเจนบ้างหรือเปล่า
สรุปคือ เรียงข้อมูลตามรหัสวิชา ห้องใดเรียนรหัสใด ก็ให้แสดงรหัสนั้น หากใครเรียนรหัสเดียวกัน ก็ให้แสดงข้อมูลของคนที่เรียนรหัสเดียวกัน แล้วค่อยเว้น 1 บรรทัด ไปค้นหาข้อมูลลำดับต่อไป (ยึดห้อง 1,2,3 เรียงตามลำดับห้องในแต่รหัสวิชา)
Code: Select all
Sub MaxM4_Click()
Dim directory As String, fileName As String, bookStr As String
Dim j As Integer, iMax As Integer, iCount As Integer, rw As Integer
Dim r As Range, rFind As Range
Dim tempBook As Workbook, thsBook As Workbook
Dim aRR() As Variant
Application.ScreenUpdating = False
Set thsBook = ThisWorkbook
j = 3 'เริ่มที่บรรทัดที่ 3 คอลัมน์ที่ 1
thsBook.Sheets("maxm4").Range("a3:h1000").ClearContents
For Each r In thsBook.Sheets("maxm4").Range("o2:o4")
directory = r.Value
fileName = Dir(directory & "*.xl*")
Do Until Len(fileName) = 0 'ถ้าพบไฟล์ *.xl*
bookStr = VBA.Left(fileName, 6)
With thsBook.Sheets("maxm4")
If Application.CountIf(.Columns("r:r"), bookStr) = 0 Then
MsgBox "File " & tempBook.Name & " ไม่พบในคอลัมน์ R"
Exit Sub
Else
rw = Application.Match(bookStr, .Range("r2:r10000"), 0) - 1
End If
End With
Set tempBook = Workbooks.Open(directory & fileName)
With tempBook.Sheets(2)
iMax = WorksheetFunction.max(.Range("i7:i1000"))
iCount = Application.CountIf(.Range("i7:i1000"), iMax)
ReDim aRR(1 To iCount, 1 To 8)
Set rFind = .Range("i6")
For i = 1 To iCount
Set rFind = .Columns("i:i").Find(what:=iMax, after:=rFind, _
LookIn:=xlValues, searchorder:=xlByRows)
aRR(i, 1) = tempBook.Name
aRR(i, 2) = tempBook.Sheets(1).Range("c12").Value
aRR(i, 3) = rFind.Offset(0, -5).Value
aRR(i, 4) = rFind.Offset(0, -4).Value
aRR(i, 5) = "ม." & VBA.Right(tempBook.Sheets(1).Range("c9").Value, 1) _
& "/" & tempBook.Sheets(1).Range("e9").Value
aRR(i, 6) = rFind.Value
aRR(i, 7) = tempBook.Sheets(1).Range("c9").Value
aRR(i, 8) = tempBook.Sheets(1).Range("e9").Value
Next i
End With
thsBook.Sheets("maxm4").Range("a" & j).Resize(iCount, 8).Value = aRR
j = j + iCount
tempBook.Close False
fileName = Dir()
Loop
MsgBox ("รับไฟล์จาก Directory " & r.Value & " เรียบร้อยแล้วค่ะ")
Next r
Application.ScreenUpdating = True
End Sub
จะต้องปรับอย่างไรครับ เพื่อให้ได้ผลลัพธ์ดังภาพนี้