Mảng và Ubound mảng (1 người xem)

Liên hệ QC

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

bugatino

Thành viên chính thức
Tham gia
14/7/10
Bài viết
54
Được thích
3
Chào các bạn GPE.

Mình có code vba như sau:

Arr = Sheets("Config").Range(Sheets("Config").[B9], Sheets("Config").[B20].End(xlUp)).Value

If UBound(Arr, 1) > 0 Then
For i = 1 To UBound(Arr, 1)
Sheets("Data").[C1].Value = Arr(i, 1)
Next i
End If

Nếu Range B9:B20.End(xlUP) có >= 2 giá trị hoặc nhỏ hơn 1 giá trị thì không có vấn đề gì. Nhưng nếu Range này chỉ có 1 giá trị thì code bị lỗi Type mismatch và báo lỗi ở đoạn If Ubound(Arr, 1)

Mình muốn hỏi là sửa lại đoạn code trên như nào để nếu như Range B9:B20.End(xlUP) có >= 1 giá trị thì nó vòng lặp For chạy bình thường, còn Range B9:B20.End(xlUP) ko có giá trị nào thì sẽ ko chay vòng lặp For nữa.

Cám ơn các bạn GPE!
 
Chào các bạn GPE.

Mình có code vba như sau:

Arr = Sheets("Config").Range(Sheets("Config").[B9], Sheets("Config").[B20].End(xlUp)).Value

If UBound(Arr, 1) > 0 Then
For i = 1 To UBound(Arr, 1)
Sheets("Data").[C1].Value = Arr(i, 1)
Next i
End If

Nếu Range B9:B20.End(xlUP) có >= 2 giá trị hoặc nhỏ hơn 1 giá trị thì không có vấn đề gì. Nhưng nếu Range này chỉ có 1 giá trị thì code bị lỗi Type mismatch và báo lỗi ở đoạn If Ubound(Arr, 1)

Mình muốn hỏi là sửa lại đoạn code trên như nào để nếu như Range B9:B20.End(xlUP) có >= 1 giá trị thì nó vòng lặp For chạy bình thường, còn Range B9:B20.End(xlUP) ko có giá trị nào thì sẽ ko chay vòng lặp For nữa.

Cám ơn các bạn GPE!

Trường hợp của bạn sẽ xảy ra 2 trường hợp lỗi, đó là vùng đó không có giá trị nào trong đó và vùng đó chỉ chứa 1 giá trị ở ô đầu tiên.

Trước tiên bạn phải bẫy lỗi cho nó.

Nhưng nhìn cấu trúc trong For ... Next thì có lẽ bạn chỉ cần ở ô C1 giá trị cuối cùng của vùng, vậy có cần thiết không nếu sử dụng mảng rồi dùng vòng lặp hả bạn?
 
Upvote 0
Chào các bạn GPE.

Mình có code vba như sau:

Arr = Sheets("Config").Range(Sheets("Config").[B9], Sheets("Config").[B20].End(xlUp)).Value

If UBound(Arr, 1) > 0 Then
For i = 1 To UBound(Arr, 1)
Sheets("Data").[C1].Value = Arr(i, 1)
Next i
End If

Nếu Range B9:B20.End(xlUP) có >= 2 giá trị hoặc nhỏ hơn 1 giá trị thì không có vấn đề gì. Nhưng nếu Range này chỉ có 1 giá trị thì code bị lỗi Type mismatch và báo lỗi ở đoạn If Ubound(Arr, 1)

Mình muốn hỏi là sửa lại đoạn code trên như nào để nếu như Range B9:B20.End(xlUP) có >= 1 giá trị thì nó vòng lặp For chạy bình thường, còn Range B9:B20.End(xlUP) ko có giá trị nào thì sẽ ko chay vòng lặp For nữa.

Cám ơn các bạn GPE!

Sửa code thế này. Chủ yếu là phần bẫy lỗi vì cái vòng lặp của bạn hoàn toàn không có ý nghĩa gì cả.

PHP:
With Sheets("Config")
   If .[B20].End(3).Row < 10 Then Exit Sub
   arr = .Range(.[B9], .[B20].End(3)).Value
End With
   For i = 1 To UBound(arr, 1)
      Sheets("Data").[C1].Value = arr(i, 1)
   Next i
 
Upvote 0
Sửa code thế này. Chủ yếu là phần bẫy lỗi vì cái vòng lặp của bạn hoàn toàn không có ý nghĩa gì cả.

PHP:
With Sheets("Config")
   If .[B20].End(3).Row < 10 Then Exit Sub
   arr = .Range(.[B9], .[B20].End(3)).Value
End With
   For i = 1 To UBound(arr, 1)
      Sheets("Data").[C1].Value = arr(i, 1)
   Next i
Bắt đầu từ ô B9 thì phải bẩy < 9 chứ đại ca?
 
Upvote 0
Muốn bẫy cái lỗi này dễ thôi, nhưng tại vì thủ tục trong For ... Next kỳ kỳ nên mình bẫy lỗi theo kiểu kỳ kỳ cho bạn!

Mã:
    With Sheets("Config")
        If .[B20].End(3).Row < 9 Then Exit Sub
        arr = .Range(.[B9], .[B20].End(3)).Value
    End With
    If IsArray(arr) Then
        For i = 1 To UBound(arr, 1)
            Sheets("Data").[C1].Value = arr(i, 1)
        Next i
    Else
        Sheets("Data").[C1].Value = arr
    End If
 
Upvote 0
Vòng lặp For của mình không đơn giản như kia. Mục đích của mình là đưa giá trị từ range vào mảng và dùng vòng lặp for lấy ra giá trị để đưa vào sheet data. Trong sheet data sẽ có những công thức liên quan tới giá trị của cell C1. Sau đó mình thực hiện copy ra 1 sheet tạm khác để xử lý. Hiện tại nếu range có 2 giá trị trở lên thì code chạy đúng. Còn nếu như range chỉ có 1 giá trị thì lại bị lỗi. Các bạn giúp mình viết lại đoạn vba này với. Mục đích của mình là nếu range không có giá trị thì không sử dụng vòng lặp, nếu có 1 giá trị thì giá trị đó được gán cho C1 sheet data, nếu có 2 giá trị trở lên thì dùng vòng lặp như bình thường. Cám ơn các bạn.
 
Upvote 0
Vòng lặp For của mình không đơn giản như kia. Mục đích của mình là đưa giá trị từ range vào mảng và dùng vòng lặp for lấy ra giá trị để đưa vào sheet data. Trong sheet data sẽ có những công thức liên quan tới giá trị của cell C1. Sau đó mình thực hiện copy ra 1 sheet tạm khác để xử lý. Hiện tại nếu range có 2 giá trị trở lên thì code chạy đúng. Còn nếu như range chỉ có 1 giá trị thì lại bị lỗi. Các bạn giúp mình viết lại đoạn vba này với. Mục đích của mình là nếu range không có giá trị thì không sử dụng vòng lặp, nếu có 1 giá trị thì giá trị đó được gán cho C1 sheet data, nếu có 2 giá trị trở lên thì dùng vòng lặp như bình thường. Cám ơn các bạn.
Hướng giải quyết đã được thực hiện ở bài #5 rồi còn gì!

Bạn đặt biến Arr là một Variant, đừng đặt là Arr() là được. Tôi đã xử lý cho bạn luôn trong code đó rồi, nếu khi bẫy lỗi, IsArray là nếu Arr là mảng thì chắc chắn nó phải có số hàng >2 thì làm gì đó trong vòng lặp của bạn. Còn không, tức Arr không phải là mảng thì Arr lại bằng giá trị của ô B9. Bạn đọc code mà không hiểu sao?
 
Upvote 0
Cám ơn bạn Hoàng Trọng Nghĩa và các bạn GPE, mình đã sửa được rồi. Mình cho nó check xem Arr có phải là array không trước khi thực hiện vòng lặp for như bạn Hoàng Trọng Nghĩa đã viết.
 
Upvote 0

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

Back
Top Bottom