Giúp đỡ trích xuất dữ liệu có điều kiện

Liên hệ QC

Avenged7

Thành viên mới
Tham gia
2/1/15
Bài viết
24
Được thích
0
Mấy bác giúp đỡ em xử lý file excel này với ạ. %#^#$
Em cần list ra danh sách các "GroupPoints" trong "Sheet 2" đưa vào "Sheet 1" theo dạng cách nhau theo dấu "," như file đính kèm. Điều kiện là giá trị "GroupPoints" đó xuất hiện từ 2 lần trở lên trong cột "GroupPoints" của "Sheet 2". Giá trị xuất theo từng "POP" đưa vào "Sheet 1"
Đa tạ mọi người /-*+/
 

File đính kèm

Mấy bác giúp đỡ em xử lý file excel này với ạ. %#^#$
Em cần list ra danh sách các "GroupPoints" trong "Sheet 2" đưa vào "Sheet 1" theo dạng cách nhau theo dấu "," như file đính kèm. Điều kiện là giá trị "GroupPoints" đó xuất hiện từ 2 lần trở lên trong cột "GroupPoints" của "Sheet 2". Giá trị xuất theo từng "POP" đưa vào "Sheet 1"
Đa tạ mọi người /-*+/

Chạy thử Sub này rồi tuỳ nghi chế biến.
(Đọc không hiểu)
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(), I As Long, K As Long, Rws As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet2
    sArr = .Range(.[A2], .[B2].End(xlDown)).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 3)
For I = 1 To UBound(sArr, 1)
    If Not Dic.Exists(sArr(I, 1)) Then
        K = K + 1
        Dic.Add sArr(I, 1), K
        dArr(K, 1) = sArr(I, 1)
        dArr(K, 2) = 1
        dArr(K, 3) = sArr(I, 2)
    Else
        Rws = Dic.Item(sArr(I, 1))
        dArr(Rws, 2) = dArr(Rws, 2) + 1
        dArr(Rws, 3) = dArr(Rws, 3) & "," & sArr(I, 2)
    End If
Next I
With Sheet1
    .[A2].Resize(K, 3) = dArr
    .Range("A2").Resize(K, 3).Sort Key1:=.Range("B2"), Order1:=xlDescending
End With
Set Dic = Nothing
End Sub
-----------------------
Thấy cách làm của hoamattroicoi ở bài dưới (#3), hình như mình hiểu sai vấn đề, làm lại trong file này vậy.
 

File đính kèm

Lần chỉnh sửa cuối:
Mấy bác giúp đỡ em xử lý file excel này với ạ. %#^#$
Em cần list ra danh sách các "GroupPoints" trong "Sheet 2" đưa vào "Sheet 1" theo dạng cách nhau theo dấu "," như file đính kèm. Điều kiện là giá trị "GroupPoints" đó xuất hiện từ 2 lần trở lên trong cột "GroupPoints" của "Sheet 2". Giá trị xuất theo từng "POP" đưa vào "Sheet 1"
Đa tạ mọi người /-*+/

Bạn sử dụng hàm này xem sao :
Mã:
Function Timdulieu(POP As Range, Group As Range)
Dim i As Long, sArr(), dArr, k As Long
Dim Tmp, kQ
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = POP.Value
ReDim dArr(1 To UBound(sArr), 1 To 1)
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If Not Dic.exists(sArr(i, 2)) Then
        k = k + 1
        Dic.Add sArr(i, 2), k
        dArr(k, 1) = 1
    Else
    dArr(Dic.Item(sArr(i, 2)), 1) = dArr(Dic.Item(sArr(i, 2)), 1) + 1
    End If
End If
Next
Tmp = Dic.Keys
For i = 0 To Dic.Count - 1
    If dArr(i + 1, 1) > 1 Then
      kQ = Tmp(i) & ", " & kQ
    End If
Next
    If Len(kQ) > 0 Then
        Timdulieu = Left(kQ, Len(kQ) - 2)
    Else
        Timdulieu = ""
    End If
Set Dic = Nothing
End Function

Bạn copy code kia vào module sau đó trong ô B2 trong sheet1 bạn gõ công thức sau :
=Timdulieu(Sheet2!$A$2:$B$324,Sheet1!A2)
=> Copy xuống cho những ô còn lại.
 
Mấy bác giúp đỡ em xử lý file excel này với ạ. %#^#$
Em cần list ra danh sách các "GroupPoints" trong "Sheet 2" đưa vào "Sheet 1" theo dạng cách nhau theo dấu "," như file đính kèm. Điều kiện là giá trị "GroupPoints" đó xuất hiện từ 2 lần trở lên trong cột "GroupPoints" của "Sheet 2". Giá trị xuất theo từng "POP" đưa vào "Sheet 1"
Đa tạ mọi người /-*+/

trong sheet2 chèn thêm cột E
Mã:
E2=IF(COUNTIFS($A$1:A1,A2,$B$1:B1,B2)=1,  IFERROR( LOOKUP(2,1/($A$1:A1=A2)/($E$1:E1<>""),$E$1:E1)&", "&B2,B2),"")

quay về sheet1
Mã:
B2=IFERROR( LOOKUP(2,1/(Sheet2!$A$2:$A$900=A2)/(Sheet2!$E$2:$E$900<>""),Sheet2!$E$2:$E$900),"")
 
Lần chỉnh sửa cuối:
Bạn sử dụng hàm này xem sao :
Mã:
Function Timdulieu(POP As Range, Group As Range)
Dim i As Long, sArr(), dArr, k As Long
Dim Tmp, kQ
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = POP.Value
ReDim dArr(1 To UBound(sArr), 1 To 1)
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If Not Dic.exists(sArr(i, 2)) Then
        k = k + 1
        Dic.Add sArr(i, 2), k
        dArr(k, 1) = 1
    Else
    dArr(Dic.Item(sArr(i, 2)), 1) = dArr(Dic.Item(sArr(i, 2)), 1) + 1
    End If
End If
Next
Tmp = Dic.Keys
For i = 0 To Dic.Count - 1
    If dArr(i + 1, 1) > 1 Then
      kQ = Tmp(i) & ", " & kQ
    End If
Next
    If Len(kQ) > 0 Then
        Timdulieu = Left(kQ, Len(kQ) - 2)
    Else
        Timdulieu = ""
    End If
Set Dic = Nothing
End Function

Bạn copy code kia vào module sau đó trong ô B2 trong sheet1 bạn gõ công thức sau :
=Timdulieu(Sheet2!$A$2:$B$324,Sheet1!A2)
=> Copy xuống cho những ô còn lại.

dù là Sub hay Function thì cũng chỉ có 1 vòng lặp thui , có giao lưu không ? hi hi
 
dù là Sub hay Function thì cũng chỉ có 1 vòng lặp thui , có giao lưu không ? hi hi

Ngưởi đẹp doveandrose quyến rũ, hihihi

Mã:
Function Timdulieu(POP As Range, Group As Range)Dim i As Long, sArr(), dArr, k As Long, Tmp, kQ
Dim Dic As Object, Dic2 As Object
Set Dic1 = CreateObject("Scripting.dictionary")
Set Dic2 = CreateObject("Scripting.dictionary")
sArr = POP.Value
ReDim dArr(1 To UBound(sArr), 1 To 1)
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If Not Dic1.exists(sArr(i, 2)) Then
        k = k + 1
        Dic1.Add sArr(i, 2), k
        dArr(k, 1) = 1
    Else
    dArr(Dic1.Item(sArr(i, 2)), 1) = dArr(Dic1.Item(sArr(i, 2)), 1) + 1
        If dArr(Dic1.Item(sArr(i, 2)), 1) > 1 Then
            If Not Dic2.exists(sArr(i, 2)) Then
                Dic2(sArr(i, 2)) = ""
                kQ = sArr(i, 2) & ", " & kQ
            End If
        End If
    End If
End If
Next
If Len(kQ) > 0 Then
Timdulieu = Left(kQ, Len(kQ) - 2)
Else
Timdulieu = ""
End If
Set Dic1 = Nothing
Set Dic2 = Nothing
End Function
 
Ngưởi đẹp doveandrose quyến rũ, hihihi

Mã:
Function Timdulieu(POP As Range, Group As Range)Dim i As Long, sArr(), dArr, k As Long, Tmp, kQ
Dim Dic As Object, Dic2 As Object
Set Dic1 = CreateObject("Scripting.dictionary")
Set Dic2 = CreateObject("Scripting.dictionary")
sArr = POP.Value
ReDim dArr(1 To UBound(sArr), 1 To 1)
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If Not Dic1.exists(sArr(i, 2)) Then
        k = k + 1
        Dic1.Add sArr(i, 2), k
        dArr(k, 1) = 1
    Else
    dArr(Dic1.Item(sArr(i, 2)), 1) = dArr(Dic1.Item(sArr(i, 2)), 1) + 1
        If dArr(Dic1.Item(sArr(i, 2)), 1) > 1 Then
            If Not Dic2.exists(sArr(i, 2)) Then
                Dic2(sArr(i, 2)) = ""
                kQ = sArr(i, 2) & ", " & kQ
            End If
        End If
    End If
End If
Next
If Len(kQ) > 0 Then
Timdulieu = Left(kQ, Len(kQ) - 2)
Else
Timdulieu = ""
End If
Set Dic1 = Nothing
Set Dic2 = Nothing
End Function

giờ thí dụ như chỉ cho phép 1 Dic và không cần dArr thì sao ta ? hi hi
 
- 12 dòng code thì giống kiểu cưỡng hôn quá người đẹp ợ, nhưng bạn đẹp bạn có quyền :D....18 dòng code của mình vượt budget rùi, mình chờ 12 dòng code của người đẹp }}}}}

Mã:
Function Timdulieu(POP As Range, Group As Range)
Dim i As Long, sArr(), k As Long, kQ, Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = POP.Value
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If Not Dic.exists(sArr(i, 2)) Then
         k = k + 1
         Dic.Add sArr(i, 2), Array(k, 1)
    Else
            Dic.Item(sArr(i, 2)) = Array(Dic.Item(sArr(i, 2))(0), Dic.Item(sArr(i, 2))(1) + 1)
            If Dic.Item(sArr(i, 2))(1) = 2 Then kQ = sArr(i, 2) & ", " & kQ
    End If
End If
Next
If Len(kQ) > 0 Then Timdulieu = Left(kQ, Len(kQ) - 2)
Set Dic = Nothing
End Function
 
Lần chỉnh sửa cuối:
- 12 dòng code thì giống kiểu cưỡng hôn quá người đẹp ợ....18 dòng code của mình vượt budget rùi, mình chờ 12 dòng code của người đẹp }}}}}

Mã:
Function Timdulieu(POP As Range, Group As Range)
Dim i As Long, sArr(), k As Long, kQ, Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = POP.Value
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If Not Dic.exists(sArr(i, 2)) Then
         k = k + 1
         Dic.Add sArr(i, 2), Array(k, 1)
    Else
            Dic.Item(sArr(i, 2)) = Array(Dic.Item(sArr(i, 2))(0), Dic.Item(sArr(i, 2))(1) + 1)
            If Dic.Item(sArr(i, 2))(1) = 2 Then kQ = sArr(i, 2) & ", " & kQ
    End If
End If
Next
If Len(kQ) > 0 Then Timdulieu = Left(kQ, Len(kQ) - 2)
Set Dic = Nothing
End Function

ồ có vẻ Hoamattroicoi đã nhìn thấy bản chất công thức của #4 rùi . hi hi
doveandrose thật áy náy vì báo hại Hoamattroicoi không được ngủ sớm .
doveandrose không dám múa rìu qua mắt ních xanh đâu , nhưng vì được mời nên cố gắng làm thử vậy
Mã:
Public Function HoamattroiDeThuong(POP As Range, Group As Range) As String
Dim Dic As Object, arr, dk, st As String, r As Long
Set Dic = CreateObject("Scripting.dictionary")
arr = POP.Value: dk = Group.Value
For r = 1 To UBound(arr) Step 1
    If arr(r, 1) = dk Then
        Dic(arr(r, 2)) = Dic(arr(r, 2)) + 1
        If Dic(arr(r, 2)) = 2 Then st = st & ", " & arr(r, 2)
    End If
Next
HoamattroiDeThuong = Mid(st, 3)
End Function
 
Người ta bảo ép dầu, ép mỡ chứ ai nỡ ép code. Sáng nay định ép nốt code nhưng người đẹp dậy sớm đã tiếp sức nhanh quá.

Ngày xưa thầy mình dạy không nên tư duy code theo công thức.
 
Người ta bảo ép dầu, ép mỡ chứ ai nỡ ép code. Sáng nay định ép nốt code nhưng người đẹp dậy sớm đã tiếp sức nhanh quá.

Ngày xưa thầy mình dạy không nên tư duy code theo công thức.
1) Vậy "bi giờ" ép tiếp đi, với dữ liệu như trong bài, đừng xài "đít to đít bé" gì nữa, vẫn một vòng lặp đi với....2 thằng If
2) Nếu dùng Sub lấy kết quả cho 10 em ở cột A sheet1 cùng lúc có thể sử dụng bộ lọc cho vòng lặp chạy ít thôi
Mới nghĩ ra thế, "hông" biết đúng "hông" nữa, bé Còi đừng bắt bác Cò làm nhé. Thân
Híc
 
Lần chỉnh sửa cuối:
OK rồi. Đa tạ mấy bác :D

Giờ em cần thêm 2 yêu cầu này nữa ạ, mấy bác giúp em nốt phát

1. Chuyển cột 3 trong sheet 1 từ dạng "cách nhau dấu phẩy" sang dạng từng thành phần trên mỗi cell (như sheet 2). (Nghĩa là làm ngược lại ấy ạ).

2. Lọc từ cột 3, các "thành phần chỉ có một dấu chấm", mà xuất hiện từ 2 lần trở lên, đưa vào cột 2 (như sheet 1)
Ví dụ : Cột 3 có: NTGP006.10.0066, NTGP006.10.0065, NTGP006.10.0070... thì lấy NTGP006.10 đưa vào cột 2.

Giải thích hơi loằng ngoằng, hi vọng mọi người hiểu... !$@!!
 

File đính kèm

1) Vậy "bi giờ" ép tiếp đi, với dữ liệu như trong bài, đừng xài "đít to đít bé" gì nữa, vẫn một vòng lặp đi với....2 thằng If
2 IF khó nuốt quá bác Cò ơi, bé còi 3 IF nha bác Cò, hihihi
Mã:
Function Timdulieu(POP As Range, Group As Range)
Dim i As Long, sArr(), kQ, onPOP As String
sArr = POP.Value
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If InStr(1, onPOP, sArr(i, 2)) = 0 Then
            onPOP = onPOP & sArr(i, 2)
    Else
            If InStr(1, kQ, sArr(i, 2)) = 0 Then kQ = kQ & ", " & sArr(i, 2)
    End If
End If
Next
Timdulieu = Mid(kQ, 3)
End Function
 
2 IF khó nuốt quá bác Cò ơi, bé còi 3 IF nha bác Cò, hihihi
Mã:
Function Timdulieu(POP As Range, Group As Range)
Dim i As Long, sArr(), kQ, onPOP As String
sArr = POP.Value
For i = 1 To UBound(sArr)
If sArr(i, 1) = Group.Value Then
    If InStr(1, onPOP, sArr(i, 2)) = 0 Then
            onPOP = onPOP & sArr(i, 2)
    Else
            If InStr(1, kQ, sArr(i, 2)) = 0 Then kQ = kQ & ", " & sArr(i, 2)
    End If
End If
Next
Timdulieu = Mid(kQ, 3)
End Function
Híc, cái này tính 2 If là ok rồi, nhìn thấy gọn quá xá cỡ, bé Còi ....giỏi quá
 
OK rồi. Đa tạ mấy bác :D

Giờ em cần thêm 2 yêu cầu này nữa ạ, mấy bác giúp em nốt phát

1. Chuyển cột 3 trong sheet 1 từ dạng "cách nhau dấu phẩy" sang dạng từng thành phần trên mỗi cell (như sheet 2). (Nghĩa là làm ngược lại ấy ạ).

2. Lọc từ cột 3, các "thành phần chỉ có một dấu chấm", mà xuất hiện từ 2 lần trở lên, đưa vào cột 2 (như sheet 1)
Ví dụ : Cột 3 có: NTGP006.10.0066, NTGP006.10.0065, NTGP006.10.0070... thì lấy NTGP006.10 đưa vào cột 2.

Giải thích hơi loằng ngoằng, hi vọng mọi người hiểu... !$@!!

Tiếp chiêu số 1 nhé, số 2 loằng ngoằng khó hiểu quá.
Không chơi với Merge Cells nhé, nếu muốn thì bạn làm thủ công.
PHP:
Public Sub GPE_1()
Dim sArr(), dArr(1 To 1000000, 1 To 2), I As Long, J As Long, K As Long, Tem
sArr = Sheet1.Range(Sheet1.[A2], Sheet1.[C2].End(xlDown)).Value
For I = 1 To UBound(sArr, 1)
    K = K + 1:          dArr(K, 1) = sArr(I, 1):        K = K - 1
    Tem = Split(sArr(I, 3), ", ")
    For J = 0 To UBound(Tem)
        K = K + 1:      dArr(K, 2) = Tem(J)
    Next J
Next I
Sheet2.[A2:B2].Resize(K) = dArr
End Sub
 
Lần chỉnh sửa cuối:
Tiếp chiêu số 1 nhé, số 2 loằng ngoằng khó hiểu quá.
Không chơi với Merge Cells nhé, nếu muốn thì bạn làm thủ công.
PHP:
Public Sub GPE_1()
Dim sArr(), dArr(1 To 1000000, 1 To 2), I As Long, J As Long, K As Long, Tem
sArr = Sheet1.Range(Sheet1.[A2], Sheet1.[C2].End(xlDown)).Value
For I = 1 To UBound(sArr, 1)
    K = K + 1:          dArr(K, 1) = sArr(I, 1):        K = K - 1
    Tem = Split(sArr(I, 3), ", ")
    For J = 0 To UBound(Tem)
        K = K + 1:      dArr(K, 2) = Tem(J)
    Next J
Next I
Sheet2.[A2:B2].Resize(K) = dArr
End Sub

Làm sao để dùng code này vậy bác, em gà mờ vụ này :.,
Bác nào giúp em cái 2 với ạ **~**
 
Khi mở file, chọn Enable Macros, bấm nút ở sheet2
Alt+F11 thấy Code

Được rồi bác %#^#$
Bác giúp em nốt cái 2 với ạ. Cái này nghĩa là trích những thằng nào dạng "NTGP0xx.xx" xuất hiện từ 2 lần trờ lên đưa vào cột 2 trong "Sheet 1".

Cảm ơn bác nhiều @$@!^%
 
Web KT

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

Back
Top Bottom