Nếu chỉ có 1 dòng dữ liệu thì code báo lỗi

Liên hệ QC

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,014
Được thích
163
Nhờ anh chị, tìm giúp lỗi code như sau
Bây giờ bên Sheet TH có 2 dòng dữ liệu ( dòng 9 và 10)
Ta sang sheet PGH và tại ô F1 ta nhập A01 thì code chạy bình thường
****************
Ở sheet TH ta bỏ bớt 1 dòng số 10
Code trong sheet PGH ta bỏ dòng On Error Resume Next và dòng ActiveSheet.ShowAllData (mục đích để nó báo lỗi cụ thể)
Ta sang sheet PGH và tại ô F1 ta nhập A01, thì code báo lỗi Run time error '13 :Type Mismatch của dòng
For i = 1 To UBound(sArray, 1)
cụ thể trong code sau
Mã:
Sub SoTienGiamGia_ThuNoCu()    ' ? sheet PGH
    Dim sArray
    Dim i As Long
    Dim n1 As Range, n2 As Range, n3 As Range
    Dim Lr2 As Long
    Dim Wf As WorksheetFunction
    Set Wf = WorksheetFunction
    Lr2 = Sheets("PGH").Range("B62").End(xlUp).Row
    With Sheets("TH")
        Set n1 = .Range(.[A9], .[A65536].End(3))
        Set n2 = n1.Offset(, 13)
        Set n3 = n1.Offset(, 14)
        sArray = n1.Value
    End With
    For i = 1 To UBound(sArray, 1)
        Sheets("PGH").Range("F" & Lr2 - 1) = -Wf.SumIf(n1, Range("F1"), n2)
        Sheets("PGH").Range("F" & Lr2) = Wf.SumIf(n1, Range("F1"), n3)
    Next
End Sub
Em nhờ Thầy/cô và anh/chị tìm chổ sai và sửa giúp
Em cảm ơn!
 

File đính kèm

  • Loi-code-Sumif.xlsm
    4 MB · Đọc: 4
Mã:
Set n1 = .Range(.[A9], .[A65536].End(3))
...
sArray = n1.Value
Khi chỉ có 1 dòng thì n1 là vùng chỉ có 1 ô - ô A9. Khi đó sArray chỉ là 1 GIÁ TRỊ chứ không là MẢNG nên UBound(sArray, 1) gây ra lỗi.

Nhớ 1 lần cho muôn đời: nếu VUNG là 1 ô thì VUNG.Value là 1 GIÁ TRỊ chứ không là MẢNG giá trị. Nếu VUNG có >= 2 ô thì VUNG.Value là MẢNG giá trị.

Thế bạn có lường được là thậm chí 1 dòng dữ liệu (dòng 9) cũng không có? Người viết code luôn phải phân tích dữ liệu và xử lý các tình huống.

Nếu dữ liệu chỉ có 1 dòng nhưng lấy VUNG nhiều cột, tức >= 2 cột, thì dĩ nhiên VUNG sẽ có >= 2 ô, tức VUNG.Vale là MẢNG gíá trị. Nhưng nếu chỉ lấy 1 cột thì có thể VUNG chỉ có 1 ô, khi chỉ có 1 dòng dữ liệu, và VUNG.Value chỉ là 1 giá trị. Để phục vụ trường hợp này thì ta dùng "mẹo". Nếu ta lấy dư 1 dòng nhưng sau đó không xét dòng lấy dư thì "hòa cả làng", đúng không. Mà nếu lấy dư 1 dòng thì số dòng luôn >= 2, tức VUNG có ít nhất 2 ô và VUNG.Value là MẢNG giá trị.

Nếu là tôi thì
Mã:
Dim lastRow As Long
    ...
    With Sheets("TH")
        lastRow = .Range("A" & Rows.Count).End(xlUp).Row
        If lastRow < 9 Then Exit Sub    ' neu khong co du lieu thi don do choi
        Set n1 = .Range("A9:A" & lastRow + 1)   ' lay du 1 dong cuoi      
        ...
    End With
    For i = 1 To UBound(sArray, 1) - 1  ' khong xet dong lay du o cuoi
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Set n1 = .Range(.[A9], .[A65536].End(3).Offset(1))
...
sArray = n1.Value
Khi chỉ có 1 dòng thì n1 là vùng chỉ có 1 ô - ô A9. Khi đó sArray chỉ là 1 GIÁ TRỊ chứ không là MẢNG nên UBound(sArray, 1) gây ra lỗi.

Nhớ 1 lần cho muôn đời: nếu VUNG là 1 ô thì VUNG.Value là 1 GIÁ TRỊ chứ không là MẢNG giá trị. Nếu VUNG có >= 2 ô thì VUNG.Value là MẢNG giá trị.

Thế bạn có lường được là thậm chí 1 dòng dữ liệu (dòng 9) cũng không có? Người viết code luôn phải phân tích dữ liệu và xử lý các tình huống.

Nếu dữ liệu chỉ có 1 dòng nhưng lấy VUNG nhiều cột, tức >= 2 cột, thì dĩ nhiên VUNG sẽ có >= 2 ô, tức VUNG.Vale là MẢNG gíá trị. Nhưng nếu chỉ lấy 1 cột thì có thể VUNG chỉ có 1 ô, khi chỉ có 1 dòng dữ liệu, và VUNG.Value chỉ là 1 giá trị. Để phục vụ trường hợp này thì ta dùng "mẹo". Nếu ta lấy dư 1 dòng nhưng sau đó không xét dòng lấy dư thì "hòa cả làng", đúng không. Mà nếu lấy dư 1 dòng thì số dòng luôn >= 2, tức VUNG có ít nhất 2 ô và VUNG.Value là MẢNG giá trị.

Nếu là tôi thì
Mã:
Dim lastRow As Long
    ...
    With Sheets("TH")
        lastRow = .Range("A" & Rows.Count).End(xlUp).Row
        If lastRow < 9 Then Exit Sub    ' neu khong co du lieu thi don do choi
        Set n1 = .Range("A9:A" & lastRow + 1)   ' lay du 1 dong cuoi      
        ...
    End With
    For i = 1 To UBound(sArray, 1) - 1  ' khong xet dong lay du o cuoi
Em cảm ơn anh nhiều
Thực tế mà nói VBA em còn yếu lắm, viết theo copy đó anh
 
Upvote 0
Web KT
Back
Top Bottom