Tự động thêm công thức khi thỏa điều kiện

Liên hệ QC

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
- Kiến thức VB của mình ít, mình nhờ các bạn chỉ giúp mình vấn đề này.
- Làm sao để Excel tự động thêm công thức theo yêu cầu.
+ Vật liệu: Sẽ cộng tất cả các hao phí có mã hiệu bắt đầu bằng chử "V"
+ Nhân công: -----------------------------------------------------"N"
+ Máy thi công: --------------------------------------------------"M"
+ Tổng cộng: Tổng vật liệu + nhân công + máy thi công.
Số lượng công tác không xác định, số lượng vật tư cũng không xác định.
Trong file mình gửi mình chỉ lấy 2 công tác làm điển hình.
Mình có ghi macro tuy nhiên không biết làm sao sẽ áp dụng được cho tất cả các công tác.
Nhờ các bạn giúp đỡ.
gpe.png

Code:
PHP:
Sub Chay_thu()
    Range("I7").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[4]C)"
' Sum vật liệu
'
    Range("I12").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[2]C)"
' Sum nhân công
 '
    Range("I15").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[2]C)"
' Sum máy
  '
    Range("I18").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-3]C,R[-6]C,R[-11]C)"
' Sum tổng và xong công tác 1, chuyển qua công tác 2
   '
    Range("I19").Select
    ActiveWindow.SmallScroll Down:=12
    Range("I20").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[9]C)"
    Range("I30").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C)"
    Range("I32").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C)"
    Range("I34").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-2]C,R[-4]C,R[-14]C)"
    Range("I35").Select
End Sub
Mình nghĩ có lẽ như sau:
PHP:
'+ Sum vật liệu
    Range("Ik").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[i]C)"
[4] bằng  [a], "I7" bằng "Ib"
  a: số dòng sẽ sum
  b: số dòng sẽ bắt đầu tính sum
' + Sum nhân công 
    Range("Ic").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[d]C)"
' + Sum máy thi công
    Range("Ie").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[f]C)"

'+ Sum tổng:
ActiveCell.FormulaR1C1 =SUM(R[-g]C,R[-h]C,R[-i]C)
trong đó g = b-a (cho vật liệu)
            h=c-d (cho nhân công)
            i=e-f (cho máy thi công)
Nhưng mình không biết làm sao cho excel chỉ tìm vật liệu, nhân công, máy trong 1 vùng nhất định (vùng công tác 1).
Thực hiện các công việc trên trong công tác 1, thực hiện xong nó sẽ chuyển xuống công tác 2. Vùng sum sẽ thay đổi.
Mong nhận được giúp đỡ của các bạn. Chân thành cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn thử với file đính kèm dưới đây
 

File đính kèm

Upvote 0
Bạn thử với file đính kèm dưới đây
Chân thành cảm ơn ban SA_DQ rất nhiều.
File của bạn chạy rất tốt. Nhưng mình có thêm một vấn đề này muốn tham khảo ý kiến của bạn.
Mình có gửi bạn file tuy nhiên mình chưa đề cập đến trường hợp các vật liệu khác không có giá vật tư, vì vậy sẽ nhầm tại vị trí:
PHP:
 If Cls.Offset(, -6).Value = "" Then.Offset(-1, 2).FormulaR1C1 = "=SUM(R[1]C:R[" & Dong & "]C)"
MÌnh có góp ý như sau: "Trong đoạn code của bạn, bạn dùng cột G làm gốc, tại sao mình không dùng cột C làm gốc. "
Mình coi đoạn code của bạn từ trưa đến giờ, nghĩ cách khắc phục nhưng do không biết nhiều về VB nên mò mãi không ra. ^^
Nên mình gửi lại nhờ bạn xem giúp.
Mình có bổ sung thêm một số chi phí thêm cho mỗi hạng mục, mình thử đưa hàm vào trong các chi phí đó nhưng khi chạy đều báo lỗi.

Thân. Cảm ơn bạn rất nhiều. Mong nhận được hồi đáp.
 

File đính kèm

Upvote 0
Nhờ mọi người xem đoạn code gặp lỗi gì...

Cảm ơn bạn SA-DQ
Theo cách của bạn SA_DQ mình có sửa lại một số chổ. Nhưng chạy không theo ý, nhờ các bạn góp ý..
Tại sao khi chay vòng if đầu tiên, nếu thỏa điều kiện
PHP:
 Don_gia.Value = ""
thì sẽ chạy vòng if tiếp theo:
PHP:
 If Don_gia.Offset(, -4) = "VËt liÖu"
. Nhưng nó không vô được mà cứ chạy điều kiện còn lại!!. Không biết phải xử lý như thế nào.
Đây là code mình gặp lỗi, nhờ các bạn góp ý:
PHP:
Sub Tinh_lai_dongiachitiet()
    Dim Don_gia As Range, Vung_nguon As Range, Clls As Range
    Dim Dbd As Long, Dong_VL As Long, Dong_NC As Long
    Dim Dong_MTC As Long
    Sheets("Don gia chi tiet").Select
    Set Vung_nguon = Range([h7], [h65500].End(xlUp).Offset(9))
    For Each Don_gia In Vung_nguon
        If Don_gia.Value = "" Then
            If Don_gia.Offset(, -4) = "VËt liÖu" Then Dbd = Don_gia.Row
                With Don_gia.Offset(1)
                    If .Offset(1).Value = "" Then
                        Dong_VL = 1
                    Else
                        Dong_VL = Range(.Cells(1), .End(xlDown)).Rows.Count
                        .Offset(, -3).FormulaR1C1 = "=Sum(R[1]C:R[" & Dong_VL & "]C)*1"
                    End If
                End With
             ElseIf Don_gia.Offset(, -4) = "Nh©n c«ng" Then Dbd = Don_gia.Row
                With Don_gia.Offset(1)
                    If .Offset(1).Value = "" Then
                        Dong_NC = 1
                    Else
                        Dong_NC = Range(.Cells(1), .End(xlDown)).Rows.Count
                        Don_gia.Offset(, -3).FormulaR1C1 = "=Sum(R[1]C:R[" & Dong_NC & "]C)*1"
                    End If
                End With
             ElseIf Don_gia.Offset(, -4).Value = "M¸y thi c«ng" Then Dbd = Don_gia.Row
                With Don_gia.Offset(1)
                    If .Offset(1).Value = "" Then
                        Dong_MTC = 1
                    Else
                        Dong_MTC = Range(.Cells(1), .End(xlDown)).Rows.Count
                        Don_gia.Offset(, -3).FormulaR1C1 = "=Sum(R[1]C:R[" & Dong_MTC & "]C)*1"
                    End If
                End With
             ElseIf Don_gia.Offset(0, -4) = "Trùc tiÕp phÝ kh¸c" Then
                Don_gia.Offset(0, -3).FormulaR1C1 = "=Sum(R[-" & Dong_MTC + 1 & "]C,R[-" & Dong_MTC + 2 + Dong_NC & "]C, R[-" & Dong_VL + Dong_NC + Dong_MTC + 3 & "]C)*1,5%"
            Else
                Don_gia.Offset(0, -3) = "thu de chay tiep"
        End If
    Next Don_gia
End Sub
Trong này mình chỉ mới thử đưa công thức cho vật liệu, nhân công, máy thi công, thực tiếp phí khác. Mình có gửi kèm file.
Cảm ơn các bạn trước nhé. Thân chào
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom