Không thể hiện dòng trống khi xuất kết quả VBA Excel

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

PhuongNK

Thành viên mới
Tham gia
31/1/23
Bài viết
8
Được thích
0
Nhờ các anh/chị chỉ giúp em, em đang làm sheet "tổng hợp chi tiết công nợ" từ 2 sheet "phát sinh" và "thanh toán". Tham chiếu và lọc dữ liệu qua mã khách hàng. Chỉ giúp em code VBA để khi output không thể hiện dòng trống được không ạ. Em cảm ơn nhiều ạ
Sub loccongno()
'Buoc 1: Loc du lieu sheet phat sinh
Dim arr(), kq(), a As Long, i As Long, ir As Long
Dim shnguon As Worksheet, shdich As Worksheet

Set shnguon = Sheets("phat sinh")
Set shdich = Sheets("chi tiet cong no")

With shdich
makh = shdich.Range("C10").Value
End With

With shnguon
ir = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A5:V" & ir).Value
ReDim kq(1 To 10000, 1 To 8)
End With

For i = 1 To UBound(arr, 1)
If arr(i, 3) = makh Then
a = a + 1
kq(a, 1) = arr(i, 1) 'ngay thang
kq(a, 2) = arr(i, 2) 'so hoa don
kq(a, 3) = arr(i, 5) 'noi dung
kq(a, 4) = arr(i, 11) 'so tien phai thanh toan
kq(a, 5) = ""
kq(a, 6) = arr(i, 21) 'phan loai chi phi
kq(a, 7) = arr(i, 20) 'phap nhan
kq(a, 8) = arr(i, 22) 'ghi chu
End If

If arr(i, 3) <> makh Then
a = a + 1
kq(a, 1) = ""
kq(a, 2) = ""
kq(a, 3) = ""
kq(a, 4) = ""
kq(a, 5) = ""
kq(a, 6) = ""
kq(a, 7) = ""
kq(a, 8) = ""
End If
Next i
'Buoc 2: Loc du lieu sheet thanh toan
Set shnguon = Sheets("thanh toan")
With shnguon
ir = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A5:I" & ir).Value
End With
For i = 1 To UBound(arr, 1)
If arr(i, 2) = makh Then
a = a + 1
kq(a, 1) = arr(i, 1) 'ngay thang
kq(a, 2) = arr(i, 5) 'so hoa don
kq(a, 3) = arr(i, 4) 'noi dung
kq(a, 4) = ""
kq(a, 5) = arr(i, 6) 'so tien thanh toan
kq(a, 6) = ""
kq(a, 7) = arr(i, 8) 'phap nhan
kq(a, 8) = arr(i, 9) 'ghi chu
End If

If arr(i, 2) <> makh Then
a = a + 1
kq(a, 1) = ""
kq(a, 2) = ""
kq(a, 3) = ""
kq(a, 4) = ""
kq(a, 5) = ""
kq(a, 6) = ""
kq(a, 7) = ""
kq(a, 8) = ""
End If
Next i

'Output dan ket qua ra sheet chi tiet cong no
If a > 10000 Then
MsgBox "du lieu vuot qua 10000 dong!", vbCritical
Exit Sub
End If

If a > 0 Then
With shdich
.Range("A17:A10016").ClearContents
.Range("A17").Resize(a, 8).Value = kq
End With
End If


End Sub
 
Nhờ các anh/chị chỉ giúp em, em đang làm sheet "tổng hợp chi tiết công nợ" từ 2 sheet "phát sinh" và "thanh toán". Tham chiếu và lọc dữ liệu qua mã khách hàng. Chỉ giúp em code VBA để khi output không thể hiện dòng trống được không ạ. Em cảm ơn nhiều ạ
Sub loccongno()
'Buoc 1: Loc du lieu sheet phat sinh
Dim arr(), kq(), a As Long, i As Long, ir As Long
Dim shnguon As Worksheet, shdich As Worksheet

Set shnguon = Sheets("phat sinh")
Set shdich = Sheets("chi tiet cong no")

With shdich
makh = shdich.Range("C10").Value
End With

With shnguon
ir = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A5:V" & ir).Value
ReDim kq(1 To 10000, 1 To 8)
End With

For i = 1 To UBound(arr, 1)
If arr(i, 3) = makh Then
a = a + 1
kq(a, 1) = arr(i, 1) 'ngay thang
kq(a, 2) = arr(i, 2) 'so hoa don
kq(a, 3) = arr(i, 5) 'noi dung
kq(a, 4) = arr(i, 11) 'so tien phai thanh toan
kq(a, 5) = ""
kq(a, 6) = arr(i, 21) 'phan loai chi phi
kq(a, 7) = arr(i, 20) 'phap nhan
kq(a, 8) = arr(i, 22) 'ghi chu
End If

If arr(i, 3) <> makh Then
a = a + 1
kq(a, 1) = ""
kq(a, 2) = ""
kq(a, 3) = ""
kq(a, 4) = ""
kq(a, 5) = ""
kq(a, 6) = ""
kq(a, 7) = ""
kq(a, 8) = ""
End If
Next i
'Buoc 2: Loc du lieu sheet thanh toan
Set shnguon = Sheets("thanh toan")
With shnguon
ir = .Range("A" & Rows.Count).End(xlUp).Row
arr = .Range("A5:I" & ir).Value
End With
For i = 1 To UBound(arr, 1)
If arr(i, 2) = makh Then
a = a + 1
kq(a, 1) = arr(i, 1) 'ngay thang
kq(a, 2) = arr(i, 5) 'so hoa don
kq(a, 3) = arr(i, 4) 'noi dung
kq(a, 4) = ""
kq(a, 5) = arr(i, 6) 'so tien thanh toan
kq(a, 6) = ""
kq(a, 7) = arr(i, 8) 'phap nhan
kq(a, 8) = arr(i, 9) 'ghi chu
End If

If arr(i, 2) <> makh Then
a = a + 1
kq(a, 1) = ""
kq(a, 2) = ""
kq(a, 3) = ""
kq(a, 4) = ""
kq(a, 5) = ""
kq(a, 6) = ""
kq(a, 7) = ""
kq(a, 8) = ""
End If
Next i

'Output dan ket qua ra sheet chi tiet cong no
If a > 10000 Then
MsgBox "du lieu vuot qua 10000 dong!", vbCritical
Exit Sub
End If

If a > 0 Then
With shdich
.Range("A17:A10016").ClearContents
.Range("A17").Resize(a, 8).Value = kq
End With
End If


End Sub
Hơi khó hình dung khi không có file để test.
 
PHP:
Sub LocCongNo()
'Buoc 1: Loc du lieu sheet phat sinh    '
Dim Arr(), KQ(), A As Long, I As Long, iR As Long
Dim ShNguon As Worksheet, ShDich As Worksheet

Set ShNguon = Sheets("PhatSinh")
Set ShDich = Sheets("CongNo")
'With ShDich    '
    MaKH = ShDich.Range("C10").Value
'End With    '
With ShNguon
    iR = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A5:V" & iR).Value
    ReDim KQ(1 To 10000, 1 To 8)
End With
For I = 1 To UBound(Arr, 1)
    If Arr(I, 3) = MaKH Then
        A = A + 1
        KQ(A, 1) = Arr(I, 1) 'ngay thang    '
        KQ(A, 2) = Arr(I, 2) 'so hoa don    '
        KQ(A, 3) = Arr(I, 5) 'noi dung  '
        KQ(A, 4) = Arr(I, 11) 'so tien phai thanh toan  '
'        KQ(A, 5) = ""   '
        KQ(A, 6) = Arr(I, 21) 'phan loai chi phi    '
        KQ(A, 7) = Arr(I, 20) 'phap nhan    '
        KQ(A, 8) = Arr(I, 22) 'ghi chu  '
    End If
    If Arr(I, 3) <> MaKH Then
21   '     A = A + 1        '
'        KQ(A, 1) = "":      KQ(A, 2) = ""
'        KQ(A, 3) = "":      KQ(A, 4) = ""
'        KQ(A, 5) = "":      KQ(A, 6) = ""
'        KQ(A, 7) = "":      KQ(A, 8) = ""
    End If
 Next I
'Buoc 2: Loc du lieu sheet thanh toan
 Set ShNguon = Sheets("ThToan")
With ShNguon
    iR = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A5:I" & iR).Value
End With
For I = 1 To UBound(Arr, 1)
    If Arr(I, 2) = MaKH Then
        A = A + 1
        KQ(A, 1) = Arr(I, 1) 'ngay thang    '
        KQ(A, 2) = Arr(I, 5) 'so hoa don    '
        KQ(A, 3) = Arr(I, 4) 'noi dung      '
        KQ(A, 4) = ""
        KQ(A, 5) = Arr(I, 6) 'so tien thanh toan    '
        KQ(A, 6) = ""
        KQ(A, 7) = Arr(I, 8) 'phap nhan '
        KQ(A, 8) = Arr(I, 9) 'ghi chu   '
    End If
    If Arr(I, 2) <> MaKH Then
46 '        A = A + 1:          KQ(A, 1) = ""    '
'        KQ(A, 2) = "":      KQ(A, 3) = ""
'        KQ(A, 4) = "":      KQ(A, 5) = ""
'        KQ(A, 6) = "":      KQ(A, 7) = ""
'        KQ(A, 8) = ""
    End If
 Next I
'Output dan ket qua ra sheet chi tiet cong no   '
If A > 10000 Then
    MsgBox "du lieu vuot qua 10000 dong!", vbCritical
    Exit Sub
End If
If A > 0 Then
    With ShDich
        .Range("A17:A10016").ClearContents
        .Range("A17").Resize(A, 8).Value = KQ
    End With
End If
End Sub

[Chú ý: Mình đã đổi tên các trang tính; Bạn có thể xài hay đổi lại cho khớp.]
 
Lần chỉnh sửa cuối:
PHP:
Sub LocCongNo()
'Buoc 1: Loc du lieu sheet phat sinh    '
Dim Arr(), KQ(), A As Long, I As Long, iR As Long
Dim ShNguon As Worksheet, ShDich As Worksheet

Set ShNguon = Sheets("PhatSinh")
Set ShDich = Sheets("CongNo")
'With ShDich    '
    MaKH = ShDich.Range("C10").Value
'End With    '
With ShNguon
    iR = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A5:V" & iR).Value
    ReDim KQ(1 To 10000, 1 To 8)
End With
For I = 1 To UBound(Arr, 1)
    If Arr(I, 3) = MaKH Then
        A = A + 1
        KQ(A, 1) = Arr(I, 1) 'ngay thang    '
        KQ(A, 2) = Arr(I, 2) 'so hoa don    '
        KQ(A, 3) = Arr(I, 5) 'noi dung  '
        KQ(A, 4) = Arr(I, 11) 'so tien phai thanh toan  '
'        KQ(A, 5) = ""   '
        KQ(A, 6) = Arr(I, 21) 'phan loai chi phi    '
        KQ(A, 7) = Arr(I, 20) 'phap nhan    '
        KQ(A, 8) = Arr(I, 22) 'ghi chu  '
    End If
    If Arr(I, 3) <> MaKH Then
21   '     A = A + 1        '
'        KQ(A, 1) = "":      KQ(A, 2) = ""
'        KQ(A, 3) = "":      KQ(A, 4) = ""
'        KQ(A, 5) = "":      KQ(A, 6) = ""
'        KQ(A, 7) = "":      KQ(A, 8) = ""
    End If
 Next I
'Buoc 2: Loc du lieu sheet thanh toan
 Set ShNguon = Sheets("ThToan")
With ShNguon
    iR = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A5:I" & iR).Value
End With
For I = 1 To UBound(Arr, 1)
    If Arr(I, 2) = MaKH Then
        A = A + 1
        KQ(A, 1) = Arr(I, 1) 'ngay thang    '
        KQ(A, 2) = Arr(I, 5) 'so hoa don    '
        KQ(A, 3) = Arr(I, 4) 'noi dung      '
        KQ(A, 4) = ""
        KQ(A, 5) = Arr(I, 6) 'so tien thanh toan    '
        KQ(A, 6) = ""
        KQ(A, 7) = Arr(I, 8) 'phap nhan '
        KQ(A, 8) = Arr(I, 9) 'ghi chu   '
    End If
    If Arr(I, 2) <> MaKH Then
46 '        A = A + 1:          KQ(A, 1) = ""    '
'        KQ(A, 2) = "":      KQ(A, 3) = ""
'        KQ(A, 4) = "":      KQ(A, 5) = ""
'        KQ(A, 6) = "":      KQ(A, 7) = ""
'        KQ(A, 8) = ""
    End If
 Next I
'Output dan ket qua ra sheet chi tiet cong no   '
If A > 10000 Then
    MsgBox "du lieu vuot qua 10000 dong!", vbCritical
    Exit Sub
End If
If A > 0 Then
    With ShDich
        .Range("A17:A10016").ClearContents
        .Range("A17").Resize(A, 8).Value = KQ
    End With
End If
End Sub

[Chú ý: Mình đã đổi tên các trang tính; Bạn có thể xài hay đổi lại cho khớp.]
Mình cảm ơn nhiều nhé, mà có chỉnh code theo bạn mà vẫn không ra,hix. Nên mình đành thủ công làm thêm 1 nút xóa dữ liệu trước khi lọc vậy.
 
Vậy bạn giải thích dùm mình 2 đoạn mã lệnh sau của bạn dùng để làm gì được không:
PHP:
 ' . . . . . . '
    If Arr(I, 3) <> MaKH Then
21       A = A + 1        '
        KQ(A, 1) = "":      KQ(A, 2) = ""
        KQ(A, 3) = "":      KQ(A, 4) = ""
        KQ(A, 5) = "":      KQ(A, 6) = ""
        KQ(A, 7) = "":      KQ(A, 8) = ""
    End If
 Next I
 ' . . . . . '
    If Arr(I, 2) <> MaKH Then
46         A = A + 1:          KQ(A, 1) = ""    '
        KQ(A, 2) = "":      KQ(A, 3) = ""
        KQ(A, 4) = "":      KQ(A, 5) = ""
        KQ(A, 6) = "":      KQ(A, 7) = ""
        KQ(A, 8) = ""
    End If
' . . . . . '
 
Vậy bạn giải thích dùm mình 2 đoạn mã lệnh sau của bạn dùng để làm gì được không:
PHP:
 ' . . . . . . '
    If Arr(I, 3) <> MaKH Then
21       A = A + 1        '
        KQ(A, 1) = "":      KQ(A, 2) = ""
        KQ(A, 3) = "":      KQ(A, 4) = ""
        KQ(A, 5) = "":      KQ(A, 6) = ""
        KQ(A, 7) = "":      KQ(A, 8) = ""
    End If
 Next I
 ' . . . . . '
    If Arr(I, 2) <> MaKH Then
46         A = A + 1:          KQ(A, 1) = ""    '
        KQ(A, 2) = "":      KQ(A, 3) = ""
        KQ(A, 4) = "":      KQ(A, 5) = ""
        KQ(A, 6) = "":      KQ(A, 7) = ""
        KQ(A, 8) = ""
    End If
' . . . . . '
À do trước mình viết không có dòng này đâu, nhưng khi lọc tìm mã KH 2 sau ko có dữ liệu thì trên bảng vẫn nguyên dữ liệu của Mã KH 1 tìm trước đó, không tự mất đi nên đoạn này là để khi tham chiếu mã KH không đúng sẽ ra dòng trống. thì giải quyết đc việc vs mã KH không có dữ liệu sẽ ko hiện ra gì cả, nhưng với mã KH có dữ liệu thì lại xuất hiện những dòng trống trong bảng. hix
 
Chu trình cơ bản của macro con cưng của bạn có thể tóm tắt như sau:

(*) Lấy mã khách hàng (KH) cần lọc đưa vô tham biến MaKH
(*) Làm việc với trang tính 'PhatSinh':
+ Đưa dữ liệu trang này vô mảng & tạo vòng lặp duyệt theo cột thứ 3 (MaKH)
+ Dòng nào đạt yêu cầu (là trùng với MaKH) thì chép vô mảng đích
(+) Sau đó là 1 số dòng lệnh trên (tạo ra những dòng trống chưa biết để làm gì?)
(*) Sau đó cũng í chang như vậy với trang 'ThToan', chỉ khác 1 chổ là MaKH của trang này ở cột thứ 2
(+) Sau đó cũng lập những dòng trống ( . . . .)

Nếu giả dụ bạn vô hiệu hóa các dòng lệnh ở cả 2 bước (+) thì kết quả sẽ cho bạn những gì không mong muốn?
 
Chu trình cơ bản của macro con cưng của bạn có thể tóm tắt như sau:

(*) Lấy mã khách hàng (KH) cần lọc đưa vô tham biến MaKH
(*) Làm việc với trang tính 'PhatSinh':
+ Đưa dữ liệu trang này vô mảng & tạo vòng lặp duyệt theo cột thứ 3 (MaKH)
+ Dòng nào đạt yêu cầu (là trùng với MaKH) thì chép vô mảng đích
(+) Sau đó là 1 số dòng lệnh trên (tạo ra những dòng trống chưa biết để làm gì?)
(*) Sau đó cũng í chang như vậy với trang 'ThToan', chỉ khác 1 chổ là MaKH của trang này ở cột thứ 2
(+) Sau đó cũng lập những dòng trống ( . . . .)

Nếu giả dụ bạn vô hiệu hóa các dòng lệnh ở cả 2 bước (+) thì kết quả sẽ cho bạn những gì không mong muốn?
Nếu loại bỏ phần (+) thì khi lọc KH1 ra 4 dòng dữ liệu, sau đó chọn KH2 không có dữ liệu nhưng trên bảng vẫn giữ nguyên 4 dòng của KH1 đã xem hoặc nếu KH2 có 3 dòng dữ liệu thì 1 dòng cuối của KH1 vẫn giữ nguyên không mất đi ấy bạn
 
Nếu loại bỏ phần (+) thì khi lọc KH1 ra 4 dòng dữ liệu, (1) sau đó chọn KH2 không có dữ liệu nhưng trên bảng vẫn giữ nguyên 4 dòng của KH1 đã xem hoặc nếu KH2 có 3 dòng dữ liệu thì 1 dòng cuối của KH1 vẫn giữ nguyên không mất đi ấy bạn
(1) Mình mường tượng là khi chọn KH 2 (hay khác) thì macro sẽ phải chạy lại từ đầu
& như vậy có bao nhiêu dòng của KH2 (hay n) thì sẽ thiển thị bấy nhiêu dòng, bỡi câu lệnh của bạn đã là:
Mã:
With shdich
.Range("A17:A10016").ClearContents
.Range("A17").Resize(a, 8).Value = kq
End With
Lấy đâu ra 4 dòng trắng của lần chạy macro trước kia chứ?!
 
(1) Mình mường tượng là khi chọn KH 2 (hay khác) thì macro sẽ phải chạy lại từ đầu
& như vậy có bao nhiêu dòng của KH2 (hay n) thì sẽ thiển thị bấy nhiêu dòng, bỡi câu lệnh của bạn đã là:
Mã:
With shdich
.Range("A17:A10016").ClearContents
.Range("A17").Resize(a, 8).Value = kq
End With
Lấy đâu ra 4 dòng trắng của lần chạy macro trước kia chứ?!
View attachment 286036
View attachment 286038
(1) Mình mường tượng là khi chọn KH 2 (hay khác) thì macro sẽ phải chạy lại từ đầu
& như vậy có bao nhiêu dòng của KH2 (hay n) thì sẽ thiển thị bấy nhiêu dòng, bỡi câu lệnh của bạn đã là:
Mã:
With shdich
.Range("A17:A10016").ClearContents
.Range("A17").Resize(a, 8).Value = kq
End With
Lấy đâu ra 4 dòng trắng của lần chạy macro trước kia chứ?!
1675320246822.png1675320260561.png
Đây bạn, hình 1 là tra mã 12-11 HL có 4 dòng dữ liệu, sau đó chọn mã An Hòa (chỉ có 3 dòng dữ liệu) nhưng vẫn giữ nguyên 1 dòng cuối của 12-11 HL tra trước đó. Mình muốn khắc phục là khi chọn mã KH nào chỉ thể hiện dữ liệu của mã đó
 
Vì không có file nên mình đoán mò à nha:
Khai báo tường tham biến 'A' dùm cái thử xem sao.

Mà tại sao lại xài 'A', mà không là J, hay W hay K, Rw, Dg, Hg, . . . . .
Tại sao tên macro của bạn là 'loccongno()' mà không là 'LocCongNo'
Tại sao tên trang tính của bạn là 'phat sinh' mà không là 'PhatSinh' hay thậm chí 'FatSinh'
& cũng như vậy sao không là 'ThToan' hay 'ThanhToan' mà là 'thanh toan' . . . . . (?)
 
Vì không có file nên mình đoán mò à nha:
Khai báo tường tham biến 'A' dùm cái thử xem sao.

Mà tại sao lại xài 'A', mà không là J, hay W hay K, Rw, Dg, Hg, . . . . .
Tại sao tên macro của bạn là 'loccongno()' mà không là 'LocCongNo'
Tại sao tên trang tính của bạn là 'phat sinh' mà không là 'PhatSinh' hay thậm chí 'FatSinh'
& cũng như vậy sao không là 'ThToan' hay 'ThanhToan' mà là 'thanh toan' . . . . . (?)
Bạn ơi mình gửi file, b thử xem giúp mình nhé.
 

File đính kèm

  • TH cong no.xlsm
    722.8 KB · Đọc: 7
Giời, mình nói có sai đâu. Ngay từ đầu có cái file thì có lẽ ta đã không lãng phí thời gian của nhau.
Rãnh dỗi, để nhìn gái đẹp có phải thích hơn không?!
 
Rõ ràng bạn muốn ghi kết quả lên những dòng, bắt đầu từ dòng 17
PHP:
With shdich
.Range("A17:A10016").ClearContents
.Range("A17").Resize(a, 8).Value = kq
End With
End If

Nhưng trong hình ở bài #10 thì lý ra nên ghi bắt đầu từ dòng 14(!)
 
Rõ ràng bạn muốn ghi kết quả lên những dòng, bắt đầu từ dòng 17
PHP:
With shdich
.Range("A17:A10016").ClearContents
.Range("A17").Resize(a, 8).Value = kq
End With
End If

Nhưng trong hình ở bài #10 thì lý ra nên ghi bắt đầu từ dòng 14(!)
để mình xem lại nhé, vì bảng mình gửi là xóa mất mấy dòng trên tiêu đề
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom