Lọc báo cáo tổng hợp (1 người xem)

Liên hệ QC

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

Hoàng Tuyên

Thành viên mới
Tham gia
10/6/08
Bài viết
39
Được thích
4
Mã:
Sub FindBC()
Dim rng, rng1, rng2, strFind As String
Dim iRow, r, p As Integer
Dim c(1 To 17), b(1 To 17) As Currency
Dim s1, s2 As Currency
Dim ws As Worksheet
Set ws = Worksheets("BC_Cty")
Sheets("HOSO").Select
LstDsKH1.Clear

For p = 0 To 16
  c(p + 1) = 0
  b(p + 1) = 0
  rng2 = "$A$4"
  rng = ""

strFind = "HTA.D" & Format(p + 1, "00")
Do
    rng1 = Columns("A:A").Find(What:=strFind, After:=Range(rng2)).Address
  If Err.Number > 0 Or rng1 = rng Then
    Exit Do
  End If
  rng2 = rng1
  If rng = "" Then rng = rng1
  If r <> Range(rng1).Row And Range(rng1).Row > 3 Then
    r = Range(rng1).Row
    c(p + 1) = c(p + 1) + 1
    b(p + 1) = b(p + 1) + Cells(r, 72)
  End If
Loop
    LstDsKH1.AddItem Format(p + 1, "00")
    LstDsKH1.List(p, 1) = strFind
    LstDsKH1.List(p, 2) = c(p + 1)
    LstDsKH1.List(p, 3) = Format(b(p + 1), "#,##0")
Next
End Sub

Không hiểu sao em chạy đoạn code này thì trong sheet "BC_Cty" chỉ có số liệu khi p=0.
Khi p tăng lên 1 tới 16 thì LstDsKH1.List(p, 2)LstDsKH1.List(p, 2) bằng 0.
Em nhờ các thầy chỉ giúp em lỗi ở đâu ạ.
Em cảm ơn các thầy.
 
Lần chỉnh sửa cuối:
nhìn vào code bạn thì LstDsKH1.List(p,2) nó nhận giá trị từ c(p+1)
Mà mỗi vòng lập của bạn đều cho c(p+1) =0 . Giá trị này chỉ thay đổi khi điều kiện Do Loop của bạn thỏa mãn. Vì vậy nếu c(p+1) của bạn =0 thì bạn nên xem lại điều kiện trong Do Loop thử xem !
 
Upvote 0
nhìn vào code bạn thì LstDsKH1.List(p,2) nó nhận giá trị từ c(p+1)
Mà mỗi vòng lập của bạn đều cho c(p+1) =0 . Giá trị này chỉ thay đổi khi điều kiện Do Loop của bạn thỏa mãn. Vì vậy nếu c(p+1) của bạn =0 thì bạn nên xem lại điều kiện trong Do Loop thử xem !

c(p+1) là đếm số dòng thỏa mãn điều kiện tìm. b(p+1) là tính tổng tiền.
Thầy chỉ dẫn sát hơn được không?
Em gửi file mẫu lên đây ạ
 
Lần chỉnh sửa cuối:
Upvote 0
c(p+1) là đếm số dòng thỏa mãn điều kiện tìm. b(p+1) là tính tổng tiền.
Thầy chỉ dẫn sát hơn được không?
Em gửi file mẫu lên đây ạ
1. Thầy thì mình không dám nhận, mình củng chỉ là tay mơ thôi ! :)
2. Bạn gửi file lên thử xem sao
 
Upvote 0
Đọc sơ qua fong cách code mà tác giả topic đang sở hữu thấy rợn luôn;

Cả 1 rừng code vậy biết đường nào mà lần cho được.

Chào thua thôi!
 
Upvote 0
Cả 1 rừng code vậy biết đường nào mà lần cho được.

Chào thua thôi!
Dạ, e nhìn vào 1 rừng code này e cũng ớn luôn. Nhưng cũng ráng ngồi mò ra cho bạn ấy.
1. Code của bạn sau khi p=1( tức vòng lặp thứ 2 ) nó sẽ gây ra lỗi tại dòng dò
Mã:
rng1 = Columns("A:A").Find(What:=strFind, After:=Range(rng2)).Address
thì lúc này Err.Number có giá trị lớn hơn 0 và vì thế nó thoát khỏi lệnh Do => giá trị bán gán vào ListBox luôn =0
2. Tiếp tục p=2 ( tức vòng lặp thứ 3 ) thì giá trị Err.Number đã có ( do bạn chưa đưa nó về =0 )nên nó luôn luôn thoát khỏi lệnh Do của bạn => tất cả các giá trị từ p=1 trở đi luôn =0
3. Bệnh thêm lệnh Err.Clear trước next để nó bỏ giá trị Err.Number của vòng lặp trước thì sẽ ra kết quả !

Diễn tả dài dòng nhưng chắc bạn sữa được !
 
Upvote 0
Cảm ơn thầy quocphuoc. Em chạy được rồi ạ.
Tuy một rừng code nhưng em quên không nói rõ lỗi ở trong hàm Find().
Một lần nữa cảm ơn thầy.
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy cho em hỏi thêm:
Trong hàm Find này em muốn tìm tiếp phần bồi thường trong sheet khác (ví dụ em thêm một sheet là "Boithuong") với các điều kiện tìm kiếm tương tự thì làm thế nào ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy cho em hỏi thêm:
Trong hàm Find này em muốn tìm tiếp phần bồi thường trong sheet khác (ví dụ em thêm một sheet là "Boithuong") với các điều kiện tìm kiếm tương tự thì làm thế nào ạ?
Thiết nghĩ bạn viết được 1 " rừng code " như thế thì chả lý gì bạn ko viết được cái yêu cầu trên ?
 
Upvote 0
Thầy cứ "khen" trò quá.
Em cũng chỉ lên mang cóp nhặt và vọc để sửa theo ý mình thôi. Nhưng vọc thì cũng chỉ hiểu một phần. Thầy chỉ giúp cho em phương hướng giải quyết => em theo hướng để đến đích.
*******************************
Như ý em hỏi thì là em chưa biết khi gọi lệnh:
rng1 = Columns("A:A").Find(What:=strFind, After:=Range(rng2)).Address
thì sẽ tìm kiếm trong sheet "HOSO" hay sheet "Boithuong" ạ?
Mong thầy chỉ dẫn giúp em.
Thầy có thể rút gọn code để dễ nhìn thì tuyệt quá. Em xin hậu tạ, còn cảm ơn thì chắc rồi nhưng xã giao quá.
 
Upvote 0
trước lệnh For của bạn có 1 câu là sheets("Hoso").Select thì câu lệnh
rng1 = Columns("A:A").Find(What:=strFind, After:=Range(rng2)).Address
nó sẽ dò trong sheet Hồ Sơ . Nếu bạn muốn dò tìm trong sheet nào đó thì ngoài việc ghi như bạn trên thì có thể ghi là:
rng1 = sheets("Hoso").Columns("A:A").Find(What:=strFind, After:=sheets("Hoso").Range(rng2)).Address
=> từ đây thì bạn có thể phát triển được câu lệnh dò trong sheet khác rồi !
 
Upvote 0

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

Back
Top Bottom