Nhờ mọi người giúp về việc lấy dữ liệu theo thời gian (6 người xem)

  • Thread starter Thread starter vungoc
  • Ngày gửi Ngày gửi
Liên hệ QC

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

vungoc

Find Sexy Womans from your town for night
Tham gia
2/8/06
Bài viết
633
Được thích
2,604
Giới tính
Nam
Nghề nghiệp
Search
Mình có bảng dữ liệu như file đính kèm

Căn cứ số sổ BHXH và căn cứ cột G tại sheet "dữ liệu gốc", trích xuất ra sheet "báo cáo"

Trong bảng dữ liệu gốc, có thể một người lặp lại nhiều dòng dữ liệu, tuy nhiên mình chỉ muốn căn cứ cột G để lấy dòng dữ liệu có thời gian trước nhất/ nhỏ nhất

VD Người có số sổ BHXH 0200063472 - tên Nguyễn Viết Dũng hiện tại có 3 dòng dữ liệu, và tại cột G hiển thị 3 dòng thời gian là 01/2009; 05/2010 & 06/2009

Lúc này mình chỉ muốn lấy dữ liệu dòng thời gian nhỏ nhất trong 3 mốc thời gian trên là 01/2009

Mình đã minh họa kết quả mong muốn theo như sheet báo cáo kế bên

Đang cần gấp, nên nhờ mọi người ai có giải pháp hay chỉ giúp,

Trân trọng cảm ơn!
 

File đính kèm

Mình có bảng dữ liệu như file đính kèm

Căn cứ số sổ BHXH và căn cứ cột G tại sheet "dữ liệu gốc", trích xuất ra sheet "báo cáo"

Trong bảng dữ liệu gốc, có thể một người lặp lại nhiều dòng dữ liệu, tuy nhiên mình chỉ muốn căn cứ cột G để lấy dòng dữ liệu có thời gian trước nhất/ nhỏ nhất

VD Người có số sổ BHXH 0200063472 - tên Nguyễn Viết Dũng hiện tại có 3 dòng dữ liệu, và tại cột G hiển thị 3 dòng thời gian là 01/2009; 05/2010 & 06/2009

Lúc này mình chỉ muốn lấy dữ liệu dòng thời gian nhỏ nhất trong 3 mốc thời gian trên là 01/2009

Mình đã minh họa kết quả mong muốn theo như sheet báo cáo kế bên

Đang cần gấp, nên nhờ mọi người ai có giải pháp hay chỉ giúp,

Trân trọng cảm ơn!
Bạn dùng thử công thức này:
=MIN(IF(--A2=--'Du lieu goc'!$A$2:$A$38,--'Du lieu goc'!$G$2:$G$38,""))
Ctrl+Shift+Enter
Dịnh dạng là mm/yyyy
 
Bạn dùng thử công thức này:
=MIN(IF(--A2=--'Du lieu goc'!$A$2:$A$38,--'Du lieu goc'!$G$2:$G$38,""))
Ctrl+Shift+Enter
Dịnh dạng là mm/yyyy

Ý mình là muốn nó trích xuất từ sheet dữ liệu gốc sang sheet báo cáo tương ứng đủ cột và dòng như mình đã mình họa
Chứ không phải là sheet báo cáo đã có sẵn các cột dữ liệu, và chỉ ráp dữ liệu vào cột G đâu bạn
 
Lần chỉnh sửa cuối:
Ý mình là muốn nó trích xuất từ sheet dữ liệu gốc sang sheet báo cáo tương ứng đủ cột và dòng như mình đã mình họa
Chứ không phải là sheet báo cáo đã có dữ liệu sẵn, chỉ ráp vào cột G đâu bạn
Dùng VBA có được không anh?
 
Mình có bảng dữ liệu như file đính kèm

Căn cứ số sổ BHXH và căn cứ cột G tại sheet "dữ liệu gốc", trích xuất ra sheet "báo cáo"

Trong bảng dữ liệu gốc, có thể một người lặp lại nhiều dòng dữ liệu, tuy nhiên mình chỉ muốn căn cứ cột G để lấy dòng dữ liệu có thời gian trước nhất/ nhỏ nhất

VD Người có số sổ BHXH 0200063472 - tên Nguyễn Viết Dũng hiện tại có 3 dòng dữ liệu, và tại cột G hiển thị 3 dòng thời gian là 01/2009; 05/2010 & 06/2009

Lúc này mình chỉ muốn lấy dữ liệu dòng thời gian nhỏ nhất trong 3 mốc thời gian trên là 01/2009

Mình đã minh họa kết quả mong muốn theo như sheet báo cáo kế bên

Đang cần gấp, nên nhờ mọi người ai có giải pháp hay chỉ giúp,

Trân trọng cảm ơn!
Nếu dùng code cho file này thì rất ok, không biết anh có chịu code không?...nhưng mà em nghĩ trình độ anh giải quyết cũng được mà,nếu gấp thì mai em chỉ viết được thôi, h đang đi làm rồi anh ơi!
 
Nếu dùng code cho file này thì rất ok, không biết anh có chịu code không?...nhưng mà em nghĩ trình độ anh giải quyết cũng được mà,nếu gấp thì mai em chỉ viết được thôi, h đang đi làm rồi anh ơi!

Dùng hàm hay code gì cũng được, Tks bạn!
 
Ý mình là muốn nó trích xuất từ sheet dữ liệu gốc sang sheet báo cáo tương ứng đủ cột và dòng như mình đã mình họa
Chứ không phải là sheet báo cáo đã có sẵn các cột dữ liệu, và chỉ ráp dữ liệu vào cột G đâu bạn
Mượn cột j làm cột phụ để lọc:
J2 =--G2=MIN(IF(--A2=--'Du lieu goc'!$A$2:$A$38,--'Du lieu goc'!$G$2:$G$38,""))
Kéo xuống, dòng nào True thì lấy
 
Mình có bảng dữ liệu như file đính kèm

Căn cứ số sổ BHXH và căn cứ cột G tại sheet "dữ liệu gốc", trích xuất ra sheet "báo cáo"

Trong bảng dữ liệu gốc, có thể một người lặp lại nhiều dòng dữ liệu, tuy nhiên mình chỉ muốn căn cứ cột G để lấy dòng dữ liệu có thời gian trước nhất/ nhỏ nhất

VD Người có số sổ BHXH 0200063472 - tên Nguyễn Viết Dũng hiện tại có 3 dòng dữ liệu, và tại cột G hiển thị 3 dòng thời gian là 01/2009; 05/2010 & 06/2009

Lúc này mình chỉ muốn lấy dữ liệu dòng thời gian nhỏ nhất trong 3 mốc thời gian trên là 01/2009

Mình đã minh họa kết quả mong muốn theo như sheet báo cáo kế bên

Đang cần gấp, nên nhờ mọi người ai có giải pháp hay chỉ giúp,

Trân trọng cảm ơn!
Với dữ liệu như bạn đưa lên thì có thể dùng File này! Bạn mở File nhấn nút "LỌC" và xem kết quả!
 

File đính kèm

File đính kèm

Thử code sau, hên xui nha, Dữ liệu phải được sort trước nha.
Mã:
Option Explicit
Sub GPE()
Dim Dic As Object, Tmp
Dim sArr, dArr(1 To 65000, 1 To 9)
Dim K As Long, r As Long, dMin, J As Long
With Sheet1
    sArr = .Range(.[A2], .[A65000].End(3)).Resize(, 9).Value
End With
Set Dic = CreateObject("Scripting.Dictionary")
    For r = 1 To UBound(sArr)
        Tmp = sArr(r, 1) * 1
        dMin = sArr(r, 7)
        If Dic.Exists(Tmp) Then
            If dArr(Dic.Item(Tmp), 7) > dMin Then
                dArr(Dic.Item(Tmp), 7) = dMin
            End If
        Else
            K = K + 1
            Dic.Add Tmp, K
            For J = 1 To UBound(sArr, 2)
                dArr(K, J) = sArr(r, J)
                'dArr(K, 1) = Tmp
                'dArr(K, 7) = dMin
            Next J
        End If
    Next r
With Sheet2
    .Range("A2:I65000").ClearContents
    If K Then .Range("A2").Resize(K, 9).Value = dArr
End With
End Sub
Đoạn code của bạn dài hơn code bài #9 tuy nhiên tôi thử vẫn cho ra cùng 1 kết quả. Không hiểu sao bạn phải rườm rà vậy làm gì nhỉ?
 
Thử code sau, hên xui nha, Dữ liệu phải được sort trước nha.
Mã:
Option Explicit
Sub GPE()
Dim Dic As Object, Tmp
Dim sArr, dArr(1 To 65000, 1 To 9)
Dim K As Long, r As Long, dMin, J As Long
With Sheet1
    sArr = .Range(.[A2], .[A65000].End(3)).Resize(, 9).Value
End With
Set Dic = CreateObject("Scripting.Dictionary")
    For r = 1 To UBound(sArr)
        Tmp = sArr(r, 1) * 1
        dMin = sArr(r, 7)
        If Dic.Exists(Tmp) Then
            If dArr(Dic.Item(Tmp), 7) > dMin Then
                dArr(Dic.Item(Tmp), 7) = dMin
            End If
        Else
            K = K + 1
            Dic.Add Tmp, K
            For J = 1 To UBound(sArr, 2)
                dArr(K, J) = sArr(r, J)
                'dArr(K, 1) = Tmp
                'dArr(K, 7) = dMin
            Next J
        End If
    Next r
With Sheet2
    .Range("A2:I65000").ClearContents
    If K Then .Range("A2").Resize(K, 9).Value = dArr
End With
End Sub

xin bạn cho biết kết quả của thủ tục này ?
Mã:
Public Sub hell()
MsgBox Sheet1.[G3].Value & " > " & Sheet1.[G4].Value & " : " & _
(Sheet1.[G3].Value > Sheet1.[G4].Value)
End Sub
 
Đoạn code của bạn dài hơn code bài #9 tuy nhiên tôi thử vẫn cho ra cùng 1 kết quả. Không hiểu sao bạn phải rườm rà vậy làm gì nhỉ?

1/ Rườm rà hay không có quan trọng không bạn . Bạn cần 1 bài giải đúng hay 1 bài giải gọn gàng mà sai bét ?
2/Bạn có hiểu #9 làm gì và #11 tại sao có sự khác nhau không ? hay bạn chỉ thấy #9 ngắn hơn là khoái chí ? Nếu bạn không hiểu thì cũng đừng viết bình luận tiếp theo nhé .
Chào bạn
 
Tôi chưa xem code #9 như nào. Nên không biết nó dài ngắn thế nào... nhưng mỗi người có cách trình bày khác nhau. Không biết ở trên tôi trả lời vậy làm cho bạn thấy rườm rà, thật là có lỗi quá đi ah. --=0

Cái này mới thật là "rườm rà" nè. Nhưng tui thì khoái cái rườm rà này hơn khi cột G là Text, lại chẳng "chắc ăn" là cùng 1 số của cột A thì dòng trên cột G luôn nhỏ hơn dòng dưới. Nếu "chắc ăn" số trong cột A từ trên xuống xuất hiện lần đầu tiên luôn có "cái chuỗi" trong cột G là "nhỏ nhất" thì code chẳng cần đến Dic.
Chuỗi "01/2015" và chuỗi "09/2009" nếu đem so sánh thì cái nào nhỏ hơn cái nào?
PHP:
Public Sub GPE()
Dim Dic As Object, Tem As String, sArr(), dArr(), I As Long, J As Long, K As Long, Rws As Long, Ngay1 As Long, Ngay2 As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Du lieu goc")
    sArr = .Range(.[A2], .[A2].End(xlDown)).Resize(, 9).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 9)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        For J = 1 To 9
            dArr(K, J) = sArr(I, J)
        Next J
    Else
        Rws = Dic.Item(Tem)
        Ngay2 = DateSerial(Right(sArr(I, 7), 4), Left(sArr(I, 7), 2), 1)
        Ngay1 = DateSerial(Right(dArr(Rws, 7), 4), Left(dArr(Rws, 7), 2), 1)
        If Ngay2 < Ngay1 Then
            For J = 1 To 9
                dArr(Rws, J) = sArr(I, J)
            Next J
        End If
    End If
Next I
With Sheets("Bao cao")
    .[A2].Resize(K, 9) = dArr
End With
Set Dic = Nothing
End Sub
Format Text Cột G sheet Bao cao sẽ được dữ liệu nguyên bản
 
Lần chỉnh sửa cuối:
Đoạn code của bạn dài hơn code bài #9 tuy nhiên tôi thử vẫn cho ra cùng 1 kết quả. Không hiểu sao bạn phải
rườm rà vậy làm gì nhỉ?
Cơ sở dữ liệu của tác giả, ngẫu nhiên khi một người xuất hiện nhiều lần thì dòng đầu tiên đang luôn là nhỏ hơn các dòng còn lại (ngày tháng) nhưng nếu ko được xếp theo thứ tự từ nhỏ đến lớn thì phải thêm một điều kiện để bẫy như hai tác giả làm sau cùng bạn nhé mới là tổng quát. Tất nhiện Côt G phải format dạng text mới được
Xin lỗi tác giả là ok, nhầm cũng là điều bình thường thôi,__--__
 
1/ Rườm rà hay không có quan trọng không bạn . Bạn cần 1 bài giải đúng hay 1 bài giải gọn gàng mà sai bét ?
2/Bạn có hiểu #9 làm gì và #11 tại sao có sự khác nhau không ? hay bạn chỉ thấy #9 ngắn hơn là khoái chí ? Nếu bạn không hiểu thì cũng đừng viết bình luận tiếp theo nhé .
Chào bạn
Tôi nghĩ bạn mới là người không hiểu đó. Bạn đã test thử code của HPKhuong chưa mà dám phán vậy? Bạn thử đoạn code của HPKuong và của Seikoqn với File sau xem có khác biệt gì không?
P/S: Với code của seikoqn bạn ấy lấy dữ liệu đầu tiên tìm thấy với dữ liệu mà tác giả đưa lên thì code này là ổn rồi còn gì? Còn nếu dữ liệu của tác giả khác thì tất nhiên nó sẽ sai hoàn toàn! tuy nhiên code sau mà bạn nói là giải quyết được vấn đề nhưng tôi test thấy cũng ra kết quả như code #9-=.,,
Mời bạn Test!
 

File đính kèm

Cái này mới thật là "rườm rà" nè. Nhưng tui thì khoái cái rườm rà này hơn khi cột G là Text, lại chẳng "chắc ăn" là cùng 1 số của cột A thì dòng trên cột G luôn nhỏ hơn dòng dưới. Nếu "chắc ăn" số trong cột A từ trên xuống xuất hiện lần đầu tiên luôn có "cái chuỗi" trong cột G là "nhỏ nhất" thì code chẳng cần đến Dic.
Chuỗi "01/2015" và chuỗi "09/2009" nếu đem so sánh thì cái nào nhỏ hơn cái nào?
PHP:
Public Sub GPE()
Dim Dic As Object, Tem As String, sArr(), dArr(), I As Long, J As Long, K As Long, Rws As Long, Ngay1 As Long, Ngay2 As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Du lieu goc")
    sArr = .Range(.[A2], .[A2].End(xlDown)).Resize(, 9).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 9)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        For J = 1 To 9
            dArr(K, J) = sArr(I, J)
        Next J
    Else
        Rws = Dic.Item(Tem)
        Ngay2 = DateSerial(Right(sArr(I, 7), 4), Left(sArr(I, 7), 2), 1)
        Ngay1 = DateSerial(Right(dArr(Rws, 7), 4), Left(dArr(Rws, 7), 2), 1)
        If Ngay2 < Ngay1 Then
            For J = 1 To 9
                dArr(Rws, J) = sArr(I, J)
            Next J
        End If
    End If
Next I
With Sheets("Bao cao")
    .[A2].Resize(K, 9) = dArr
End With
Set Dic = Nothing
End Sub
Format Text Cột G sheet Bao cao sẽ được dữ liệu nguyên bản
Code này rộng rãi quá! tìm được tận 2 ông "Nguyễn Văn Dũng"
 
Code này rộng rãi quá! tìm được tận 2 ông "Nguyễn Văn Dũng"

Vì cột A, ông Dũng dòng đầu là Number (do ai đó thọt tay vào làm dữ liệu không chuẩn), các dòng dưới là Text, số sổ BHXH khác nhau nên sẽ có 2 người khác nhau thôi. Cái gì cũng có chuẩn mực của nó.
1/ Bạn xem kết quả "thật" của cột A trong sheet [Bao cao], dữ liệu nó là gì?
2/ Format cột G cả 2 sheet là Text, bạn sửa thử G2 sheet [Du lieu goc] thành chuỗi "01/2015" xem kết quả nó lọc ra sao?
 
Lần chỉnh sửa cuối:
Tôi nghĩ bạn mới là người không hiểu đó. Bạn đã test thử code của HPKhuong chưa mà dám phán vậy? Bạn thử đoạn code của HPKuong và của Seikoqn với File sau xem có khác biệt gì không?
P/S: Với code của seikoqn bạn ấy lấy dữ liệu đầu tiên tìm thấy với dữ liệu mà tác giả đưa lên thì code này là ổn rồi còn gì? Còn nếu dữ liệu của tác giả khác thì tất nhiên nó sẽ sai hoàn toàn! tuy nhiên code sau mà bạn nói là giải quyết được vấn đề nhưng tôi test thấy cũng ra kết quả như code #9-=.,,
Mời bạn Test!
xin hỏi tôi nói cách của hpKhuong đã giải quyết được vấn đề khi nào vậy ta ?
Bạn cũng nên dùng đầu óc 1 chút để suy nghĩ nếu tôi cho rằng cách của hpKhuong là đúng thì tôi có cần viết ra #13 không bạn ?
cuộc sống thú vị ở chỗ luôn có ngoại lệ , nếu cùng 1 người thì lần mua bảo hiểm trước luôn luôn được ghi trước các lần mua sau thì đời đẹp quá rồi . Nếu được vậy thì cứ dùng code #9 , còn nếu muốn kê cao gối ngủ mà không cần lo rằng lần mua đầu tiên phải ghi đầu tiên thì dùng code #16 , vậy thôi .
 
Code này rộng rãi quá! tìm được tận 2 ông "Nguyễn Văn Dũng"
dữ liệu này 98% khả năng là xuất ra từ phần mềm , nếu tự ý chọt tay vào mà sửa thì người dùng phải tự chịu trách nhiệm chứ
Bạn thử chọt tay vào cột G double_click rồi Enter xem sao ?
 
Web KT

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

Back
Top Bottom