Cắt mảng 2 chiều thành nhiều mảng 1 chiều (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Tôi có thủ tục đưới đây, chạy được 1 vòng lặp đầu tiên, đến vòng 2 báo lỗi:

Mã:
Sub ChangeArr()
    Dim sArray, Arr, MyArr()
    Dim i As Long, j As Long
        sArray = Sheet1.Range("A2:G11").Value
        For i = 1 To UBound(sArray, 1)
            For j = 1 To 7
                [COLOR=#ff0000][B]ReDim Preserve MyArr(i To j)[/B][/COLOR]
                MyArr(j) = sArray(i, j)
            Next j
            Arr = MyArr
            Sheet1.Range("J" & i).Resize(, 7).Value = Arr
            [COLOR=#0000cd][B]Erase MyArr()[/B][/COLOR]
        Next i
End Sub

Lỗi phát sinh từ dòng màu đỏ, biết là do chỉ ReDim ở mảng 1 chiều thôi, qua vòng lặp tới mình đã Xóa mảng 1 chiều ở vòng lặp trước để lặp lại mảng 1 chiều mới, nhưng nó vẫn báo lỗi.

Tôi phải dùng thủ tục gì để giải quyết vấn đề đây?
 

File đính kèm

Tôi có thủ tục đưới đây, chạy được 1 vòng lặp đầu tiên, đến vòng 2 báo lỗi:


Lỗi phát sinh từ dòng màu đỏ, biết là do chỉ ReDim ở mảng 1 chiều thôi, qua vòng lặp tới mình đã Xóa mảng 1 chiều ở vòng lặp trước để lặp lại mảng 1 chiều mới, nhưng nó vẫn báo lỗi.

Tôi phải dùng thủ tục gì để giải quyết vấn đề đây?
Đúng ra là ReDim Preserve MyArr(1 To j) chứ sao lại là ReDim Preserve MyArr(i To j)
 
Upvote 0
Tôi có thủ tục đưới đây, chạy được 1 vòng lặp đầu tiên, đến vòng 2 báo lỗi:

Mã:
Sub ChangeArr()
    Dim sArray, Arr, MyArr()
    Dim i As Long, j As Long
        sArray = Sheet1.Range("A2:G11").Value
        For i = 1 To UBound(sArray, 1)
            For j = 1 To 7
                [COLOR=#ff0000][B]ReDim Preserve MyArr(i To j)[/B][/COLOR]
                MyArr(j) = sArray(i, j)
            Next j
            Arr = MyArr
            Sheet1.Range("J" & i).Resize(, 7).Value = Arr
            [COLOR=#0000cd][B]Erase MyArr()[/B][/COLOR]
        Next i
End Sub

Lỗi phát sinh từ dòng màu đỏ, biết là do chỉ ReDim ở mảng 1 chiều thôi, qua vòng lặp tới mình đã Xóa mảng 1 chiều ở vòng lặp trước để lặp lại mảng 1 chiều mới, nhưng nó vẫn báo lỗi.

Tôi phải dùng thủ tục gì để giải quyết vấn đề đây?
Mình thử test với Dim (1 To 5) thì nó chịu còn Dim (5 To 1) nó không chịu
Thủ tục của bạn sẽ xảy ra trường hợp i>j với ReDim Preserve MyArr(i To j). Liệu cái này chăng?
(nếu sửa ReDim Preserve MyArr(1 To 7) nó chịu ngay)
Nhưng mục đích của Bạn là gì mình đọc vẫn chưa hiểu lắm. Xin nói rõ được không?
 
Upvote 0
Mình thử test với Dim (1 To 5) thì nó chịu còn Dim (5 To 1) nó không chịu
Thủ tục của bạn sẽ xảy ra trường hợp i>j với ReDim Preserve MyArr(i To j). Liệu cái này chăng?
(nếu sửa ReDim Preserve MyArr(1 To 7) nó chịu ngay)
Nhưng mục đích của Bạn là gì mình đọc vẫn chưa hiểu lắm. Xin nói rõ được không?

Cám ơn Viehoai đã quan tâm, sửa lại như Thầy Ndu là OK rồi.

Mục đích là mình muốn mày mò nhiều hơn về mảng mà thôi.
 
Upvote 0
Oh Yeah! Chỉ sửa thành số 1 là OK! Đúng là mình quá ngáo ộp!

Cám ơn Thầy!

Thế nếu mảng có 100 cột thì cũng ReDim 100 lần? Mà đặt trong 2 FOR thì nếu có 100 cột và 1000 dòng thì ReDim là 100.000 lần chứ đâu có 100 lần?
Cho ReDim MyArr(1 To 7) hoặc tổng quát ReDim MyArr(1 To UBound(sArray, 2)) ra trước 2 FOR
Mà sao là
Arr = MyArr
Sheet1.Range("J" & i).Resize(, 7).Value = Arr
chứ không phải là
Sheet1.Range("J" & i).Resize(, 7).Value = MyArr
Nghịch thì cũng phải "tốt" luôn chứ nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Thế nếu mảng có 100 cột thì cũng ReDim 100 lần? Mà đặt trong 2 FOR thì nếu có 100 cột và 1000 dòng thì ReDim là 100.000 lần chứ đâu có 100 lần?
Cho ReDim MyArr(1 To 7) hoặc tổng quát ReDim MyArr(1 To UBound(sArray, 2)) ra trước 2 FOR
Mà sao là
Arr = MyArr
Sheet1.Range("J" & i).Resize(, 7).Value = Arr
chứ không phải là
Sheet1.Range("J" & i).Resize(, 7).Value = MyArr
Nghịch thì cũng phải "tốt" luôn chứ nhỉ?

Hi hi hi, vì "nghịch" mà không "tốt" nên mới hỏi chứ đồng chí! Không Thầy đố mày làm nên mà! Và Học Thầy không tày học bạn nữa chứ!
 
Upvote 0
Web KT

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

Back
Top Bottom