Code VBA tách chuỗi - So sánh và sắp xếp (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Phương Phương mito

Thành viên thường trực
Tham gia
1/5/19
Bài viết
275
Được thích
65
Em có File kèm theo. Tại D5 và D6 em có dữ liệu hàng hóa kèm số lượng được bán của vùng1 và 2. Trong đó Chữ phía trước là mã hàng, số trong ngoặc đơn là số lượng bán. Có Code gì có thể lấy ra, so sánh và List theo yêu cầu lấy ra 5 mã hàng có giá trị lớn nhất của từng vùng (5 mã lớn nhất của từng vùng lấy ra xếp từ lớn đến bé từ B12 và D12 kèm theo là giá trị tương ứng tại C12 và E12). Mỗi mã hàng kèm giá trị là duy nhất ở mỗi vùng - Tức không có mã hàng nào lặp lại 2 lần trong mỗi vùng. Em cảm ơn ạ.
 

File đính kèm

Em có File kèm theo. Tại D5 và D6 em có dữ liệu hàng hóa kèm số lượng được bán của vùng1 và 2. Trong đó Chữ phía trước là mã hàng, số trong ngoặc đơn là số lượng bán. Có Code gì có thể lấy ra, so sánh và List theo yêu cầu lấy ra 5 mã hàng có giá trị lớn nhất của từng vùng (5 mã lớn nhất của từng vùng lấy ra xếp từ lớn đến bé từ B12 và D12 kèm theo là giá trị tương ứng tại C12 và E12). Mỗi mã hàng kèm giá trị là duy nhất ở mỗi vùng - Tức không có mã hàng nào lặp lại 2 lần trong mỗi vùng. Em cảm ơn ạ.
Thử code này
Mã:
Option Explicit
Sub Tach_SapXep()
Dim Nguon
Dim Mang0, Mang1
Dim Kq1, Kq2
Dim i, j
Nguon = Sheet1.Range("D5:D6")
ReDim Mang1(1)
Nguon(1, 1) = Split(Replace(Replace(Nguon(1, 1), ")", ""), "(", " "), ",")
For i = 0 To UBound(Nguon(1, 1))
    Mang0 = Split(Nguon(1, 1)(i))
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq1(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq1(j, 1) = Mang1(i)(0)
        Kq1(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
ReDim Mang1(1)
Nguon(2, 1) = Split(Replace(Replace(Nguon(2, 1), ")", ""), "(", " "), ",")
For i = 0 To UBound(Nguon(2, 1))
    Mang0 = Split(Nguon(2, 1)(i))
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq2(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq2(j, 1) = Mang1(i)(0)
        Kq2(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
Sheet1.Range("B12").Resize(5, 2) = Kq1
Sheet1.Range("D12").Resize(5, 2) = Kq2
End Sub
 
Upvote 0
Thử code này
Mã:
Option Explicit
Sub Tach_SapXep()
Dim Nguon
Dim Mang0, Mang1
Dim Kq1, Kq2
Dim i, j
Nguon = Sheet1.Range("D5:D6")
ReDim Mang1(1)
Nguon(1, 1) = Split(Replace(Replace(Nguon(1, 1), ")", ""), "(", " "), ",")
For i = 0 To UBound(Nguon(1, 1))
    Mang0 = Split(Nguon(1, 1)(i))
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq1(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq1(j, 1) = Mang1(i)(0)
        Kq1(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
ReDim Mang1(1)
Nguon(2, 1) = Split(Replace(Replace(Nguon(2, 1), ")", ""), "(", " "), ",")
For i = 0 To UBound(Nguon(2, 1))
    Mang0 = Split(Nguon(2, 1)(i))
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq2(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq2(j, 1) = Mang1(i)(0)
        Kq2(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
Sheet1.Range("B12").Resize(5, 2) = Kq1
Sheet1.Range("D12").Resize(5, 2) = Kq2
End Sub
Chạy được rồi ạ. ANh cho em hỏi chút về xác định tọa độ ô với ạ. Em chưa hiểu lắm các con số mà em bôi đậm để xác định tọa độ ạ. ANh có thể giải thích dùm em được không ạ. Em cảm ơn ạ.

ReDim Kq1(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
If IsArray(Mang1(i)) = True Then
j = j + 1
Kq1(j, 1) = Mang1(i)(0)
Kq1(j, 2) = Mang1(i)(1)
If j = 5 Then Exit For
End If



Mang0 = Split(Nguon(1, 1)(i))
Mang0 = Split(Nguon(2, 1)(i))


ReDim Kq2(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
If IsArray(Mang1(i)) = True Then
j = j + 1
Kq2(j, 1) = Mang1(i)(0)
Kq2(j, 2) = Mang1(i)(1)

If j = 5 Then Exit For
End If


Sheet1.Range("B12").Resize(5, 2) = Kq1
Sheet1.Range("D12").Resize(5, 2) = Kq2
 
Upvote 0
Chạy được rồi ạ. ANh cho em hỏi chút về xác định tọa độ ô với ạ. Em chưa hiểu lắm các con số mà em bôi đậm để xác định tọa độ ạ. ANh có thể giải thích dùm em được không ạ. Em cảm ơn ạ.

ReDim Kq1(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
If IsArray(Mang1(i)) = True Then
j = j + 1
Kq1(j, 1) = Mang1(i)(0)
Kq1(j, 2) = Mang1(i)(1)
If j = 5 Then Exit For
End If



Mang0 = Split(Nguon(1, 1)(i))
Mang0 = Split(Nguon(2, 1)(i))


ReDim Kq2(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
If IsArray(Mang1(i)) = True Then
j = j + 1
Kq2(j, 1) = Mang1(i)(0)
Kq2(j, 2) = Mang1(i)(1)

If j = 5 Then Exit For
End If


Sheet1.Range("B12").Resize(5, 2) = Kq1
Sheet1.Range("D12").Resize(5, 2) = Kq2
Mã:
ReDim Kq2(1 To 5, 1 To 2)
Là khai báo mảng Kq 2 chiều, có 5 dòng & 2 cột. Các dòng & cột bắt đầu từ 1
Mã:
Kq2(j, 1) = Mang1(i)(0)
Kq2(j, 1) : Ví du j=2 -> mảng Kq2 tại dòng 2, cột 1
Mang1(i)(0) : Mang1 là mang 1 chiều, các phân tử của nó sẽ chứa 1 mảng con, mảng con này có 2 phần tử : phan tu 0=Mã, phan tu 1=giá trị
Kq2(j, 1) = Mang1(i)(0) -> kết qua tại dòng j, côt 1 = mã hang tai phần tư thứ i của Mang1
Mã:
Sheet1.Range("B12").Resize(5, 2)
Là mở rông ô B12 ra thành 5 dòng 2 cột
 
Upvote 0
Mã:
ReDim Kq2(1 To 5, 1 To 2)
Là khai báo mảng Kq 2 chiều, có 5 dòng & 2 cột. Các dòng & cột bắt đầu từ 1
Mã:
Kq2(j, 1) = Mang1(i)(0)
Kq2(j, 1) : Ví du j=2 -> mảng Kq2 tại dòng 2, cột 1
Mang1(i)(0) : Mang1 là mang 1 chiều, các phân tử của nó sẽ chứa 1 mảng con, mảng con này có 2 phần tử : phan tu 0=Mã, phan tu 1=giá trị
Kq2(j, 1) = Mang1(i)(0) -> kết qua tại dòng j, côt 1 = mã hang tai phần tư thứ i của Mang1
Mã:
Sheet1.Range("B12").Resize(5, 2)
Là mở rông ô B12 ra thành 5 dòng 2 cột
Em cảm ơn anh nhiều ạ ! Em sẽ học được nhiều thứ từ cái Code này ạ !!!
 
Upvote 0
Thử code này
Mã:
Option Explicit
Sub Tach_SapXep()
Dim Nguon
Dim Mang0, Mang1
Dim Kq1, Kq2
Dim i, j
Nguon = Sheet1.Range("D5:D6")
ReDim Mang1(1)
Nguon(1, 1) = Split(Replace(Replace(Nguon(1, 1), ")", ""), "(", " "), ",")
For i = 0 To UBound(Nguon(1, 1))
    Mang0 = Split(Nguon(1, 1)(i))
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq1(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq1(j, 1) = Mang1(i)(0)
        Kq1(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
ReDim Mang1(1)
Nguon(2, 1) = Split(Replace(Replace(Nguon(2, 1), ")", ""), "(", " "), ",")
For i = 0 To UBound(Nguon(2, 1))
    Mang0 = Split(Nguon(2, 1)(i))
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq2(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq2(j, 1) = Mang1(i)(0)
        Kq2(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
Sheet1.Range("B12").Resize(5, 2) = Kq1
Sheet1.Range("D12").Resize(5, 2) = Kq2
End Sub
Anh cho em nhờ chút với ạ,hiện tại em gặp vấn đề giống #1 nhưng không phải sắp xesp từ lớn->nhỏ mà ngược lại thì code này sẽ chỉnh thế nào ạ ?
 
Upvote 0
Anh cho em nhờ chút với ạ,hiện tại em gặp vấn đề giống #1 nhưng không phải sắp xesp từ lớn->nhỏ mà ngược lại thì code này sẽ chỉnh thế nào ạ ?
Bạn tìm các dòng này
Mã:
For i = UBound(Mang1) To 0 Step -1
Đổi thanh thế này
Mã:
For i = 0 To UBound(Mang1)
Là kết quả sẽ như ý bạn
 
Upvote 0
Bạn tìm các dòng này
Mã:
For i = UBound(Mang1) To 0 Step -1
Đổi thanh thế này
Mã:
For i = 0 To UBound(Mang1)
Là kết quả sẽ như ý bạn
Kính Anh,
Anh cho em hỏi thêm chút với ạ. Em đang thấy Code chạy đúng với dữ liệu hiện tại có dạng chẳng hạn MM(345). Nghĩa là MM nó liền mạch. Nếu ký tự MM nó chuyển thành dạng bất quy tắc như KK-MM(345), NGUYEN VAN AH - MM(345) thì việc code có khó khăn không ạ. NHờ anh chỉ bảo thêm ạ. Em cảm ơn ạ.
 
Upvote 0
Kính Anh,
Anh cho em hỏi thêm chút với ạ. Em đang thấy Code chạy đúng với dữ liệu hiện tại có dạng chẳng hạn MM(345). Nghĩa là MM nó liền mạch. Nếu ký tự MM nó chuyển thành dạng bất quy tắc như KK-MM(345), NGUYEN VAN AH - MM(345) thì việc code có khó khăn không ạ. NHờ anh chỉ bảo thêm ạ. Em cảm ơn ạ.
Nếu giá trị luôn nằm cuối chuỗi thì cũng không quá khó đâu bạn. Bạn gửi 1 vài mẫu lên xem sao
---------
Có thể thử code dưới đây
Mã:
Option Explicit
Sub Tach_SapXep()
Dim Nguon
Dim Mang0, Mang1
Dim Kq1, Kq2
Dim i, j
Nguon = Sheet1.Range("D5:D6")
ReDim Mang1(1)
'Nguon(1, 1) = Split(Replace(Replace(Nguon(1, 1), ")", ""), "(", " "), ",")
Nguon(1, 1) = Split(Replace(Replace(Nguon(1, 1), ")", ""), "(", "#"), ",")
For i = 0 To UBound(Nguon(1, 1))
    'Mang0 = Split(Nguon(1, 1)(i))
    Mang0 = Split(Nguon(1, 1)(i), "#")
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq1(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq1(j, 1) = Mang1(i)(0)
        Kq1(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
ReDim Mang1(1)
'Nguon(2, 1) = Split(Replace(Replace(Nguon(2, 1), ")", ""), "(", " "), ",")
Nguon(2, 1) = Split(Replace(Replace(Nguon(2, 1), ")", ""), "(", "#"), ",")
For i = 0 To UBound(Nguon(2, 1))
    'Mang0 = Split(Nguon(2, 1)(i))
    Mang0 = Split(Nguon(2, 1)(i), "#")
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq2(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq2(j, 1) = Mang1(i)(0)
        Kq2(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
Sheet1.Range("B12").Resize(5, 2) = Kq1
Sheet1.Range("D12").Resize(5, 2) = Kq2
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu giá trị luôn nằm cuối chuỗi thì cũng không quá khó đâu bạn. Bạn gửi 1 vài mẫu lên xem sao
---------
Có thể thử code dưới đây
Mã:
Option Explicit
Sub Tach_SapXep()
Dim Nguon
Dim Mang0, Mang1
Dim Kq1, Kq2
Dim i, j
Nguon = Sheet1.Range("D5:D6")
ReDim Mang1(1)
'Nguon(1, 1) = Split(Replace(Replace(Nguon(1, 1), ")", ""), "(", " "), ",")
Nguon(1, 1) = Split(Replace(Replace(Nguon(1, 1), ")", ""), "(", "#"), ",")
For i = 0 To UBound(Nguon(1, 1))
    'Mang0 = Split(Nguon(1, 1)(i))
    Mang0 = Split(Nguon(1, 1)(i), "#")
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq1(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq1(j, 1) = Mang1(i)(0)
        Kq1(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
ReDim Mang1(1)
'Nguon(2, 1) = Split(Replace(Replace(Nguon(2, 1), ")", ""), "(", " "), ",")
Nguon(2, 1) = Split(Replace(Replace(Nguon(2, 1), ")", ""), "(", "#"), ",")
For i = 0 To UBound(Nguon(2, 1))
    'Mang0 = Split(Nguon(2, 1)(i))
    Mang0 = Split(Nguon(2, 1)(i), "#")
    j = CLng(Mang0(1))
    If UBound(Mang1) < j Then ReDim Preserve Mang1(j)
    Mang1(j) = Mang0
Next i
ReDim Kq2(1 To 5, 1 To 2)
j = 0
For i = UBound(Mang1) To 0 Step -1
    If IsArray(Mang1(i)) = True Then
        j = j + 1
        Kq2(j, 1) = Mang1(i)(0)
        Kq2(j, 2) = Mang1(i)(1)
        If j = 5 Then Exit For
    End If
Next i
Sheet1.Range("B12").Resize(5, 2) = Kq1
Sheet1.Range("D12").Resize(5, 2) = Kq2
End Sub
Tuyệt quá anh ạ.hi.Cảm ơn anh ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom