Hỏi về Code cộng có điều kiện (lọc dữ liệu, sau đó cộng các dữ liệu lọc được) (1 người xem)

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

votinh3290

Thành viên mới
Tham gia
1/4/12
Bài viết
8
Được thích
2
Nghề nghiệp
Vô công rồi nghề
Chào các anh chị! Xin các anh chị giúp đỡ em về macro với nội dung và mục đích của macro như sau:
- Em có mộ file excel trong đó gồm có các mã định mức, trong mỗi mã định mức có các thành phần là Vật Liệu, Nhân Công và máy,...., trong mỗi thành phần này lại có nhiều thành phần nhỏ khác (được thể hiện ở cột Thành Phần Hao Phí) và được tính đơn giá cho từng thành phần nhỏ này (được thể hiện ở cột Thành Tiền), Sau đó các đơn giá nhỏ này được cộng lại ở các thành phần lớn hơn (Vật Liệu, Nhân Công, Máy). Mục đích của em là muốn ở ô Thành tiền của dòng có nội dung là "*Tổng Chi Phí Trực Tiếp" sẽ là tổng của ba ô thành tiền của các dòng "Vật Liệu, Nhân công, Máy". Em đã viết được code cho công việc trên như sau:

Sub congloc()
For i = 1 To 50000
If (Selection.Value = Range("c21").Value) Then
Selection.Select
Exit For
Else
Selection.Offset(-1).Select
End If
Next
Dim a As Range
Set a = Range(Range(Selection, Rows(ActiveCell.Row)), Range(Selection, Rows(ActiveCell.Row)).End(xlUp))
Dim b As Range
Set b = a.Cells(a.Cells.Count)
Dim f As Range
Dim c As Range
Dim d As Range
Dim e As Range
Set c = a.Find(What:=Range("c39").Value, After:=b, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Offset(0, 4)
Set d = a.Find(What:=Range("c90").Value, After:=b, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Offset(0, 4)
Set e = a.Find(What:=Range("c79").Value, After:=b, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Offset(0, 4)
Set f = a.Find(What:=Range("c70").Value, After:=b, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Offset(0, 4)
f.Select
With Selection
.Formula = "=" & c.Address(0, 0) & "+" & d.Address(0, 0) & "+" & e.Address(0, 0)
End With
Selection.Offset(-1, -4).Select
End Sub

Tuy nhiên Code trên của em chỉ làm việc tốt khi mã hiệu định mức có đầy đủ 3 thành phần là Vật Liệu, Nhân Công, Máy. Với những mã hiệu thiếu một trong ba hoặc hai trong ba thành phần thì code báo lỗi. Mục đích của em là muốn tại những mã hiệu định mức có đủ cả ba thành phần vật liệu, nhân công, máy thì sẽ cộng cả 3 thành phần tại dòng Tổng chi phí trực tiếp, còn tại những mã hiệu định mức nào thiếu thành phần thì sẽ bỏ thành phần đó ở dòng tổng chi phí trực tiếp (ví dụ: nếu tại mã hiệu định mức chỉ có hai thành phần là Nhân công và máy thì sẽ cộng hai thành phần này, bỏ thành phần là vật liệu, nếu mã hiệu định mức chỉ có Nhân công thì chỉ lấy thành phần này).

File excel ở tệp đính kèm!

Tiện đây em cũng muốn hỏi là phương thức find trong VBA để tìm dữ liệu trong một vùng xác định. Nếu kết quả là không dò tìm được dữ liệu trong vùng đó thì phương thức find sẽ báo lỗi. Có cách nào để phương thức find báo về kết quả là "không tìm được dữ liệu yêu cầu"

Mong các anh chị giúp em!!! Cảm ơn các anh chị nhiều
 

File đính kèm

Chào các anh chị! Xin các anh chị giúp đỡ em về macro với nội dung và mục đích của macro như sau:
- Em có mộ file excel trong đó gồm có các mã định mức, trong mỗi mã định mức có các thành phần là Vật Liệu, Nhân Công và máy,...., trong mỗi thành phần này lại có nhiều thành phần nhỏ khác (được thể hiện ở cột Thành Phần Hao Phí) và được tính đơn giá cho từng thành phần nhỏ này (được thể hiện ở cột Thành Tiền), Sau đó các đơn giá nhỏ này được cộng lại ở các thành phần lớn hơn (Vật Liệu, Nhân Công, Máy). Mục đích của em là muốn ở ô Thành tiền của dòng có nội dung là "*Tổng Chi Phí Trực Tiếp" sẽ là tổng của ba ô thành tiền của các dòng "Vật Liệu, Nhân công, Máy". Em đã viết được code cho công việc trên như sau:
Tính theo cách đơn giản nhất: VD Tổng Chi Phí Trực Tiếp tại G14=sum(G9:G13)/2, các dòng khác tương tự.
Tính theo cách này thì các thành phần VL,NC M có đầy đủ hay không vẫn có kết quả chính xác
Nếu viết code : Sẽ tìm tổng của cột G từ dòng có MSDM gần nhất đến dòng liền kề của Tổng Chi Phí Trực Tiếp rồi chia cho 2.
Tính theo cách của bạn sẽ xảy ra rất nhiều trường hợp phức tạp!
 
Upvote 0
Cám ơn anh!

Tính theo cách đơn giản nhất: VD Tổng Chi Phí Trực Tiếp tại G14=sum(G9:G13)/2, các dòng khác tương tự.
Tính theo cách này thì các thành phần VL,NC M có đầy đủ hay không vẫn có kết quả chính xác
Nếu viết code : Sẽ tìm tổng của cột G từ dòng có MSDM gần nhất đến dòng liền kề của Tổng Chi Phí Trực Tiếp rồi chia cho 2.
Tính theo cách của bạn sẽ xảy ra rất nhiều trường hợp phức tạp!

Cám ơn anh!!!!. Cách đó em đã làm được rồi, đã đề xuất nhưng không được chấp nhận. Do yêu cầu của cấp trên nên em buộc phải làm như vậy. Hơn nữa em cũng muốn hỏi để làm việc với những bảng dữ liệu khác sau này.! Em cũng biết là như làm như cách này rất phức tạp, em đã định viết code cho từng trường hợp vì ở đây chỉ có ba thành phần nên chỉ có 6 trường hợp thôi. nhưng nếu nhiều hơn 3 thành phần thì sẽ có rất nhiều trường hợp. Anh có phương pháp nào có ưu thế hơn thì gợi ý cho em với, để em ngâm cứu dần! Chúc anh một ngày vui vẻ và làm việc hiệu quả
 
Upvote 0
Cám ơn anh!!!!. Cách đó em đã làm được rồi, đã đề xuất nhưng không được chấp nhận. Do yêu cầu của cấp trên nên em buộc phải làm như vậy. Hơn nữa em cũng muốn hỏi để làm việc với những bảng dữ liệu khác sau này.! Em cũng biết là như làm như cách này rất phức tạp, em đã định viết code cho từng trường hợp vì ở đây chỉ có ba thành phần nên chỉ có 6 trường hợp thôi. nhưng nếu nhiều hơn 3 thành phần thì sẽ có rất nhiều trường hợp. Anh có phương pháp nào có ưu thế hơn thì gợi ý cho em với, để em ngâm cứu dần! Chúc anh một ngày vui vẻ và làm việc hiệu quả
Tức là yêu cầu phải tìm giá trị VL, NC,M rồi mới cộng lại?
 
Upvote 0
Tức là yêu cầu phải tìm giá trị VL, NC,M rồi mới cộng lại?

Dạ vâng, đúng rồi anh! Cộng lại các giá trị ở 3 dòng VL, NC, M. Thành phần nào thiếu thì bỏ qua. Kết quả ở dòng Chi Phí Trực Tiếp
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem theo file;
Mà hình như trong CFTT của bạn còn nhân với 1.02 nữa thì fải?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dạ vâng, đúng rồi anh! Cộng lại các giá trị ở 3 dòng VL, NC, M. Thành phần nào thiếu thì bỏ qua. Kết quả ở dòng Chi Phí Trực Tiếp
Chạy đoạn code này xem sao. Kết quả trực tiếp phí ghi sang cột I
PHP:
Public Sub TrucTiepPhi()
Dim DL, Kq(), VL, NC, MAY, Tren, Duoi, d As Long, r As Long, rw As Long
DL = Sheet10.Range("A6", Sheet10.Range("G65000").End(xlUp))
ReDim Kq(1 To UBound(DL), 1 To 1)

For d = 1 To UBound(DL)
If DL(d, 1) >= 1 Then
Tren = d

For r = d + 1 To UBound(DL)
If DL(r, 4) = "T" Then
Duoi = r
GoTo DenDay
End If
Next r

DenDay:
VL = 0
NC = 0
MAY = 0
For rw = Tren To Duoi
If Left(DL(rw, 3), 2) = "a." Then
VL = DL(rw, 7)
End If

If Left(DL(rw, 3), 2) = "b." Then
NC = DL(rw, 7)
End If

If Left(DL(rw, 3), 2) = "c." Then
MAY = DL(rw, 7)
End If

Kq(Duoi, 1) = VL + NC + MAY
Next rw

End If
Next d

Sheet10.Range("I6").Resize(UBound(Kq), 1).Value = Kq
End Sub
------------
Trực tiếp phí trong file của bạn có lẽ chưa ổn.
Bình thường T=VL+NC+M sau đó xuống dòng mới cộng thêm trực tiếp phí khác
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn cách anh đã giúp đỡ

Giờ em mới đọc được bài. Cám ơn các anh đã giúp đỡ. Mặc dù có một số chỗ em không hiểu em sẽ cố gắng nghiên cứu tiếp. Một lần nữa cảm ơn các anh!!!
 
Upvote 0

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

Back
Top Bottom