Duyêt nhiều mảng khác nhau

Liên hệ QC

chucuoi92

Thành viên lười biếng
Tham gia
11/9/09
Bài viết
850
Được thích
488
Giới tính
Nam
Nghề nghiệp
Chăn trâu
Em 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
HTML:
GI_1 = Sheet3.Range(
 
Lần chỉnh sửa cuối:
Em 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
HTML:
GI_1 = Sheet3.Range("E18:J23")
..............................................
GI_15 = Sheet3.Range("E192:J207")
GI_16 = Sheet3.Range("E213:J228")
Em viêt như vầy:

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?
Đươ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
 
Upvote 0
Đươ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
Sư phụ cho ví dụ hướng dẫn
 
Lần chỉnh sửa cuối:
Upvote 0
Sư 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.
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("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
 
Upvote 0
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(
 
Lần chỉnh sửa cuối:
Upvote 0
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
 

File đính kèm

  • Book1.xls
    38.5 KB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
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
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.
 
Upvote 0
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.
Bạn Test chưa mà có ý kiến như vậy?
 
Upvote 0
Bạn Test chưa mà có ý kiến như vậy?
Em đã test rồi
Ý của chủ topic là
GI_1 = Sheet3.Range("E18:J23")
..............................................
GI_15 = Sheet3.Range("E192:J207")
GI_16 = Sheet3.Range("E213:J228")
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?
 
Upvote 0
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

Nếu vùng dữ liệu em cần lấy rất rời rạc thế này thì cách của anh có lẻ không được
[/PHP]
Option Base 1
Sub ArrayInArray
()
Dim Array1(), Array2(), Array3(), I, Store(), rngSource
rngSource
= Array("A1:B103", "C1:E150", "F1:H722")
Store = Array(Array1, Array2, Array3)
For
I = 1 To 3
Store
(I) = Range(rngSource(I)).Value
Next
End Sub
[/PHP]
 
Upvote 0
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?


Càng nói càng thấy tùy tiện, vậy bạn Test Code này xem sao:

Mã:
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

Chẳng cần i,j gì ráo kẻo lại nghi ngờ. Các mảng con ở trên đâu có kích thước bằng nhau? Vẫn cho kết quả đấy thôi.
 
Upvote 0
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(
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
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
Sư phụ cho em hỏi chút síu
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?
Code chạy bình thường mà có lỗi gì đâu
Nếu có With sheet3 thì phải là .Range(RngSoure(.....))
 
Upvote 0
Đã 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è:

Mã:
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ần chỉnh sửa cuối:
Upvote 0
Đã 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è:

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
 
Upvote 0
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

Thường thường "gọn" rất dễ bị tỷ lệ nghịch với "dễ hiểu, dễ chỉnh sửa". Nhìn code trên phải mất một lúc lâu mới nhận ra là ta đang làm việc trên cột B-J và các dòng là ...

Vả lại, tôi chỉ cốt ý diễn tả cho chủ thớt thấy cách dùng mảng trong mảng.
 
Upvote 0
Cám ơn Đại ca đã quan tâm.
 
Lần chỉnh sửa cuối:
Upvote 0
Giải thích câu lệnh ở bài #16

{ } có nghĩa là mảng
[ ] là cách viết tắt của lệnh 'Evaluate'. Lưu ý là vì 'Evaluate' cho nên nó chỉ dùng được cho hằng (literals) chứ không thể cho biến (variables) - các bạn hay dùng cách [a1] đều biết điều này

For Each vung in [ { ... } ]
có nghĩa là tạo một mảng với các phần tử như trên và đọc từng phần tử vào vung

=== Lý do chỉnh sửa ===
... tôi kỵ cách xưng hô xã hội đen ...
Không nói chuyện trực tiếp thì tôi có thể miễn cưỡng. Nhưng nếu xưng hô trực tiếp thì tôi bắt buộc phải tránh.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom