Các câu hỏi về mảng trong VBA (Array)

Liên hệ QC

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,599
Được thích
2,908
Xin các anh chị giúp đỡ Code Gán các giá trị của một Range là các phần tử của Mãng
Ví dụ: Tôi có các giá trị của Range("A1:A10"). Tôi muốn viết code để gán giá trị của các cells từ A1:A10 là các phần tử của Mãng Arr chẳn hạn.
Xin cảm ơn các anh chị
 
Nhờ các Thầy đoạn code sau, xem có vấn đề gì về giải thuật không, mà em kiểm tra hoài không thấy, xem như các điều kiện trong code đều thoả mãn.
[gpecode=vb]
Sub Button2_Click()
Dim iR As Long, jR As Long, kR As Long, sArr(), CpArr(), rArr()
sArr = Sheet2.Range("A2:Q" & Sheet2.[C1000000].End(3).Row).Value
CpArr = Sheet3.Range("J10:J" & Sheet3.[J1000000].End(3).Row).Value
ReDim rArr(LBound(CpArr, 1) To UBound(CpArr, 1), 1 To 7)
Sheet1.[A4].CurrentRegion.ClearContents
For iR = 1 To UBound(sArr, 1)
If Len(sArr(iR, 1)) Then
If Left(sArr(iR, 1), 1) = "C" And Mid(sArr(iR, 1), 4, 1) = "K" Then
For jR = 1 To UBound(CpArr, 1)
If sArr(iR, 2) = CpArr(jR, 1) Then
kR = kR + 1
rArr(kR, 1) = kR
rArr(kR, 2) = sArr(iR, 1)
rArr(kR, 3) = sArr(iR, 2)
rArr(kR, 4) = sArr(iR, 3)
rArr(kR, 5) = sArr(iR, 16)
rArr(kR, 6) = sArr(iR, 17)
rArr(kR, 7) = sArr(iR, 4)
End If
Next jR
End If
End If
Next iR
If kR Then
Sheet1.[A5].Resize(kR, 7) = rArr
End If
End Sub
[/gpecode]
---
Sheet2 là Data (dữ liệu hơn 200k dòng, 17 cột) với cột 1 là mã hàng, cột 2 là số hoá đơn.
Sheet3 là số hoá đơn đã thanh toán.
Sheet1 là báo cáo hoá đơn đã thanh toán: Lọc 6 cột từ Data và 1 cột Stt.
---
Chân thành cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các Thầy đoạn code sau, xem có vấn đề gì về giải thuật không, mà em kiểm tra hoài không thấy, xem như các điều kiện trong code đều thoả mãn.
[gpecode=vb]
Sub Button2_Click()
Dim iR As Long, jR As Long, kR As Long, sArr(), CpArr(), rArr()
sArr = Sheet2.Range("A2:Q" & Sheet2.[C1000000].End(3).Row).Value
CpArr = Sheet3.Range("J10:J" & Sheet3.[J1000000].End(3).Row).Value
ReDim rArr(LBound(CpArr, 1) To UBound(CpArr, 1), 1 To 7)
Sheet1.[A4].CurrentRegion.ClearContents
For iR = 1 To UBound(sArr, 1)
If Len(sArr(iR, 1)) Then
If Left(sArr(iR, 1), 1) = "C" And Mid(sArr(iR, 1), 4, 1) = "K" Then
For jR = 1 To UBound(CpArr, 1)
If sArr(iR, 2) = CpArr(jR, 1) Then
kR = kR + 1
rArr(kR, 1) = kR
rArr(kR, 2) = sArr(iR, 1)
rArr(kR, 3) = sArr(iR, 2)
rArr(kR, 4) = sArr(iR, 3)
rArr(kR, 5) = sArr(iR, 16)
rArr(kR, 6) = sArr(iR, 17)
rArr(kR, 7) = sArr(iR, 4)
End If
Next jR
End If
End If
Next iR
If kR Then
Sheet1.[A5].Resize(kR, 7) = rArr
End If
End Sub
[/gpecode]
---
Sheet2 là Data (dữ liệu hơn 200k dòng, 17 cột) với cột 1 là mã hàng, cột 2 là số hoá đơn.
Sheet3 là số hoá đơn đã thanh toán.
Sheet1 là báo cáo hoá đơn đã thanh toán: Lọc 6 cột từ Data và 1 cột Stt.
---
Chân thành cảm ơn!
Sau không dùng Dic ta? Duyệt kiểu này e rằng hơi chậm.
 
Upvote 0
Nhờ các Thầy đoạn code sau, xem có vấn đề gì về giải thuật không, mà em kiểm tra hoài không thấy, xem như các điều kiện trong code đều thoả mãn.

Chân thành cảm ơn!

Lấn cấn ở chỗ này đây:

Mã:
CpArr = Sheet3.Range("J10:J" & Sheet3.[J1000000].End(3).Row).Value
ReDim rArr(LBound(CpArr, 1) To [COLOR=#ff0000][B]UBound(CpArr, 1)[/B][/COLOR], 1 To 7)

Ta giả sử

2 vòng lặp For đều thõa mãn với các điều kiện thì mảng rArr sẽ bị tràn dòng, bởi kR là kết quả của 1 phép nhân.

Một thủ tục cơ bản dưới đây sẽ cho thấy k không phải là 10 mà là 100

Mã:
Sub test()
    Dim i, j, k
    For i = 1 To 10
        For j = 1 To 10
            k = k + 1
        Next
    Next
    MsgBox k
End Sub

Vì thế nếu thủ tục của Thảo thỏa hết mọi điều kiện thì thủ tục sẽ báo lỗi tràn dòng.
 
Lần chỉnh sửa cuối:
Upvote 0
Lấn cấn ở chỗ này đây:

Mã:
CpArr = Sheet3.Range("J10:J" & Sheet3.[J1000000].End(3).Row).Value
ReDim rArr(LBound(CpArr, 1) To [COLOR=#ff0000][B]UBound(CpArr, 1)[/B][/COLOR], 1 To 7)
Ta giả sử
2 vòng lặp For đều thõa mãn với các điều kiện thì mảng rArr sẽ bị tràn dòng, bởi kR là kết quả của 1 phép nhân.
Một thủ tục cơ bản dưới đây sẽ cho thấy k không phải là 10 mà là 100
Mã:
Sub test()
    Dim i, j, k
    For i = 1 To 10
        For j = 1 To 10
            k = k + 1
        Next
    Next
    MsgBox k
End Sub
Vì thế nếu thủ tục của Thảo thỏa hết mọi điều kiện thì thủ tục sẽ báo lỗi tràn dòng.
Em kiểm tra thì kR = 0.
Vòng For jR chỉ lấy được 1 giá trị thỏa mãn, không phải thỏa hết nên làm sao nó thành cấp số nhân được?
 

File đính kèm

  • Chi tiết thanh toán.rar
    789.1 KB · Đọc: 29
Upvote 0
Nhờ các Thầy đoạn code sau, xem có vấn đề gì về giải thuật không, mà em kiểm tra hoài không thấy, xem như các điều kiện trong code đều thoả mãn.
[gpecode=vb]
Sub Button2_Click()
Dim iR As Long, jR As Long, kR As Long, sArr(), CpArr(), rArr()
sArr = Sheet2.Range("A2:Q" & Sheet2.[C1000000].End(3).Row).Value
CpArr = Sheet3.Range("J10:J" & Sheet3.[J1000000].End(3).Row).Value
ReDim rArr(LBound(CpArr, 1) To UBound(CpArr, 1), 1 To 7)
Sheet1.[A4].CurrentRegion.ClearContents
For iR = 1 To UBound(sArr, 1)
If Len(sArr(iR, 1)) Then
If Left(sArr(iR, 1), 1) = "C" And Mid(sArr(iR, 1), 4, 1) = "K" Then
For jR = 1 To UBound(CpArr, 1)
If sArr(iR, 2) = CpArr(jR, 1) Then
kR = kR + 1
rArr(kR, 1) = kR
rArr(kR, 2) = sArr(iR, 1)
rArr(kR, 3) = sArr(iR, 2)
rArr(kR, 4) = sArr(iR, 3)
rArr(kR, 5) = sArr(iR, 16)
rArr(kR, 6) = sArr(iR, 17)
rArr(kR, 7) = sArr(iR, 4)
End If
Next jR
End If
End If
Next iR
If kR Then
Sheet1.[A5].Resize(kR, 7) = rArr
End If
End Sub
[/gpecode]
---
Sheet2 là Data (dữ liệu hơn 200k dòng, 17 cột) với cột 1 là mã hàng, cột 2 là số hoá đơn.
Sheet3 là số hoá đơn đã thanh toán.
Sheet1 là báo cáo hoá đơn đã thanh toán: Lọc 6 cột từ Data và 1 cột Stt.
---
Chân thành cảm ơn!

Thế "mà em kiểm tra CÁI GÌ hoài không thấy"?
Code có lỗi? Code không có lỗi error nhưng kết quả nhận được không đúng ý? Bạn hỏi kiểu đó thì khó cho người giúp rồi.

Bạn không nói mục đích code làm gì, có lỗi hay kết quả không đúng nên tôi chỉ đoán. Bạn không nhận được bất cứ kết quả nào? Vì như bạn nói ở bài #525 thì kR = 0.

Bạn hãy sửa

Mã:
If sArr(iR, 2) = CpArr(jR, 1) Then

thành

Mã:
If [COLOR=#ff0000]CLng([/COLOR]sArr(iR, 2)[COLOR=#ff0000])[/COLOR] = CpArr(jR, 1) Then
 
Upvote 0
Nhờ các Thầy đoạn code sau, xem có vấn đề gì về giải thuật không, mà em kiểm tra hoài không thấy, xem như các điều kiện trong code đều thoả mãn.
[gpecode=vb]
Sub Button2_Click()
Dim iR As Long, jR As Long, kR As Long, sArr(), CpArr(), rArr()
sArr = Sheet2.Range("A2:Q" & Sheet2.[C1000000].End(3).Row).Value
CpArr = Sheet3.Range("J10:J" & Sheet3.[J1000000].End(3).Row).Value
ReDim rArr(LBound(CpArr, 1) To UBound(CpArr, 1), 1 To 7)
Sheet1.[A4].CurrentRegion.ClearContents
For iR = 1 To UBound(sArr, 1)
If Len(sArr(iR, 1)) Then
If Left(sArr(iR, 1), 1) = "C" And Mid(sArr(iR, 1), 4, 1) = "K" Then
For jR = 1 To UBound(CpArr, 1)
If sArr(iR, 2) = CpArr(jR, 1) Then
kR = kR + 1
rArr(kR, 1) = kR
rArr(kR, 2) = sArr(iR, 1)
rArr(kR, 3) = sArr(iR, 2)
rArr(kR, 4) = sArr(iR, 3)
rArr(kR, 5) = sArr(iR, 16)
rArr(kR, 6) = sArr(iR, 17)
rArr(kR, 7) = sArr(iR, 4)
End If
Next jR
End If
End If
Next iR
If kR Then
Sheet1.[A5].Resize(kR, 7) = rArr
End If
End Sub
[/gpecode]
---
Sheet2 là Data (dữ liệu hơn 200k dòng, 17 cột) với cột 1 là mã hàng, cột 2 là số hoá đơn.
Sheet3 là số hoá đơn đã thanh toán.
Sheet1 là báo cáo hoá đơn đã thanh toán: Lọc 6 cột từ Data và 1 cột Stt.
---
Chân thành cảm ơn!
Một bên là Chuỗi, một bên là số thì làm sao mà so sánh được.
Bạn sửa dòng
PHP:
If sArr(iR, 2) = CpArr(jR, 1) Then
thành
PHP:
If CLng(sArr(iR, 2)) = CLng(CpArr(jR, 1)) Then
là được
 
Upvote 0
Thế "mà em kiểm tra CÁI GÌ hoài không thấy"?
Code có lỗi? Code không có lỗi error nhưng kết quả nhận được không đúng ý? Bạn hỏi kiểu đó thì khó cho người giúp rồi.
Bạn không nói mục đích code làm gì, có lỗi hay kết quả không đúng nên tôi chỉ đoán. Bạn không nhận được bất cứ kết quả nào? Vì như bạn nói ở bài #525 thì kR = 0.
Bạn hãy sửa
Mã:
If sArr(iR, 2) = CpArr(jR, 1) Then
thành
Mã:
If [COLOR=#ff0000]CLng([/COLOR]sArr(iR, 2)[COLOR=#ff0000])[/COLOR] = CpArr(jR, 1) Then
Dạ, em có hỏi về giải thuật, xem có vấn đề gì không, đúng là câu hỏi còn thiếu nhiều vế quá, mong Thầy thông cảm!
Cho em hỏi tại sao phải chuyển phần tử mảng sArr qua biến Long, vì em đã test thử, gán sArr(61706,2) xuống sheet thì trả ra kết quả số?
Cảm ơn Thầy và huuthang_bd!
 
Upvote 0
Dạ, em có hỏi về giải thuật, xem có vấn đề gì không, đúng là câu hỏi còn thiếu nhiều vế quá, mong Thầy thông cảm!
Cho em hỏi tại sao phải chuyển phần tử mảng sArr qua biến Long, vì em đã test thử, gán sArr(61706,2) xuống sheet thì trả ra kết quả số?
Cảm ơn Thầy và huuthang_bd!
Nếu gán dữ liệu là một chuỗi số vào một ô thì kết quả còn tùy thuộc vào kiểu định dạng của ô đó.
Bạn thử lệnh này với ActiveCell được định dạng lần lượt là General, Text và Number xem.
PHP:
ActiveCell.Value = "0000001"
 
Upvote 0
Dạ, em có hỏi về giải thuật, xem có vấn đề gì không, đúng là câu hỏi còn thiếu nhiều vế quá, mong Thầy thông cảm!
Cho em hỏi tại sao phải chuyển phần tử mảng sArr qua biến Long, vì em đã test thử, gán sArr(61706,2) xuống sheet thì trả ra kết quả số?
Cảm ơn Thầy và huuthang_bd!

Dĩ nhiên, nhưng bạn có 11160 chứ không phải là 0011160. Tôi nghĩ là Excel "dọc đường" đi xuống sheet đã convert 0011160 thành số.

Vì lý do nào đó mà khi so sánh "sArr(iR, 2) = CpArr(jR, 1)" thì Excel không convert sArr(iR, 2) thành số. Nhưng nếu bạn có "CLng(sArr(iR, 2)) = CpArr(jR, 1)" thì vế trái đã bị ép thành số.

Cũng có thể
Mã:
Dim tmp As Long
...
                If iR = 61706 Then
                    MsgBox "he"
                End If
                [COLOR=#ff0000]tmp = sArr(iR, 2)[/COLOR]
                For jR = 1 To UBound(CpArr, 1)
                    If tmp = CpArr(jR, 1) Then
                        kR = kR + 1
                        rArr(kR, 1) = kR
                        rArr(kR, 2) = sArr(iR, 1)
                        rArr(kR, 3) = sArr(iR, 2)
                    End If
                Next jR

Vì tmp là Long nên chỗ đỏ đỏ đã có việc convert "sArr(iR, 2)" thành số để "nhồi" vào tmp.

Tốt nhất là dùng tmp = sArr(iR, 2). Vì chả lý gì trong vòng lặp lặp vd. 1000 lần thì convert 1000 lần sArr(iR, 2) thành số như code "CLng(sArr(iR, 2)) = CpArr(jR, 1)". Dùng tmp = sArr(iR, 2) ta chỉ convert 1 lần duy nhất.
 
Upvote 0
Tốt nhất là dùng tmp = sArr(iR, 2). Vì chả lý gì trong vòng lặp lặp vd. 1000 lần thì convert 1000 lần sArr(iR, 2) thành số như code "CLng(sArr(iR, 2)) = CpArr(jR, 1)". Dùng tmp = sArr(iR, 2) ta chỉ convert 1 lần duy nhất.
Vì em mới vọc vào mảng nên có nhiều điều chưa hiểu cũng như về cách diễn đạt. Em hay kiểm tra thử kết quả trả về rồi gán lên sheet để biết tìm lỗi và cách giải quyết. Vì vậy mà "kiểm tra hoài không thấy" nguyên nhân không đạt kết quả.
Cảm ơn Thầy và huuthang_bd đã hướng dẫn!
 
Upvote 0
Em kiểm tra thì kR = 0.
Vòng For jR chỉ lấy được 1 giá trị thỏa mãn, không phải thỏa hết nên làm sao nó thành cấp số nhân được?
Chỉ vậy thôi sao? Nếu thỏa hết điều kiện thì tính sao? Thay vì CSDL gốc có 10 dòng, và CSDL so sánh có 20 dòng, nếu lặp đi lặp lại phải chăng là có gì đó rất thừa không, còn nếu cứ để luôn vậy và đúng hết thì mảng kết quả chỉ được ReDim có 10 dòng, trong khi đó kR lại hơn số đó thì tính sao?

Với lại nói thêm là:

Thay vì thế này:

Mã:
        If Len(sArr(iR, 1)) Then
            If Left(sArr(iR, 1), 1) = "C" And Mid(sArr(iR, 1), 4, 1) = "K" Then
.
.
.
            End If
        End If

Thì chỉ cần như thế này là đủ:

Mã:
[COLOR=#0000ff]If [/COLOR][COLOR=#ff0000]CStr[/COLOR][COLOR=#0000ff](ArrSh2(R2, 1)) [/COLOR][COLOR=#ff0000]Like [/COLOR][COLOR=#008080]"C??K*"[/COLOR][COLOR=#0000ff] Then
[/COLOR].
.
.
[COLOR=#0000ff]End If[/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Đúng. Chỉ khi thỏa mãn điều kiện If thì kR mới tăng 1, nên không thể nào là nhân.

Chắc ý Nghĩa là nói về trường hợp khi dữ liêu với tất cả các dòng đều có dạng "C??K" ở cột 1 và đều là xyz ở cột 2, đồng thời với mọi dòng của CpArr đều có CpArr(jR, 1) = xyz = sArr(iR, 2)

Lúc đó có kR = UBound(sArr, 1) * UBound(CpArr, 1)

Nhưng dữ liệu như thế có lẽ không có, nó quái đản quá.

Câu hỏi leonguyenz. Do bạn không mô tả bạn định làm gì, yêu cầu thế nào nên tôi hỏi.

Vd. ta có 5 dòng và chỉ 5 dòng trong sheet2 y như nhau, tức cột 1 là "C??K" và cột 2 là vd. 0011160. Giả dụ trong sheet3 có 2 dòng là 11160. Như thế kết quả của bạn sẽ là 10 dòng y như nhau chỉ trừ cột đầu là kR = 1, 2, ..., 10

Bạn cần 10 dòng y như nhau để làm gì?
 
Upvote 0
Chắc ý Nghĩa là nói về trường hợp khi dữ liêu với tất cả các dòng đều có dạng "C??K" ở cột 1 và đều là xyz ở cột 2, đồng thời với mọi dòng của CpArr đều có CpArr(jR, 1) = xyz = sArr(iR, 2)

Lúc đó có kR = UBound(sArr, 1) * UBound(CpArr, 1)

Nhưng dữ liệu như thế có lẽ không có, nó quái đản quá.

Câu hỏi leonguyenz. Do bạn không mô tả bạn định làm gì, yêu cầu thế nào nên tôi hỏi.

Vd. ta có 5 dòng và chỉ 5 dòng trong sheet2 y như nhau, tức cột 1 là "C??K" và cột 2 là vd. 0011160. Giả dụ trong sheet3 có 2 dòng là 11160. Như thế kết quả của bạn sẽ là 10 dòng y như nhau chỉ trừ cột đầu là kR = 1, 2, ..., 10

Bạn cần 10 dòng y như nhau để làm gì?
Theo giải thích của leo mà tôi hiểu được, thì
- Sheet Data liệt kê tất cả các hóa đơn đã bán hàng, với sự kết hợp C??K và số hóa đơn thì gần như số hóa đơn là duy nhất
- Sheet3 liệt kê hóa đơn đã thanh toán thì cũng duy nhất (1 hóa đơn đã thanh toán không liệt kê 2 lần)
Tất nhiên cũng có thể có lỗi dữ liệu và có thể trùng, nhưng đa phần là không, nếu có cũng không đến nỗi nhân lên.
Ngoài ra, code dùng đễ test ra kết quả 10 x 10 = 100 không hề có cái điều kiện If iếc nảo, nên không phù hợp để test với dữ liệu và code gốc.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo giải thích của leo mà tôi hiểu được, thì
- Sheet Data liệt kê tất cả các hóa đơn đã bán hàng, với sự kết hợp C??K và số hóa đơn thì gần như số hóa đơn là duy nhất
- Sheet3 liệt kê hóa đơn đã thanh toán thì cũng duy nhất (1 hóa đơn đã thanh toán không liệt kê 2 lần)
Tất nhiên cũng có thể có lỗi dữ liệu và có thể trùng, nhưng đa phần là không, nếu có cũng không đến nỗi nhân lên.
Ngoài ra, code dùng đễ test ra kết quả 10 x 10 = 100 không hề có cái điều kiện If iếc nảo, nên không phù hợp để test với dữ liệu và code gốc.

Tôi chỉ đoán ý của Nghĩa thôi chứ rõ ràng không có dữ liệu nào quái đản đến mức 200000 dòng như nhau và bên kia cũng 200000 dòng như nhau để dẫn tới kR quá lớn (hàng chục tỷ). Còn nếu thậm chí 100.000 dòng như nhau và 10.000 dòng như nhau thì cũng chỉ là kR = 1000.000.000 (1 tỷ) chưa tràn được bộ nhớ.

À mà sheet trong Excel mới nhất có thể có bao nhiêu dòng nhỉ?
 
Upvote 0
Tôi chỉ đoán ý của Nghĩa thôi chứ rõ ràng không có dữ liệu nào quái đản đến mức 200000 dòng như nhau và bên kia cũng 200000 dòng như nhau để dẫn tới kR quá lớn (hàng chục tỷ). Còn nếu thậm chí 100.000 dòng như nhau và 10.000 dòng như nhau thì cũng chỉ là kR = 1000.000.000 (1 tỷ) chưa tràn được bộ nhớ.

À mà sheet trong Excel mới nhất có thể có bao nhiêu dòng nhỉ?
ý của Nghĩa không phải tràn bộ nhớ mà là "tràn dòng". Bên trên Redim mảng kết quả vừa bằng số dòng của các hóa đơn đã thanh toán, nên chỉ cần trùng 1 lần đã có thể "tràn dòng" (subscript out of range)
Chỉ có điều là test không đúng trường hợp: code gốc có xét điều kiện, code test thì không, sinh ra bài toán nhân.
 
Upvote 0
ý của Nghĩa không phải tràn bộ nhớ mà là "tràn dòng". Bên trên Redim mảng kết quả vừa bằng số dòng của các hóa đơn đã thanh toán, nên chỉ cần trùng 1 lần đã có thể "tràn dòng" (subscript out of range)
Chỉ có điều là test không đúng trường hợp: code gốc có xét điều kiện, code test thì không, sinh ra bài toán nhân.

Tôi chỉ đọc lướt qua 1 lần nên nhớ mang máng. Thì ra là tràn dòng. He he.
 
Upvote 0
Tôi chỉ đoán ý của Nghĩa thôi chứ rõ ràng không có dữ liệu nào quái đản đến mức 200000 dòng như nhau và bên kia cũng 200000 dòng như nhau để dẫn tới kR quá lớn (hàng chục tỷ). Còn nếu thậm chí 100.000 dòng như nhau và 10.000 dòng như nhau thì cũng chỉ là kR = 1000.000.000 (1 tỷ) chưa tràn được bộ nhớ.

À mà sheet trong Excel mới nhất có thể có bao nhiêu dòng nhỉ?

Em diễn giải trên sheet vấn đề này, dữ liệu như thế không thể là quái đản được!

Nếu gán số dòng là 30 của mảng 2 thì số dòng kR sẽ tăng lên 40, chỉ cần kR = 31 đã phát sinh lỗi tràn dòng.
 

File đính kèm

  • DienGiai.xls
    27 KB · Đọc: 32
Upvote 0
Em diễn giải trên sheet vấn đề này, dữ liệu như thế không thể là quái đản được!

Nếu gán số dòng là 30 của mảng 2 thì số dòng kR sẽ tăng lên 40, chỉ cần kR = 31 đã phát sinh lỗi tràn dòng.

Tôi lấy những con số 100.000, 200.000 chẳng qua là tôi nhầm là bạn viết về tràn bộ nhớ, tràn biến (kR as Long). Vì thế tôi mới nói là 200.000 dòng dữ liệu có 2 cột như nhau là quái đản.
 
Upvote 0
Web KT

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

Back
Top Bottom