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ị
 
...
Tuy nhiên cảm thấy chỉ có mỗi việc như thế mà chế đến đọan code dài dòng văn tự như thế này thì lãng phí quá.
Các cụ có cái thủ thuật nào hay và ngắn gọn, hoặc cái hàm nào ngắn gọn có thể trả về kết quả tương tự xin chỉ bảo hộ cho em với ...

Mục đích lập trình của bạn là gì?
Từ "lãng phí" ở trên muốn nói về lãng phí loại tài nguyên (resource) nào? bộ nhớ trong khi chạy code, thời gian chiếm hữu CPU/ổ cứng, thời gian chạy code, công sức viết code, hay số bytes cần thiết để trữ code (tức là số dòng code)?

Bạn phải xác định mục đích "tránh lãng phí" của mình rồi mới nói chuyện chỉnh sửa code cho hiệu quả được.

Ví dụ với những array lớn thì dùng array càng nhiều càng tốn bộ nhớ.

Nếu chỉ tự nhận thấy code của mình luộm thuộm thì nên hỏi người ta xem luộm thuộm chỗ nào và có thể sửa được ra sao.

Code của bạn gồm có 3 phần:
1. đếm trong vùng dữ liệu xem có bao nhiêu dòng và lập mảng với độ lớn ấy
2. ghi nhưng dòng dữ liệu không trống vào mảng
3. ghi mảng vào vùng kết quả

Cái lãng phí của code này là:
- mỗi công việc trên lại phải dùng một vòng lặp, trong khi chỉ cần một vòng lặp là làm được hết rồi.
- mảng 2 chiều, nhưng cột thứ nhất chỉ là số thứ tự từ 1 đến n, thế thì có thể hiểu ngầm chứ chứa làm quái gì?

Lưu ý: những lời tôi nói trên dùng để chỉ dẫn cách cải tiến trình độ lập trình. Nếu chỉ muốn giải uyết vấn đề của đề bài một cách gọn đẹp thì code sủa ndu96081531 là có thể coi như tối ưu rồi.
 
Upvote 0
Mục đích lập trình của bạn là gì?
Từ "lãng phí" ở trên muốn nói về lãng phí loại tài nguyên (resource) nào? bộ nhớ trong khi chạy code, thời gian chiếm hữu CPU/ổ cứng, thời gian chạy code, công sức viết code, hay số bytes cần thiết để trữ code (tức là số dòng code)?

Bạn phải xác định mục đích "tránh lãng phí" của mình rồi mới nói chuyện chỉnh sửa code cho hiệu quả được.

Ví dụ với những array lớn thì dùng array càng nhiều càng tốn bộ nhớ.

Nếu chỉ tự nhận thấy code của mình luộm thuộm thì nên hỏi người ta xem luộm thuộm chỗ nào và có thể sửa được ra sao.

Code của bạn gồm có 3 phần:
1. đếm trong vùng dữ liệu xem có bao nhiêu dòng và lập mảng với độ lớn ấy
2. ghi nhưng dòng dữ liệu không trống vào mảng
3. ghi mảng vào vùng kết quả

Cái lãng phí của code này là:
- mỗi công việc trên lại phải dùng một vòng lặp, trong khi chỉ cần một vòng lặp là làm được hết rồi.
- mảng 2 chiều, nhưng cột thứ nhất chỉ là số thứ tự từ 1 đến n, thế thì có thể hiểu ngầm chứ chứa làm quái gì?

Lưu ý: những lời tôi nói trên dùng để chỉ dẫn cách cải tiến trình độ lập trình. Nếu chỉ muốn giải uyết vấn đề của đề bài một cách gọn đẹp thì code sủa ndu96081531 là có thể coi như tối ưu rồi.


Thực sự là em là dân làm việc văn phòng, chưa qua trường lớp nào về lập trình cả. Toàn tự mày mò mà đọc rồi ứng dụng vào trong công việc thôi. Vì khi làm như thế này, em vẫn thấy cái code nó có đến 2 cái vòng lặp nên mới thấy mình ngu ngu nên mới mạo muội hỏi các thầy xem có cách khác hay không mà còn học hỏi thêm.
Ứng dụng thực sự là mảng 1 chiều thôi, làm cái 2 chiều để cho cái ví dụ cho các thầy dễ hiểu mà trả lời chính xác nội dung em cần hỏi thôi.
 
Upvote 0
Bạn phải xác định mục đích "tránh lãng phí" của mình rồi mới nói chuyện chỉnh sửa code cho hiệu quả được.

Những người mới học, mục đích của họ là: LÀM SAO TIẾP CẬN ĐƯỢC GIẢI THUẬT
Không bàn chuyện code đúng hay sai, hay hay dở... chỉ riêng chuyện code dài dòng cũng đủ gây khó khăn cho họ rồi (mù mù mờ mờ chẳng biết đâu mà lần)
Chỉ thế thôi
 
Upvote 0
Mục đích lập trình của bạn là gì?
Từ "lãng phí" ở trên muốn nói về lãng phí loại tài nguyên (resource) nào? bộ nhớ trong khi chạy code, thời gian chiếm hữu CPU/ổ cứng, thời gian chạy code, công sức viết code, hay số bytes cần thiết để trữ code (tức là số dòng code)?

Bạn phải xác định mục đích "tránh lãng phí" của mình rồi mới nói chuyện chỉnh sửa code cho hiệu quả được.

Ví dụ với những array lớn thì dùng array càng nhiều càng tốn bộ nhớ.

Nếu chỉ tự nhận thấy code của mình luộm thuộm thì nên hỏi người ta xem luộm thuộm chỗ nào và có thể sửa được ra sao.

Code của bạn gồm có 3 phần:
1. đếm trong vùng dữ liệu xem có bao nhiêu dòng và lập mảng với độ lớn ấy
2. ghi nhưng dòng dữ liệu không trống vào mảng
3. ghi mảng vào vùng kết quả

Cái lãng phí của code này là:
- mỗi công việc trên lại phải dùng một vòng lặp, trong khi chỉ cần một vòng lặp là làm được hết rồi.
- mảng 2 chiều, nhưng cột thứ nhất chỉ là số thứ tự từ 1 đến n, thế thì có thể hiểu ngầm chứ chứa làm quái gì?

Lưu ý: những lời tôi nói trên dùng để chỉ dẫn cách cải tiến trình độ lập trình. Nếu chỉ muốn giải uyết vấn đề của đề bài một cách gọn đẹp thì code sủa ndu96081531 là có thể coi như tối ưu rồi.

Thầy bảo : - mỗi công việc trên lại phải dùng một vòng lặp, trong khi chỉ cần một vòng lặp là làm được hết rồi.
-> Nếu mà dùng theo cách của em như ban đầu, chỉ mỗi một vòng lặp thì làm thế nào thầy có thể khai báo được chính xác thành phần của mảng hả thầy ?
 
Upvote 0
Thực ra cách giải giản dị (giản dị chứ không phải nhanh) nhất chả cần phải dùng mảng. Cứ đọc đến đâu ghi đến đấy.

Nếu bắt buộc phải dùng mảng thì dùng kỹ thuật chặp thêm mảng, ví dụ đặt mỗi khúc chặp thêm là 100 phần tử:

- Đặt một constant CHUNK = 100
- Đặt một biến đếm số phần tử n và một biến đếm cỡ mảng nmx
- Khởi mảng với CHUNK phần tử
- Khởi n=1, nmx = 100
- cứ mỗi lần truớc khi tăng n (+1) thì xét xem n đã đạt tới nmx chưa. Nếu đã đạt thì Redim Preserve mảng thêm CHUNK phần tử nữa.

Cuối cùng, ta được một mảng có thể dài hơn số phần tử nhưng chẳng sao cả, vì ta có số phần tử thật là n rồi.
 
Upvote 0
Thầy bảo : - mỗi công việc trên lại phải dùng một vòng lặp, trong khi chỉ cần một vòng lặp là làm được hết rồi.
-> Nếu mà dùng theo cách của em như ban đầu, chỉ mỗi một vòng lặp thì làm thế nào thầy có thể khai báo được chính xác thành phần của mảng hả thầy ?
Nếu mảng rồi thì xài mảng luôn khỏi phải duyệt từng cell.
Thử cái "Cùi bắp" này xem kết quả có giống của bạn không.
PHP:
Public Sub CuiBap()
Dim sArr(), dArr(), I As Long, K As Long
sArr = Range([A1], [A65000].End(xlUp)).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 2)
For I = 1 To UBound(sArr, 1)
    If sArr(I, 1) <> "" And sArr(I, 1) <> "END" Then
        K = K + 1
        dArr(K, 1) = K
        dArr(K, 2) = sArr(I, 1)
    End If
Next
[D3].Resize(K, 2).Value = dArr
End Sub
 
Upvote 0
Cám ơn các thầy...đó, hỏi ra mình mới học được rất nhiều..Các thầy quả là pờ rồ...
 
Upvote 0
em có 1 câu hỏi như thế này:
ta có 1 file có 3 sheet :
sheet1 chưa mảng arr1
sheet2 chứa mảng arr2
sheet3 chứa mảng arr3
3 mảng trên đều cùng chiều ngang, nhưng chiều dài khác nhau

Bây giờ e muốn nối 3 mảng đó thành 1 mảng arr thôi ( mảng arr này là mảng tạm )Mục đích của e là chỉ dùng 1 vòng lập trên 1 mảng tổng arr này .
E có gửi file đính kèm, mong các a chị và các thầy hướng dẫn em ah !
 

File đính kèm

  • Hoi GPE.xls
    32.5 KB · Đọc: 22
Upvote 0
em có 1 câu hỏi như thế này:
ta có 1 file có 3 sheet :
sheet1 chưa mảng arr1
sheet2 chứa mảng arr2
sheet3 chứa mảng arr3
3 mảng trên đều cùng chiều ngang, nhưng chiều dài khác nhau

Bây giờ e muốn nối 3 mảng đó thành 1 mảng arr thôi ( mảng arr này là mảng tạm )Mục đích của e là chỉ dùng 1 vòng lập trên 1 mảng tổng arr này .
E có gửi file đính kèm, mong các a chị và các thầy hướng dẫn em ah !

- Nếu chỉ đáp ứng vừa đủ nhu cầu của bạn (nối 3 mảng thành 1) thì đây là bài toán dễ
- Nếu viết ở mức tổng quát (nối bao nhiêu mảng 2 chiều tùy ý) thì cũng hơi.. khó 1 chút
Tôi thử xem:
Mã:
Function Join2DArray(ParamArray arrays())
  Dim arr(), aSub, tmp
  Dim lRs As Long, lCs As Long, lR As Long, lC As Long
  Dim n As Long, m As Long, i As Long, bChk As Boolean
  On Error Resume Next

  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    n = UBound(aSub, 1) - LBound(aSub, 1) + 1
    lRs = lRs + n
    m = UBound(aSub, 2) - LBound(aSub, 2) + 1
    If lCs < m Then lCs = m
  Next
  
  ReDim arr(1 To lCs, 1 To lRs)
  n = 0: m = 0
  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    For lR = LBound(aSub, 1) To UBound(aSub, 1)
      bChk = False
      n = n + 1
      For lC = LBound(aSub, 2) To UBound(aSub, 2)
        tmp = aSub(lR, lC)
        Select Case VarType(tmp)
          Case 0 To 1: arr(lC, n) = vbNullString
          Case 2 To 7: arr(lC, n) = tmp
          Case 8
            If IsNumeric(tmp) Then
              arr(lC, n) = "'" & tmp
            Else
              arr(lC, n) = tmp
            End If
        End Select
        If Len(CStr(tmp)) Then bChk = True
      Next
      If bChk = False Then n = n - 1
    Next
  Next
  If n Then
    ReDim Preserve arr(1 To lCs, 1 To n)
    Join2DArray = Transpose2DArray(arr)
  End If
End Function
Mã:
Function Transpose2DArray(ByVal arr2D)
  Dim arr(), aTemp
  Dim lR As Long, lC As Long
  On Error Resume Next
  aTemp = arr2D
  ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1))
  For lR = LBound(aTemp, 1) To UBound(aTemp, 1)
    For lC = LBound(aTemp, 2) To UBound(aTemp, 2)
      arr(lC, lR) = aTemp(lR, lC)
    Next
  Next
  Transpose2DArray = arr
End Function
Giờ đến phần ứng dụng ta viết thế này:
Mã:
Sub Main()
  Dim [COLOR=#ff0000][B]aRes[/B][/COLOR]
  [COLOR=#ff0000][B]aRes[/B][/COLOR] = Join2DArray(Sheet1.Range("D4:O1000"), Sheet2.Range("D4:O1000"), Sheet3.Range("D4:O1000"))
End Sub
aRes chính mà mảng tạm mà bạn cần. Ví dụ có thể gán mảng tạm aRes xuống sheet như thế này:
Mã:
Sub Main()
  Dim aRes
  aRes = Join2DArray(Sheet1.Range("D4:O1000"), Sheet2.Range("D4:O1000"), Sheet3.Range("D4:O1000"))
  Sheet4.Range("D4").Resize(UBound(aRes, 1), UBound(aRes, 2)).Value = aRes
End Sub
Áp dụng thử xem còn chổ nào trục trặc không nha!
 

File đính kèm

  • Join2DArray.xls
    52.5 KB · Đọc: 48
Lần chỉnh sửa cuối:
Upvote 0
Em cám ơn thầy, code chạy ok . nhưng xin thầy vui lòng giải thích giùm e đoạn code này được không ah ! nhất là hàm vartype

PHP:
Select Case VarType(tmp)
          Case 0 To 1: arr(lC, n) = vbNullString
          Case 2 To 7: arr(lC, n) = tmp
          Case 8
            If IsNumeric(tmp) Then
              arr(lC, n) = "'" & tmp
            Else
              arr(lC, n) = tmp
            End If
 End Select
 
Lần chỉnh sửa cuối:
Upvote 0
Em cám ơn thầy, code chạy ok . nhưng xin thầy vui lòng giải thích giùm e đoạn code này được không ah ! nhất là hàm vartype

PHP:
Select Case VarType(tmp)
          Case 0 To 1: arr(lC, n) = vbNullString
          Case 2 To 7: arr(lC, n) = tmp
          Case 8
            If IsNumeric(tmp) Then
              arr(lC, n) = "'" & tmp
            Else
              arr(lC, n) = tmp
            End If
 End Select

VarType để kiểm tra dữ liệu của bạn thuộc dạng Text hay là Number

Syntax||

VarType(varname) ||

The required varname argument is a Variant containing any variable except a variable of a user-defined type.||

Return Values||

Constant|Value|Description

vbEmpty|0|Empty (uninitialized)

vbNull|1|Null (no valid data)

vbInteger|2|Integer

vbLong|3|Long integer

vbSingle|4|Single-precision floating-point number

vbDouble|5|Double-precision floating-point number

vbCurrency|6|Currency value

vbDate|7|Date value

vbString|8|String

vbObject|9|Object

vbError|10|Error value

vbBoolean|11|Boolean value

vbVariant|12|Variant (used only with arrays of variants)

vbDataObject|13|A data access object

vbDecimal|14|Decimal value

vbByte|17|Byte value

vbLongLong|20|LongLong integer (Valid on 64-bit platforms only.)

vbUserDefinedType|36|Variants that contain user-defined types

vbArray|8192|Array


Tôi phân các trường hợp trong Select Case để phòng trường hợp dữ liệu dạng Text nhưng chứa number, ví dụ là 0331... Trường hợp này nếu không có đoạn Select Case như trên thì chắc chắn kết quả nhận được sẽ là 331 (mất số 0 ở đầu)
------------
Ví dụ thêm trường hợp cột dữ liệu của bạn chứa số điện thoại chẳng hạn, sẽ luôn có số 0 ở đầu. Vậy phải bảo đảm kết quả xuất ra cũng y chang vậy (có số 0 ở đầu)
 
Lần chỉnh sửa cuối:
Upvote 0
Các thầy ơi cho em hỏi :
Trong VBA có cái hàm nào dùng để so sánh 2 mảng đồng cấp không hả các thầy ? Hay bắt buộc mình phải tự sướng mà chế code ?
Ví dụ :
Em có cái mảng EX1(1 to 3, 2) làm chuẩn.
Mảng EX2(1 To 3)
Lấy EX2 vác đi so sánh với từng trị trong mảng EX1, nếu trùng nhau hoàn toàn thì OK, không thì NG

Chằng hạn EX1(1 to 3,1 ) = {A,B,C}
EX1 (1 to 3,2) = {D,E,F}
EX2(1 to 3) = { D,E,F}
-> EX1(1 to 3, 1) trả về NG
EX1(1 to 3, 2) trả về OK

Cám ơn các thầy trước nhé...
 
Upvote 0
Các thầy ơi cho em hỏi :
Trong VBA có cái hàm nào dùng để so sánh 2 mảng đồng cấp không hả các thầy ? Hay bắt buộc mình phải tự sướng mà chế code ?
Ví dụ :
Em có cái mảng EX1(1 to 3, 2) làm chuẩn.
Mảng EX2(1 To 3)
Lấy EX2 vác đi so sánh với từng trị trong mảng EX1, nếu trùng nhau hoàn toàn thì OK, không thì NG

Chằng hạn EX1(1 to 3,1 ) = {A,B,C}
EX1 (1 to 3,2) = {D,E,F}
EX2(1 to 3) = { D,E,F}
-> EX1(1 to 3, 1) trả về NG
EX1(1 to 3, 2) trả về OK

Cám ơn các thầy trước nhé...
cái này có lẽ phải tự viết hàm thôi bạn ah !
 
Upvote 0
Các thầy chỉ cho em giải bài tóan này với, em so sánh mãi mà không được. ( file đính kèm)
1-Ta lấy giá trị mảng ở Mảng so sánh.
2-Lấy giá trị mảng đa chiều bắt đầu từ hàng 2, cột 1
3-So sánh nếu chỉ cần 1 trị của mảng so sánh khác với vùng so sánh thì ta điền cả mảng vào cột kế tiếp

Em viết như code như thế này mà không hiểu nó sai chỗ nào mà nó chả có ý kiến gì

Sub MangKiemta()
Dim i, j, k, t, r As Integer
Dim Mang()
Dim MangA(1 To 14)
i = 1
Do Until IsEmpty(Cells(2, i))
j = j + 1
i = i + 1
Loop
ReDim Mang(1 To 14, j)
For k = 1 To j
For i = 1 To 14
Mang(i, k) = Cells(i + 1, k)
Next
Next

For t = 1 To UBound(MangA)
MangA(t) = Cells(19 + t, 1)
Next

For r = 1 To 14
For k = 1 To j
If MangA(r) <> Mang(r, k) Then
Cells(r + 1, j) = MangA(r)
End If
Next
Next

End Sub

Nhờ các thầy chỉ bảo em với ! Em cám ơn%#^#$
 

File đính kèm

  • GPE-Q-Array.xls
    24.5 KB · Đọc: 17
Upvote 0
Các anh chị cho em hỏi, tìm trên google mãi mà không ra
Ý của em hỏi là làm sao giống như trong file đính kèm, hàm bdttct2ltcxdvn có 21 hàng và 2 cột, các giá trị của hàm này được gán cho ô B17 đến ô C37 mà chỉ sử dụng duy nhất lệnh =bdttct2ltcxdvn(B3,B4,B7,B8,B9,B5,B6,B10,B11,B12) cho tất cả các ô . Muốn làm như vậy thì phải làm sao, cách tạo 1 sub thì em cũng biết nhưng em muốn làm giống như trong file. Mong các anh chị giúp đỡ
 

File đính kèm

  • Nho giup do.xlsm
    33.1 KB · Đọc: 55
Upvote 0
Nhờ chỉnh dùm code xử lý mảng lấy từ mảng sẳn có
Mình có thắc mắc như thế này: mình lấy dử liệu từ ADO gán vào Array1 sau đó gán tiếp xuống Sheet Range, sau đó gán Array2 = Range để xử lý tạo ra Array3 gán xuống sheet kết quả thì đươc. Nhưng khi mình lấy trực tiếp từ Array1 để xử lý tạo ra Array3 thì không được. Xin mọi người chỉ giáo. Mình cám ơn rất nhiều. (Mình có ghi chú trong code.)
 

File đính kèm

  • Tao Array.rar
    48.7 KB · Đọc: 27
Lần chỉnh sửa cuối:
Upvote 0
trich lọc nhiều điều kiện

chuc moi nguoi vui vẻ
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi về copy có điều kiện một chút ah.
- thứ nhất em có một danh sách ở sheet2 gồm 5 cột (họ tên , mã số , tháng 1, tháng 2, tháng 3) nếu trong cột tháng 2, tháng 3 >0 thì lấy đươa vào sheet3 em dùng đoạn code nhứ sau
Sub copy()
On Error Resume Next
Dim vung(), Arr(), HC As Long
With Sheet2
HC = .Range("A65536").End(xlUp).Row
vung = .Range("A2:M" & HC).Value
ReDim Arr(1 To UBound(vung, 1), 1 To 13)
For i = 1 To UBound(vung, 1)
If vung(i, 4) > 0 Or vung(i, 5) > 0 Then
k = k + 1
For y = 1 To 13
Arr(k, y) = vung(i, y)
Next y
End If
Next i
Sheet3.Range("A2").Resize(k, 13).Value = Arr
End With
End Sub

đoạn code chạy được nhưng vấn đề là ở cột mã KH thì mã số KH lại biến thành số xin các Bro giải thich giúp e chỗ này với ah.
- Thứ hai là bây giờ em muốn chọn tiếp ở sheet1 cột tháng 2 nếu > 0 thì lấy sang sheet4, ở sheet2 nếu cột tháng 1 <0 thì lấy sang sheet4 thì đoạn code trên phải sửa lại như thế nào ah, em cũng mới học về mảng nên còn mơ hồ lắm ah @_@.
em gửi file VD đính kèm ở dưới
 

File đính kèm

  • copy co dk bang mang.xls
    39 KB · Đọc: 17
Upvote 0
Cho em hỏi về copy có điều kiện một chút ah.
- thứ nhất em có một danh sách ở sheet2 gồm 5 cột (họ tên , mã số , tháng 1, tháng 2, tháng 3) nếu trong cột tháng 2, tháng 3 >0 thì lấy đươa vào sheet3 em dùng đoạn code nhứ sau
Sub copy()
On Error Resume Next
Dim vung(), Arr(), HC As Long
With Sheet2
HC = .Range("A65536").End(xlUp).Row
vung = .Range("A2:M" & HC).Value
ReDim Arr(1 To UBound(vung, 1), 1 To 13)
For i = 1 To UBound(vung, 1)
If vung(i, 4) > 0 Or vung(i, 5) > 0 Then
k = k + 1
For y = 1 To 13
Arr(k, y) = vung(i, y)
Next y
End If
Next i
Sheet3.Range("A2").Resize(k, 13).Value = Arr
End With
End Sub

đoạn code chạy được nhưng vấn đề là ở cột mã KH thì mã số KH lại biến thành số xin các Bro giải thich giúp e chỗ này với ah.
- Thứ hai là bây giờ em muốn chọn tiếp ở sheet1 cột tháng 2 nếu > 0 thì lấy sang sheet4, ở sheet2 nếu cột tháng 1 <0 thì lấy sang sheet4 thì đoạn code trên phải sửa lại như thế nào ah, em cũng mới học về mảng nên còn mơ hồ lắm ah @_@.
em gửi file VD đính kèm ở dưới
1/ Bạn format cột B sheet3 thành Text rồi chạy code lại thử xem.
2/ Đã lấy dữ liệu được 1 sheet thì lặp lại như vậy cho 1 sheet nữa rồi gán vào sheet 4, cách nào tùy bạn.
 
Upvote 0
lấy dư lệu từng sheet thì em làm được rồi cách làm thế này, cũng đoạn code trên em lấy dữ liệu sheet2 cột tháng 1 xong đưa sang sheet4, sau đó sang sheet1 lấy dữ liệu và đưa sang sheet 4, em muốn là lấy dữ liệu sheet1, sheet 2 xong mói đưa dữ liệu sang sheet4 một lúc cơ
 
Upvote 0
Web KT

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

Back
Top Bottom