Nhờ các cao thủ giúp đỡ công thức lọc, tách.

Liên hệ QC
Dùng đỡ cái này:


Mã:
Option Explicit
Sub xeploai()
Dim lr&, i&, j&, k&, rng
Dim ip As String, xL, xL2, dk As String, arr(1 To 100000, 1 To 2)
ip = InputBox(" Chon Xep Loai: (xs: xuat sac / g:gioi / k: kha / tb: trung binh / y: yeu)")
If Len(ip) = 0 Then Exit Sub
xL = Array("xs", "g", "k", "tb", "y")
xL2 = Array("xuat sac", "gioi", "kha", "trung binh", "yeu")
For i = 0 To UBound(xL)
    If ip = xL(i) Then
        dk = xL2(i)
        Exit For
    End If
Next
If dk = "" Then Exit Sub
With Sheets("data")
    lr = .Cells(Rows.Count, "B").End(xlUp).Row
    rng = .Range("B4:H" & lr).Value
    For i = 2 To UBound(rng)
        For j = 2 To UBound(rng, 2)
            If Trim(rng(i, j)) Like dk Then
                k = k + 1
                arr(k, 1) = rng(i, 1)
                arr(k, 2) = rng(1, j)
            End If
        Next
    Next
End With
If Not Evaluate("=ISREF('" & dk & "'!A1)") Then
    Sheets.Add after:=Sheets(Sheets.Count)
    With ActiveSheet
        .Name = dk
        .Range("A1").Value = .Name
    End With
End If
Sheets(dk).Activate
Range("G8:H100000").ClearContents
Range("G8").Resize(k, 2).Value = arr
Range("G1:H1").EntireColumn.AutoFit
End Sub
E không biết nói gì hơn, cảm ơn anh rất nhiều :D. Đúng là ăn mày được xôi gấc ạ. Code dễ hiểu, dễ thay đổi theo nhiều điều kiện phát sinh, còn ngắn gọn và chạy vô cùng đúng ý nữa. Thanks anh rất nhiều ạ.
 
Thứ đơn giản lại là thứ phức tạp nhất.
View attachment 282362
Dành cho fan No VBA
Cách của bác rất hay, mình đã học được nhiều từ mấy hàm của bác.
Chỉ góp ý nhỏ xíu, chỗ lập mảng ở "Năm đạt loại giỏi", dùng hàm MID thì khi số lượng năm lớn hơn 10, VD từ năm 99 đến 2019 chẳng hạn, số thứ tự của cột nó là 2 chữ số mà Hàm MID chỉ lấy được 1 chữ số.
Mình dùng hàm textsplit như sau =INDEX(C3:G3,TEXTSPLIT(TEXTJOIN(";",1,IF(I4=C4:G14,COLUMN(C4:G14)-2,"")),,";")) đã giải quyết đc nó.
 
Cách của bác rất hay, mình đã học được nhiều từ mấy hàm của bác.
Chỉ góp ý nhỏ xíu, chỗ lập mảng ở "Năm đạt loại giỏi", dùng hàm MID thì khi số lượng năm lớn hơn 10, VD từ năm 99 đến 2019 chẳng hạn, số thứ tự của cột nó là 2 chữ số mà Hàm MID chỉ lấy được 1 chữ số.
Mình dùng hàm textsplit như sau =INDEX(C3:G3,TEXTSPLIT(TEXTJOIN(";",1,IF(I4=C4:G14,COLUMN(C4:G14)-2,"")),,";")) đã giải quyết đc nó.
Office 365 bạn thử công thức này xem (dán công thức vào ô trống nào đó - File bài #1):
Mã:
=LET(ar,TOCOL(LET(a,B3:G14,MAP(a,LAMBDA(x,IF(x<>"Giỏi",NA(),INDEX(a,ROW(x)-2,1)&"|"&INDEX(a,1,COLUMN(x)-1))))),3),r,ROWS(ar),MAKEARRAY(r,2,LAMBDA(y,z,INDEX(TEXTSPLIT(INDEX(ar,y,1),"|"),,z))))
Hoặc phiên bản ngắn gọn hơn:
Mã:
=TEXTSPLIT(TEXTJOIN("`",1,LET(a,B3:G14,MAP(a,LAMBDA(x,IF(x<>"Giỏi","",INDEX(a,ROW(x)-2,1)&"|"&INDEX(a,1,COLUMN(x)-1)))))),"|","`")
 
Lần chỉnh sửa cuối:
Dùng đỡ cái này:


Mã:
Option Explicit
Sub xeploai()
Dim lr&, i&, j&, k&, rng
Dim ip As String, xL, xL2, dk As String, arr(1 To 100000, 1 To 2)
ip = InputBox(" Chon Xep Loai: (xs: xuat sac / g:gioi / k: kha / tb: trung binh / y: yeu)")
If Len(ip) = 0 Then Exit Sub
xL = Array("xs", "g", "k", "tb", "y")
xL2 = Array("xuat sac", "gioi", "kha", "trung binh", "yeu")
For i = 0 To UBound(xL)
    If ip = xL(i) Then
        dk = xL2(i)
        Exit For
    End If
Next
If dk = "" Then Exit Sub
With Sheets("data")
    lr = .Cells(Rows.Count, "B").End(xlUp).Row
    rng = .Range("B4:H" & lr).Value
    For i = 2 To UBound(rng)
        For j = 2 To UBound(rng, 2)
            If Trim(rng(i, j)) Like dk Then
                k = k + 1
                arr(k, 1) = rng(i, 1)
                arr(k, 2) = rng(1, j)
            End If
        Next
    Next
End With
If Not Evaluate("=ISREF('" & dk & "'!A1)") Then
    Sheets.Add after:=Sheets(Sheets.Count)
    With ActiveSheet
        .Name = dk
        .Range("A1").Value = .Name
    End With
End If
Sheets(dk).Activate
Range("G8:H100000").ClearContents
Range("G8").Resize(k, 2).Value = arr
Range("G1:H1").EntireColumn.AutoFit
End Sub
Anh bebo cho em hỏi với cùng 1 cách này, mình không tạo sheet mới nữa, mà tạo workbook mới (tên wb và tên sheet mới tạo ra giống nhau) được không ạ? E có khai báo thêm 2 Function và sửa code tạo sheet thành như ở dưới mà chạy toàn bị báo lỗi out of range hoặc type missmath ko à.
Mã:
Option Explicit
Sub xeploai()
Dim lr&, i&, j&, k&, rng, sFileName As String, wb As Workbook, oldWb As Workbook, sWbName As Workbook, 
Dim ip As String, xL, xL2, dk As String, arr(1 To 100000, 1 To 2)
ip = InputBox(" Chon Xep Loai: (xs: xuat sac / g:gioi / k: kha / tb: trung binh / y: yeu)")
If Len(ip) = 0 Then Exit Sub
xL = Array("xs", "g", "k", "tb", "y")
xL2 = Array("xuat sac", "gioi", "kha", "trung binh", "yeu")
For i = 0 To UBound(xL)
    If ip = xL(i) Then
        dk = xL2(i)
        Exit For
    End If
Next
If dk = "" Then Exit Sub
oldWb.Activate
With Sheets("data")
    sFileName = dk & ".xlsx"
        If Not GetWb(sFileName, wb) & Evaluate("=ISREF('" & dk & "'!A1)") Then
            Set wb = CreateNewWb(sFileName)
            wb.Sheets.Add after:=Sheets(Sheets.Count)
                     With ActiveSheet
                             .Name = dk
                             .Range("A1").Value = .Name
                     End With
            oldWb.Activate
        End If
lr = .Cells(Rows.Count, "B").End(xlUp).Row
rng = .Range("B4:H" & lr).Value
    For i = 2 To UBound(rng)
        For j = 2 To UBound(rng, 2)
            If Trim(rng(i, j)) Like dk Then
                k = k + 1
                arr(k, 1) = rng(i, 1)
                arr(k, 2) = rng(1, j)
            End If
        Next
    Next
End With

sWbName.Sheets(dk).Activate
Range("G8:H100000").ClearContents
Range("G8").Resize(k, 2).Value = arr
Range("G1:H1").EntireColumn.AutoFit

lbFinally:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationSemiautomatic

    If Err <> 0 Then
        MsgBox Err.Description, vbCritical
    End If
    
End Sub

Function GetWb(sWbName As String, wb As Workbook) As Boolean
    Dim dk As Long
    'sWbName = LCase(sWbName)
    For G = 1 To Workbooks.Count
        If Workbooks(G).Name = sWbName Then
            GetWb = True
            Set wb = Workbooks(G)
            Exit Function
        End If
    Next G
End Function

Function CreateNewWb(sWbName As String) As Workbook
    Dim oldWb As Workbook
    Set oldWb = ActiveWorkbook
    Set CreateNewWb = Workbooks.Add
    CreateNewWb.SaveAs sWbName
    oldWb.Activate
End Function
 
Web KT

Bài viết mới nhất

Back
Top Bottom