Lấy dữ liệu từ file khác theo điều kiện

Liên hệ QC

bigbabol89

Thành viên thường trực
Tham gia
15/10/12
Bài viết
225
Được thích
34
Em chào các anh chị,
Em có 02 file DATA và LOC, em muốn lấy dữ liệu từ file DATA sang file LOC theo điều kiện mã và tiêu đề cột nhưng không cần phải mở file DATA lên.
Em có ghi chi tiết ở trong file LOC ( đính kèm ).
Mong các anh chị giúp đỡ.
Em cám ơn ạ.
 

File đính kèm

Em chào các anh chị,
Em có 02 file DATA và LOC, em muốn lấy dữ liệu từ file DATA sang file LOC theo điều kiện mã và tiêu đề cột nhưng không cần phải mở file DATA lên.
Em có ghi chi tiết ở trong file LOC ( đính kèm ).
Mong các anh chị giúp đỡ.
Em cám ơn ạ.
Các tiêu đề cột nó cố định không @bigbabol89 ?
 
Upvote 0
Nó không có định anh ạ, điều kiện tìm là tên cột. Nhưng nếu mong muốn theo tệt cột không được thì em tự chỉnh theo số cột cũng được a
Vừa dò tìm vừa lấy dữ liệu theo tiêu đề cột, cái này mình chưa đủ sức, cái ý tưởng này cũng hay, chờ anh chị khác xem có cách nào giúp bạn không nhé!
 
Upvote 0
Em chào các anh chị,
Em có 02 file DATA và LOC, em muốn lấy dữ liệu từ file DATA sang file LOC theo điều kiện mã và tiêu đề cột nhưng không cần phải mở file DATA lên.
Em có ghi chi tiết ở trong file LOC ( đính kèm ).
Mong các anh chị giúp đỡ.
Em cám ơn ạ.
Cái này có thể sử dụng Advanced Filter là làm được, bạn hãy thử xem.
 
Upvote 0
Dạ, advanced filter bằng tay thì em nghĩ không làm được như ý em.
Còn macro thì em không biết làm anh ạ.
Lúc trước bác @HieuCD có hỗ trợ viết một code tham chiếu file đóng mình viết lại cho bạn theo file, cái này cũng gần 90% theo yêu cầu của bạn.
chỉ điều mình chưa biết cách thức dò tìm tiêu đề cột gán vào đoạn sRng.Offset(0, 1).Resize(, 7).Value = Res đã nghĩ tới find(tieudecot)= Res đại loại là thế mà chưa nghĩ ra cách viết code thôi thì để anh chị khác đi ngang tiếp sức viết tiếp đoạn này nhé

Mã:
Dim Dic As Object

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sRng As Range, Res(), Cot_DATA As Variant, i As Long, sRow As Long
 
  Application.EnableEvents = False
  Application.ScreenUpdating = False
  Set sRng = Intersect(Range("A5:A600000"), Target)
 
  
  If Not sRng Is Nothing Then
    If Dic Is Nothing Then Call CreateDic
    If Not Dic Is Nothing Then
      sRow = sRng.Rows.Count
      ReDim Res(1 To sRow, 1 To 9)
      For i = 1 To sRow
        Cot_DATA = Dic.Item(sRng(i, 1).Value)
        If TypeName(Cot_DATA) = "Variant()" Then
          Res(i, 1) = Cot_DATA(0): _
          Res(i, 2) = Cot_DATA(1): _
          Res(i, 3) = Cot_DATA(2): _
          Res(i, 4) = Cot_DATA(3): _
          Res(i, 5) = Cot_DATA(4): _
          Res(i, 6) = Cot_DATA(5): _
          Res(i, 7) = Cot_DATA(6)
        End If
      Next i
      sRng.Offset(0, 1).Resize(, 7).Value = Res
    End If
  End If
  Application.EnableEvents = True
  Application.ScreenUpdating = True
End Sub

Private Sub CreateDic()
  Dim sArr As Variant, j As Long, k As Long, iKey
 
  On Error Resume Next
  With CreateObject("ADODB.Connection")
    .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\DATA.xlsx;Extended Properties=""Excel 12.0;HDR=No"""
    sArr = .Execute("select * from [DATA$B4:I60000] where f1 is not null").GetRows
  End With
  If Err.Number = 0 Then
    Set Dic = CreateObject("Scripting.Dictionary")
    For j = 0 To UBound(sArr, 2)
      iKey = sArr(0, j)
      If Len(iKey) > 0 Then
        If Not Dic.exists(iKey) Then
          Dic.Add iKey, Array(sArr(1, j), sArr(2, j), sArr(3, j), sArr(4, j), sArr(5, j), sArr(6, j), sArr(7, j))
        End If
      End If
    Next
  Else
    MsgBox ("Khong tìm thay File du lieu")
    On Error GoTo 0
  End If
End Sub
 

File đính kèm

Upvote 0
Lúc trước bác @HieuCD có hỗ trợ viết một code tham chiếu file đóng mình viết lại cho bạn theo file, cái này cũng gần 90% theo yêu cầu của bạn.
chỉ điều mình chưa biết cách thức dò tìm tiêu đề cột gán vào đoạn sRng.Offset(0, 1).Resize(, 7).Value = Res đã nghĩ tới find(tieudecot)= Res đại loại là thế mà chưa nghĩ ra cách viết code thôi thì để anh chị khác đi ngang tiếp sức viết tiếp đoạn này nhé

Mã:
Dim Dic As Object

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sRng As Range, Res(), Cot_DATA As Variant, i As Long, sRow As Long

  Application.EnableEvents = False
  Application.ScreenUpdating = False
  Set sRng = Intersect(Range("A5:A600000"), Target)

 
  If Not sRng Is Nothing Then
    If Dic Is Nothing Then Call CreateDic
    If Not Dic Is Nothing Then
      sRow = sRng.Rows.Count
      ReDim Res(1 To sRow, 1 To 9)
      For i = 1 To sRow
        Cot_DATA = Dic.Item(sRng(i, 1).Value)
        If TypeName(Cot_DATA) = "Variant()" Then
          Res(i, 1) = Cot_DATA(0): _
          Res(i, 2) = Cot_DATA(1): _
          Res(i, 3) = Cot_DATA(2): _
          Res(i, 4) = Cot_DATA(3): _
          Res(i, 5) = Cot_DATA(4): _
          Res(i, 6) = Cot_DATA(5): _
          Res(i, 7) = Cot_DATA(6)
        End If
      Next i
      sRng.Offset(0, 1).Resize(, 7).Value = Res
    End If
  End If
  Application.EnableEvents = True
  Application.ScreenUpdating = True
End Sub

Private Sub CreateDic()
  Dim sArr As Variant, j As Long, k As Long, iKey

  On Error Resume Next
  With CreateObject("ADODB.Connection")
    .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\DATA.xlsx;Extended Properties=""Excel 12.0;HDR=No"""
    sArr = .Execute("select * from [DATA$B4:I60000] where f1 is not null").GetRows
  End With
  If Err.Number = 0 Then
    Set Dic = CreateObject("Scripting.Dictionary")
    For j = 0 To UBound(sArr, 2)
      iKey = sArr(0, j)
      If Len(iKey) > 0 Then
        If Not Dic.exists(iKey) Then
          Dic.Add iKey, Array(sArr(1, j), sArr(2, j), sArr(3, j), sArr(4, j), sArr(5, j), sArr(6, j), sArr(7, j))
        End If
      End If
    Next
  Else
    MsgBox ("Khong tìm thay File du lieu")
    On Error GoTo 0
  End If
End Sub
Em không biết nhiều về VBA nên cũng khó diễn tả. Em có tìm thấy ở diễn đàn code này :
Mã:
For iCol = 1 To reportSheet.UsedRange.Columns.Count
    
    title = reportSheet.Cells(14, iCol).Value
    columnSheetDataFound = sheetDATA.Range("C9", "XDF19").Find(title).Column
    
    If columnSheetDataFound <> 0 Then
        sheetDATA.Range(sheetDATA.Cells(9, columnSheetDataFound), sheetDATA.Cells(LR, columnSheetDataFound)).Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy
            reportSheet.Cells(16, iCol).PasteSpecial Paste:=xlPasteValuesAndNumberFormats

    End If
    columnSheetDataFound = 0
Next
Anh xem có phát triển tiếp giúp em được không với ạ.
Em cám ơn.
 
Upvote 0
Em không biết nhiều về VBA nên cũng khó diễn tả. Em có tìm thấy ở diễn đàn code này :
Mã:
For iCol = 1 To reportSheet.UsedRange.Columns.Count
   
    title = reportSheet.Cells(14, iCol).Value
    columnSheetDataFound = sheetDATA.Range("C9", "XDF19").Find(title).Column
   
    If columnSheetDataFound <> 0 Then
        sheetDATA.Range(sheetDATA.Cells(9, columnSheetDataFound), sheetDATA.Cells(LR, columnSheetDataFound)).Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy
            reportSheet.Cells(16, iCol).PasteSpecial Paste:=xlPasteValuesAndNumberFormats

    End If
    columnSheetDataFound = 0
Next
Anh xem có phát triển tiếp giúp em được không với ạ.
Em cám ơn.
Nhưng chưa biết cách gán vào Res
Gán biến TieuDe = [B4:I4].Value vùng tiêu đề xong tìm
Cells.Find(TieuDe).Offset(0, 1).End(4).Resize(, 7).Value = Res
mà hình như có gì đó sai sai nhưng na ná phải như vậy thì mới gán đúng dữ liệu theo tiêu đề, chắc phải nhờ các bác đi ngang hỗ trợ bạn mình chỉ có thể gợi ý tưởng thôi chư viết thì chưa tìm ra cách.
 
Upvote 0
Hãy luôn mô tả dữ liệu, đừng bắt người khác phải đoán mò.

Trong DATA tôi thấy dữ liệu bắt đầu từ dòng 3 và từ cột B. Luôn thế hay đó chỉ là ví dụ ngẫu nhiên?

Trong LOC thì dữ liệu nhập tay là dòng 4 và cột A? Sau khi có dòng 4 và cột A (A4:...4, A4:A...) thì chạy code?

Tại sao cứ nhất thiết phải lấy từ tập tin đóng? Mở DATA -> lấy dữ liệu -> đóng DATA bí cấm tuyệt đối?
 
Lần chỉnh sửa cuối:
Upvote 0
Thôi tôi làm cho bạn, nhưng với giả thiết sau:

- trong DATA dữ liệu luôn bắt đầu từ dòng 3 và từ cột B.
- trong LOC thì dữ liệu nhập tay là dòng 4 (số cột tùy ý) bắt đầu từ A4, và cột A bắt đầu từ A5.

Tôi không phải loại dại gái đâu bác ... nhé. :D

Tôi chú thích nhiều để nếu bạn tự chỉnh sửa thì dễ cho bạn rất nhiều.

Mã:
Sub loc()
Dim curr_row As Long, curr_col As Long, r As Long, c As Long, data(), result(), dic As Object, sh As Worksheet, wb As Workbook
    Set sh = ThisWorkbook.Worksheets("LOC")
'    xet tap tin LOC
    With sh
'        xoa du lieu cu. Gia thiet la co nhieu nhat 100 000 Ma va 100 Cot
        .Range("B5").Resize(10000, 100).ClearContents
        curr_col = .Cells(4, Columns.Count).End(xlToLeft).Column
        If curr_col < 2 Then Exit Sub
        curr_row = .Cells(Rows.Count, "A").End(xlUp).Row
        If curr_row < 5 Then Exit Sub
'        mang ket qua
        result = .Range(.Range("A4"), .Cells(curr_row, curr_col)).Value
    End With
'    mo tap tin DATA -> doc du lieu -> dong tap tin
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\DATA.xlsx")
    With wb.Worksheets("DATA")
        curr_col = .Cells(3, Columns.Count).End(xlToLeft).Column
        curr_row = .Cells(Rows.Count, "B").End(xlUp).Row
'        mang nguon
        If curr_col >= 3 And curr_row >= 4 Then data = .Range(.Range("B3"), .Cells(curr_row, curr_col)).Value
    End With
    wb.Close
    If curr_col < 3 Or curr_row < 4 Then Exit Sub
    
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
'    tieu de cot trong DATA voi tu cach la key va chi so cot cua no trong mang data voi tu cach la item
    For c = 2 To UBound(data, 2)
        If Not dic.exists(data(1, c)) Then dic.Add data(1, c), c
    Next c
'    cac Ma trong DATA voi tu cach la key va chi so dong cua no trong mang data voi tu cach la item
    For r = 2 To UBound(data)
        If Not dic.exists(data(r, 1)) Then dic.Add data(r, 1), r
    Next r
'    duyet mang ket qua
    For r = 2 To UBound(result)
'        neu ton tai Ma hien hanh trong DATA
        If dic.exists(result(r, 1)) Then
'            doc ra chi so dong trong mang data ung voi Ma
            curr_row = dic.Item(result(r, 1))
            For c = 2 To UBound(result, 2)
'                neu ton tai Cot hien hanh trong DATA
                If dic.exists(result(1, c)) Then
''                    doc ra chi so cot trong mang data ung voi ten cot
                    curr_col = dic.Item(result(1, c))
                    result(r, c) = data(curr_row, curr_col)
                End If
            Next c
        End If
    Next r
    
    sh.Range("A4").Resize(UBound(result), UBound(result, 2)).Value = result
    Set dic = Nothing
End Sub
 
Upvote 0
Thôi tôi làm cho bạn, nhưng với giả thiết sau:

- trong DATA dữ liệu luôn bắt đầu từ dòng 3 và từ cột B.
- trong LOC thì dữ liệu nhập tay là dòng 4 (số cột tùy ý) bắt đầu từ A4, và cột A bắt đầu từ A5.

Tôi không phải loại dại gái đâu bác ... nhé. :D

Tôi chú thích nhiều để nếu bạn tự chỉnh sửa thì dễ cho bạn rất nhiều.

Mã:
Sub loc()
Dim curr_row As Long, curr_col As Long, r As Long, c As Long, data(), result(), dic As Object, sh As Worksheet, wb As Workbook
    Set sh = ThisWorkbook.Worksheets("LOC")
'    xet tap tin LOC
    With sh
'        xoa du lieu cu. Gia thiet la co nhieu nhat 100 000 Ma va 100 Cot
        .Range("B5").Resize(10000, 100).ClearContents
        curr_col = .Cells(4, Columns.Count).End(xlToLeft).Column
        If curr_col < 2 Then Exit Sub
        curr_row = .Cells(Rows.Count, "A").End(xlUp).Row
        If curr_row < 5 Then Exit Sub
'        mang ket qua
        result = .Range(.Range("A4"), .Cells(curr_row, curr_col)).Value
    End With
'    mo tap tin DATA -> doc du lieu -> dong tap tin
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\DATA.xlsx")
    With wb.Worksheets("DATA")
        curr_col = .Cells(3, Columns.Count).End(xlToLeft).Column
        curr_row = .Cells(Rows.Count, "B").End(xlUp).Row
'        mang nguon
        If curr_col >= 3 And curr_row >= 4 Then data = .Range(.Range("B3"), .Cells(curr_row, curr_col)).Value
    End With
    wb.Close
    If curr_col < 3 Or curr_row < 4 Then Exit Sub
   
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
'    tieu de cot trong DATA voi tu cach la key va chi so cot cua no trong mang data voi tu cach la item
    For c = 2 To UBound(data, 2)
        If Not dic.exists(data(1, c)) Then dic.Add data(1, c), c
    Next c
'    cac Ma trong DATA voi tu cach la key va chi so dong cua no trong mang data voi tu cach la item
    For r = 2 To UBound(data)
        If Not dic.exists(data(r, 1)) Then dic.Add data(r, 1), r
    Next r
'    duyet mang ket qua
    For r = 2 To UBound(result)
'        neu ton tai Ma hien hanh trong DATA
        If dic.exists(result(r, 1)) Then
'            doc ra chi so dong trong mang data ung voi Ma
            curr_row = dic.Item(result(r, 1))
            For c = 2 To UBound(result, 2)
'                neu ton tai Cot hien hanh trong DATA
                If dic.exists(result(1, c)) Then
''                    doc ra chi so cot trong mang data ung voi ten cot
                    curr_col = dic.Item(result(1, c))
                    result(r, c) = data(curr_row, curr_col)
                End If
            Next c
        End If
    Next r
   
    sh.Range("A4").Resize(UBound(result), UBound(result, 2)).Value = result
    Set dic = Nothing
End Sub
Tuyệt vời ! Giả thiết anh đưa ra đúng luôn với ý em.
Em gọi là mò mẫm với VBA nên anh chú thích như vậy cũng tiện lắm ( mặc dù em đọc chú thích cũng chỉ hiểu 50% :) )
 
Upvote 0
Thôi tôi làm cho bạn, nhưng với giả thiết sau:

- trong DATA dữ liệu luôn bắt đầu từ dòng 3 và từ cột B.
- trong LOC thì dữ liệu nhập tay là dòng 4 (số cột tùy ý) bắt đầu từ A4, và cột A bắt đầu từ A5.

Tôi không phải loại dại gái đâu bác ... nhé. :D

Tôi chú thích nhiều để nếu bạn tự chỉnh sửa thì dễ cho bạn rất nhiều.

Mã:
Sub loc()
Dim curr_row As Long, curr_col As Long, r As Long, c As Long, data(), result(), dic As Object, sh As Worksheet, wb As Workbook
    Set sh = ThisWorkbook.Worksheets("LOC")
'    xet tap tin LOC
    With sh
'        xoa du lieu cu. Gia thiet la co nhieu nhat 100 000 Ma va 100 Cot
        .Range("B5").Resize(10000, 100).ClearContents
        curr_col = .Cells(4, Columns.Count).End(xlToLeft).Column
        If curr_col < 2 Then Exit Sub
        curr_row = .Cells(Rows.Count, "A").End(xlUp).Row
        If curr_row < 5 Then Exit Sub
'        mang ket qua
        result = .Range(.Range("A4"), .Cells(curr_row, curr_col)).Value
    End With
'    mo tap tin DATA -> doc du lieu -> dong tap tin
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\DATA.xlsx")
    With wb.Worksheets("DATA")
        curr_col = .Cells(3, Columns.Count).End(xlToLeft).Column
        curr_row = .Cells(Rows.Count, "B").End(xlUp).Row
'        mang nguon
        If curr_col >= 3 And curr_row >= 4 Then data = .Range(.Range("B3"), .Cells(curr_row, curr_col)).Value
    End With
    wb.Close
    If curr_col < 3 Or curr_row < 4 Then Exit Sub
   
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
'    tieu de cot trong DATA voi tu cach la key va chi so cot cua no trong mang data voi tu cach la item
    For c = 2 To UBound(data, 2)
        If Not dic.exists(data(1, c)) Then dic.Add data(1, c), c
    Next c
'    cac Ma trong DATA voi tu cach la key va chi so dong cua no trong mang data voi tu cach la item
    For r = 2 To UBound(data)
        If Not dic.exists(data(r, 1)) Then dic.Add data(r, 1), r
    Next r
'    duyet mang ket qua
    For r = 2 To UBound(result)
'        neu ton tai Ma hien hanh trong DATA
        If dic.exists(result(r, 1)) Then
'            doc ra chi so dong trong mang data ung voi Ma
            curr_row = dic.Item(result(r, 1))
            For c = 2 To UBound(result, 2)
'                neu ton tai Cot hien hanh trong DATA
                If dic.exists(result(1, c)) Then
''                    doc ra chi so cot trong mang data ung voi ten cot
                    curr_col = dic.Item(result(1, c))
                    result(r, c) = data(curr_row, curr_col)
                End If
            Next c
        End If
    Next r
   
    sh.Range("A4").Resize(UBound(result), UBound(result, 2)).Value = result
    Set dic = Nothing
End Sub
Anh ơi, anh cho em hỏi: ở các cột ở sheet LOC mà không trùng tiêu đề DATA thì khi em chạy nó copy value luôn (nếu nó là công thức), các cột em bôi vàng đó.
Anh sửa giúp em giữ nguyên giá trị hay công thức ở các cột không trùng tiêu đề được không ạ.
Em cám ơn anh.
 
Upvote 0
Anh ơi, anh cho em hỏi: ở các cột ở sheet LOC mà không trùng tiêu đề DATA thì khi em chạy nó copy value luôn (nếu nó là công thức), các cột em bôi vàng đó.
Anh sửa giúp em giữ nguyên giá trị hay công thức ở các cột không trùng tiêu đề được không ạ.
Em cám ơn anh.
Nếu ý bạn là muốn giữ các ô mầu vàng thì xóa 2 dòng ở gần đầu.
Mã:
'        xoa du lieu cu. Gia thiet la co nhieu nhat 100 000 Ma va 100 Cot
        .Range("B5").Resize(10000, 100).ClearContents
Nếu ý khác thì đính lại tập tin LOC với công thức gì đó ở các cột mầu vàng và giải thích chi tiết.
 
Upvote 0
Nếu ý bạn là muốn giữ các ô mầu vàng thì xóa 2 dòng ở gần đầu.
Mã:
'        xoa du lieu cu. Gia thiet la co nhieu nhat 100 000 Ma va 100 Cot
        .Range("B5").Resize(10000, 100).ClearContents
Nếu ý khác thì đính lại tập tin LOC với công thức gì đó ở các cột mầu vàng và giải thích chi tiết.
Em gửi file, em ghi chú ở trong file đính kèm ạ.
 

File đính kèm

Upvote 0
Em gửi file, em ghi chú ở trong file đính kèm ạ.
Thử sửa đoạn này xem được không nhe
Mã:
'        mang ket qua
        result = .Range(.Range("A4"), .Cells(curr_row, curr_col)).Value
    thành .Formula
        result = .Range(.Range("A4"), .Cells(curr_row, curr_col)).Formula
 
Upvote 0
Thử sửa đoạn này xem được không nhe
Mã:
'        mang ket qua
        result = .Range(.Range("A4"), .Cells(curr_row, curr_col)).Value
    thành .Formula
        result = .Range(.Range("A4"), .Cells(curr_row, curr_col)).Formula
Dạ được rồi anh ạ.
Em cám ơn mọi người nhiều, các anh nhiệt tình quá thể luôn :D
 
Upvote 0
Em gửi file, em ghi chú ở trong file đính kèm ạ.
Tôi đọc lướt
Anh sửa giúp em giữ nguyên giá trị hay công thức ở các cột không trùng tiêu đề được không ạ.
nên nghĩ là giữ giá trị hay công thức đều được.

Tóm lại là bạn muốn giữ nguyên các cột vàng dù là công thức hay giá trị.

Mà giải cứu đến nhanh quá. Chỉ một đường gươm. :D
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đọc lướt

nên nghĩ là giữ giá trị hay công thức đều được.

Tóm lại là bạn muốn giữ nguyên các cột vàng dù là công thức hay giá trị.

Mà giải cứu đến nhanh quá. Chỉ một đường gươm. :D
Thật lòng nhờ bác @batman1 mà em mới biết và làm quen với vba tuy không tự viết được sub nhưng chỉnh sửa cắt ghép cái có sẵn thì vận dụng được chút chút.
Cám ơn bác và các anh chị
 
Upvote 0
Thật lòng nhờ bác @batman1 mà em mới biết và làm quen với vba tuy không tự viết được sub nhưng chỉnh sửa cắt ghép cái có sẵn thì vận dụng được chút chút.
Cám ơn bác và các anh chị
Hi anh,
Em có phát sinh này mà em mò mãi không ra.
Nếu ở file DATA, cột điều kiện của em nó không nằm ngoài cùng bên trái mà giờ nó ở giữa vùng dữ liệu thì em sửa code như nào ạ ?
Ví dụ : Trước đây ở file DATA, cột MA nằm ở cột B, nhưng giờ chuyển sang cột D ạ.
Ý là em muốn tìm dữ liệu ở bên trái hay bên phải cột điều kiện, giống như index + match ý anh.
Em cám ơn.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom