Vấn đề khi gán từ mảng xuống range ?

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị ^^
Hiện tại em đang ôn tập lại một chút về mảng thì em gặp một số vấn đề sau mong anh chị giúp đỡ em
Bài toán em đặt ra chỉ đơn giản là chuyển từ hàng thành cột nhưng làm theo 3 cách (Lưu ở trong Module 1)

Vấn đề:
Lúc chạy đến chỗ dòng màu đỏ thì nó hiện ra giá trị từ ô B2 đến ô R2 đều là b (Kết quả không mong muốn)
1655447891045.png
Sau đó em tiếp tục thử bằng cách dùng hàm transpose thì nó lại được :
1655449161462.png
So sánh về ý tưởng thì hai cách đều giống nhau nhưng mà cách dùng hàm Transpose như trên có gì đặc biệt mà nó lại ra kết quả mong muốn ?
Mong cách anh chị giúp em giải thích với ạ :>
 

File đính kèm

  • Array.xlsm
    18.6 KB · Đọc: 5
Không bao giờ học thuộc. Tất cả những cái này ở thời điểm bất kỳ đều có thể kiểm nghiệm được, vậy tại sao phải học thuộc?
Vậy anh cho em hỏi là mình có cách nào để kiểm tra nhanh , để biết được một mảng bất kì có bao nhiêu chiều không ạ ?
Kiểu giờ em toàn phải kiểm tra bằng cách vét cạn như sau:
Mã:
Sub Test()
    Dim Arr() As Variant
    Dim Brr() As Variant
    Arr() = Array(1, 2, 4, 5, 8, 9)
    Brr() = Application.Transpose(Arr())
    Debug.Print (Brr(1, 1)) ' Do không lỗi nên kết luận được là mảng hai chiều
    Debug.Print (Brr(1)) ' Do bị lỗi "Subcript out of range" nên kết luận được là mảng có số chiều lớn hơn 1
End Sub
 
Upvote 0
Vậy anh cho em hỏi là mình có cách nào để kiểm tra nhanh , để biết được một mảng bất kì có bao nhiêu chiều không ạ ?
Kiểu giờ em toàn phải kiểm tra bằng cách vét cạn như sau:
Mã:
Sub Test()
    Dim Arr() As Variant
    Dim Brr() As Variant
    Arr() = Array(1, 2, 4, 5, 8, 9)
    Brr() = Application.Transpose(Arr())
    Debug.Print (Brr(1, 1)) ' Do không lỗi nên kết luận được là mảng hai chiều
    Debug.Print (Brr(1)) ' Do bị lỗi "Subcript out of range" nên kết luận được là mảng có số chiều lớn hơn 1
End Sub
Nhiều cái có lẽ cũng không nên lạm dụng hỏi quá! Bạn có thể tự google vấn đề này mà
Google với từ khóa "Check dimension array vba" là có kết quả
https://stackoverflow.com/questions...sions-of-a-variant-variable-passed-to-it-in-v
Mã:
Function getDimension(var As Variant) As Long
    On Error GoTo Err
    Dim i As Long
    Dim tmp As Long
    i = 0
    Do While True
        i = i + 1
        tmp = UBound(var, i)
    Loop
Err:
    getDimension = i - 1
End Function
Tôi chưa kiểm nghiệm nhưng xem qua thì thấy nó hợp lý
 
Upvote 0
Ở đây có mấy bài về cái này rồi mà bạn không chịu tìm. Có lẽ bạn bắt đầu cho rằng mình được "ưu ái"?

Cách dễ nhất để tính số chiều của một mảng là dùng hàm LBound. Tham số thứ hai của hàm này là chiều thứ nth của mảng. Xem lại ngữ pháp của hàm này.
Thuật toán đơn giản:
Viết một hàm XetSoChieu. Hàm nhận một tham variant a (tên của mảng) và trả về số chiều của mảng.
Dùng On Error Goto để bẫy lỗi.
Dùng 1 vòng lặp để tính x = LBound(a, n)
Đến khi bị lỗi thì biết n là đi quá số chiều của mảng.
 
Upvote 0
Dạ vâng ạ ! Em cảm ơn các anh nhiều lắm. Cảm ơn mọi người vì đã bỏ thời gian ra để xem và sửa bài giúp em. Có lẽ anh vietmini nói đúng . Chắc là em đã quá ỉ lại rồi (em không muốn điều đó thường xuyên xảy ra và cũng không muốn bị các anh lôi ra nhắc vì những chuyện như vậy) nên em rất mong nếu các anh nhìn thấy chủ đề nào em thắc mắc đã có trên diễn đàn thì các anh chỉ cần cho em đường dẫn đến bài viết đó thôi việc còn lại là để em tự tìm hiểu và không cần giải thích gì thêm hoặc thông báo cho em là chủ đề này có khá nhiều. Để các anh có nhiều thời gian hỗ trợ những thành viên khác hơn ^^ . Còn mọi góp ý của mọi người em sẽ đều xem lại một cách cẩn trọng và chắc chắn sửa đổi ạ .Em cảm ơn ^^
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy anh cho em hỏi là mình có cách nào để kiểm tra nhanh , để biết được một mảng bất kì có bao nhiêu chiều không ạ ?
Kiểu giờ em toàn phải kiểm tra bằng cách vét cạn như sau:
Mã:
Sub Test()
    Dim Arr() As Variant
    Dim Brr() As Variant
    Arr() = Array(1, 2, 4, 5, 8, 9)
    Brr() = Application.Transpose(Arr())
    Debug.Print (Brr(1, 1)) ' Do không lỗi nên kết luận được là mảng hai chiều
    Debug.Print (Brr(1)) ' Do bị lỗi "Subcript out of range" nên kết luận được là mảng có số chiều lớn hơn 1
End Sub
Lôgíc là: "Ai cũng có tên. Nếu đọc ra tên đệm mà có lỗi thì người đó không có tên đệm, ngược lại thì người đó có tên đệm."

Mã:
Sub test()
Dim arr(1 To 3)
    On Error Resume Next
    Debug.Print UBound(arr, 2)
    If Err.Number Then
        MsgBox "mang 1 chieu"
    Else
        MsgBox "mang nhieu chieu"
    End If
    Err.Clear
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom