Đương nhiên là có cách chứ, nhưng muốn duyệt qua mảng bằng vòng lặp thì phải gán tất cả mảng vào 1 mảng nào đó trước rồi mới gọi ra sau, hoặc gán mảng vào Dictionary rồi gọi ra cũng đượcEm xin chào các Sư phụ, đại ca, đại tỉ (xin mạn phép xưng em)
Em có nhiều mảng cùng số cột vả khác dòng trên cùng một sheet
Em viêt như vầy:HTML:GI_1 = Sheet3.Range("E18:J23") .............................................. GI_15 = Sheet3.Range("E192:J207") GI_16 = Sheet3.Range("E213:J228")
như vậy VBA không hiểu được phần bôi màu đỏ.
Xin hỏi các anh chị có cách nào để vba hiểu được mình duyệt từng mảng như vậy không?
Sư phụ cho ví dụ hướng dẫnĐương nhiên là có cách chứ, nhưng muốn duyệt qua mảng bằng vòng lặp thì phải gán tất cả mảng vào 1 mảng nào đó trước rồi mới gọi ra sau, hoặc gán mảng vào Dictionary rồi gọi ra cũng được
Cái này gọi là mảng trong mảng. Mình cho ví dụ cách gán dữ liệu vào mảng bằng vòng lặp và duyệt qua mảng bằng vòng lặpSư phụ cho ví dụ hướng dẫn "cụ tỉ" một chút với!
Em cám ơn Sư phụ niều.. niều.
Option Base 1
Sub ArrayInArray()
Dim Array1(), Array2(), Array3(), I, Store(), rngSource
rngSource = Array("A1:B10", "C1:E100", "F1:I1000")
Store = Array(Array1, Array2, Array3)
For I = 1 To 3
Store(I) = Range(rngSource(I)).Value
MsgBox "Mang " & I & " có " & UBound(Store(I)) & " dòng " & UBound(Store(I), 2) & " côt"
Next
End Sub
Cái này gọi là mảng trong mảng. Mình cho ví dụ cách gán dữ liệu vào mảng bằng vòng lặp và duyệt qua mảng bằng vòng lặp
Còn cách khác là nạp mảng vào Dictionary, từ từ nghiên cứu nha. Chú ý dòng phía trên nha
PHP:Option Base 1 Sub ArrayInArray() Dim Array1(), Array2(), Array3(), I, Store(), rngSource rngSource = Array(
Sub Test()
Dim Mg(1 To 10) As Variant, i
For i = 1 To 10
Mg(i) = Sheet1.[A1:C1].Offset(i * 10 - 10).Resize(10)
Next i
For i = 1 To 10
Sheet2.Cells(1, i * 3 - 2).Resize(UBound(Mg(i), 1), UBound(Mg(i), 2)) = Mg(i)
Next i
End Sub
Nếu mảng cố định thì dùng cách anh không vấn đề gì nếu mảng không cố định thì không được, vì Cuoi92 cho biết là mảng không cố định dòng cột nên không thể dùng cách duyệt mảng với chiều dài cố định nếu được cũng phức tạp hơn cách qua trung gian.Tại sao lại phải qua trung gian nhỉ, mình ví dụ 1 cách làm trực tiếp xem sao nha.
Giả sử Ta có vùng dữ liệu từ A1:C100
Ta gán cho 10 mảng mỗi mảng 10 dòng, 10 mảng này lại nằm trong 1 mảng chung
Giờ ta chép 10 mảng con sang sheet2
Trên đây dùng việc gán mảng cho vùng chứ cũng có thể duyệt lần lượt từng dòng cột trong các mảng
Bạn Test chưa mà có ý kiến như vậy?Nếu mảng cố định thì dùng cách anh không vấn đề gì nếu mảng không cố định thì không được, vì Cuoi92 cho biết là mảng không cố định dòng cột nên không thể dùng cách duyệt mảng với chiều dài cố định nếu được cũng phức tạp hơn cách qua trung gian.
Em đã test rồiBạn Test chưa mà có ý kiến như vậy?
Có nghĩ là chiều dài và rộng mảng sẽ thay đổi? Hay anh chỉ lấy là ví dụ vùng mình sẽ thay đổi? Vì với dữ liệu của tác giả dùng vòng lập thay đổi vùng là rất khó vì không theo quy tắc?GI_1 = Sheet3.Range("E18:J23")
..............................................
GI_15 = Sheet3.Range("E192:J207")
GI_16 = Sheet3.Range("E213:J228")
Tại sao lại phải qua trung gian nhỉ, mình ví dụ 1 cách làm trực tiếp xem sao nha.
Giả sử Ta có vùng dữ liệu từ A1:C100
Ta gán cho 10 mảng mỗi mảng 10 dòng, 10 mảng này lại nằm trong 1 mảng chung
Giờ ta chép 10 mảng con sang sheet2
(Nói thì khó hiểu, bạn ngẫm Code gắng hiểu nha)
Mã:Sub Test() Dim Mg(1 To 10) As Variant, i For i = 1 To 10 Mg(i) = Sheet1.[A1:C1].Offset(i * 10 - 10).Resize(10) Next i For i = 1 To 10 Sheet2.Cells(1, i * 3 - 2).Resize(UBound(Mg(i), 1), UBound(Mg(i), 2)) = Mg(i) Next i End Sub
Trên đây dùng việc gán mảng cho vùng chứ cũng có thể duyệt lần lượt từng dòng cột trong các mảng
Em đã test rồi
Ý của chủ topic là
Có nghĩ là chiều dài và rộng mảng sẽ thay đổi? Hay anh chỉ lấy là ví dụ vùng mình sẽ thay đổi? Vì với dữ liệu của tác giả dùng vòng lập thay đổi vùng là rất khó vì không theo quy tắc?
Sub Test()
Dim Mg(1 To 3) As Variant
Mg(1) = Sheet1.Range("E18:J23")
Mg(2) = Sheet1.Range("E192:J207")
Mg(3) = Sheet1.Range("E213:J228")
Sheet2.[A1].Resize(UBound(Mg(1), 1), UBound(Mg(1), 2)) = Mg(1)
Sheet3.[A1].Resize(UBound(Mg(2), 1), UBound(Mg(2), 2)) = Mg(2)
Sheet4.[A1].Resize(UBound(Mg(3), 1), UBound(Mg(3), 2)) = Mg(3)
End Sub
Cái này gọi là mảng trong mảng. Mình cho ví dụ cách gán dữ liệu vào mảng bằng vòng lặp và duyệt qua mảng bằng vòng lặp
Còn cách khác là nạp mảng vào Dictionary, từ từ nghiên cứu nha. Chú ý dòng phía trên nha
PHP:Option Base 1 Sub ArrayInArray() Dim Array1(), Array2(), Array3(), I, Store(), rngSource rngSource = Array(
Code chạy bình thường mà có lỗi gì đâuSư phụ cho em hỏi chút síuPHP:Option Base 1 Sub ArrayInArray() Dim Array1(), Array2(), Array3(), Array4(), Array5(), Array6(), Array7(), Array8() Dim Array9(), Array10(), Array11(), Array12(), Array13(), Array14(), Array15(), Array16(), I, Store(), rngSource With Sheet3 rngSource = Array("B18:J23", "B29:J34", "B40:J45", "B51:J56", "B62:J67", "B73:J78", "B84:J89", "B95:J100", "B106:J111", "B117:J122", "B128:J133", "B139:J144", "B150:J165", "B171:J186", "B192:J207", "B213:J228") Store = Array(Array1, Array2, Array3, Array4, Array5, Array6, Array7, Array8, Array9, Array10, Array11, Array12, Array13, Array14, Array15, Array16) For I = 1 To 16 Store(I) = Range(rngSource(I)).Value MsgBox "Mang " & I & " có " & UBound(Store(I)) & " dòng " & UBound(Store(I), 2) & " côt" Next End With End Sub
Em thử code trong sheet thì không sao, nhưng khi đưa vào module thì báo lỗi ở phần màu đỏ khi duyệt đến array16
Có phải mảng trong mảng ở module chỉ nhận 15 mảng lẻ không?
Sub t()
Dim a() As Variant, vung, aCount
Redim a(1 to 100)
aCount = 0
For Each vung In [ { [COLOR=#DD0000][FONT=monospace][I]"B18:J23"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B29:J34"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B40:J45"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B51:J56"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B62:J67"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B73:J78"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B84:J89"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B95:J100"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B106:J111"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B117:J122"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B128:J133"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B139:J144"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B150:J165"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B171:J186"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B192:J207"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I], [/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"B213:J228"[/I][/FONT][/COLOR] } ]
aCount = aCount + 1
a(aCount) = .Range(vung).Value
Next b
ReDim Preserve a(1 To aCount)
[COLOR=#006400]' a(i) là mảng chứa dữ liệu
' mỗi a(i)(dong,cot) là trị của một ô trong vùng[/COLOR]
End Sub
Đã lỡ là mảng động thì để nó động cho trót. Cách làm mảng trong mảng như thế này nè:
Option Explicit
Option Base 1
Sub Test2()
Dim Mg(), PStar(), i
PStar = Array(18, 29, 40, 51, 62, 73, 84, 95, 106, 117, 128, 139, 150, 171, 192, 213)
For i = 1 To UBound(PStar)
ReDim Preserve Mg(i) As Variant
Mg(i) = Sheet1.Cells(PStar(i), 2).Resize(IIf(i < 13, 5, 15), 9)
Next i
End Sub
Với bài cụ thể này thì em sẽ viết thế này khá gọn:
Mã:Option Explicit Option Base 1 Sub Test2() Dim Mg(), PStar(), i PStar = Array(18, 29, 40, 51, 62, 73, 84, 95, 106, 117, 128, 139, 150, 171, 192, 213) For i = 1 To UBound(PStar) ReDim Preserve Mg(i) As Variant Mg(i) = Sheet1.Cells(PStar(i), 2).Resize(IIf(i < 13, 5, 15), 9) Next i End Sub