Nhờ các cao thủ VBA giúp tách riêng tiền Vật liệu, nhân công, máy

Liên hệ QC

Phanhanhdai

Thành viên tiêu biểu
Tham gia
16/3/08
Bài viết
733
Được thích
1,876
Nghề nghiệp
Thiết kế công trình
Em có bảng đơn giá chi tiết, vấn đề em muốn tại cột thành tiền ứng với mỗi công việc có tách được tiền vật liệu, nhân công và máy ra (sử dụng VBA tham chiếu hiện công thức dưới dạng Fomular hoặc Funtion càng tốt). Bảng của em dài nếu lần nào cũng Sum bằng tay thì sẽ rất mất thời gian. Chân thành mong được các anh, chị quan tâm, giúp đỡ./.
 

File đính kèm

Em có bảng đơn giá chi tiết, vấn đề em muốn tại cột thành tiền ứng với mỗi công việc có tách được tiền vật liệu, nhân công và máy ra (sử dụng VBA tham chiếu hiện công thức dưới dạng Fomular hoặc Funtion càng tốt). Bảng của em dài nếu lần nào cũng Sum bằng tay thì sẽ rất mất thời gian. Chân thành mong được các anh, chị quan tâm, giúp đỡ./.


Bạn tham khảo file của anh anhphuong tại đây

http://www.giaiphapexcel.com/forum/showthread.php?t=15225
http://www.giaiphapexcel.com/forum/showthread.php?t=24445
 
Upvote 0
Em có bảng đơn giá chi tiết, vấn đề em muốn tại cột thành tiền ứng với mỗi công việc có tách được tiền vật liệu, nhân công và máy ra (sử dụng VBA tham chiếu hiện công thức dưới dạng Fomular hoặc Funtion càng tốt). Bảng của em dài nếu lần nào cũng Sum bằng tay thì sẽ rất mất thời gian. Chân thành mong được các anh, chị quan tâm, giúp đỡ./.


Đây là file của bạn
Chúc vui với công tác tính dự toán và trở thành một dự toán viên giỏi
Thân
P/S : sau khi cập nhật đầy đủ dữ liệu như trong Sheet Dutoanchitiet, hãy chạy Sub TinhTongTien trong Modull để cập nhật kết quả. Chú ý kết quả của Tổng tiền tính luôn phần Máy khác và Vật liệu khác
 

File đính kèm

Upvote 0
Đây là file của bạn
Chúc vui với công tác tính dự toán và trở thành một dự toán viên giỏi
Thân
P/S : sau khi cập nhật đầy đủ dữ liệu như trong Sheet Dutoanchitiet, hãy chạy Sub TinhTongTien trong Modull để cập nhật kết quả. Chú ý kết quả của Tổng tiền tính luôn phần Máy khác và Vật liệu khác
Cảm ơn anh rất nhiều,nhưng em chưa hiểu đoạn Code này có phải là đoạn thừa không ạh?
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 01/07/2009 by XuanTruong
'
'
ActiveCell.FormulaR1C1 = "=SUM(R[1]C:R[4]C)"
Range("H15").Select
End Sub
Sub Macro2()
'
' Macro2 Macro
' Macro recorded 01/07/2009 by XuanTruong
'
'
Range("H11").Select
ActiveCell.FormulaR1C1 = "=SUM(R[1]C)"
Range("H12").Select
End Sub
 
Upvote 0
Đua tốc độ --=0
Code này có lẽ nhanh hơn đấy.
PHP:
Sub TinhTong()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
R1 = [C65536].End(xlUp).Row
For i = [C65536].End(xlUp).Row To 6 Step -1
If Cells(i, 3) = "" Then
    Range("H" & i).Formula = Replace("=SUM(" &  _
           Cells(i + 1, 8).Address & ":" & Cells(R1, 8).Address & ")", "$", "")
    R1 = i - 1
    ElseIf Cells(i, 6) > 0 Then
    Range("H" & i).FormulaR1C1 = "=RC[-3]*RC[-2]"
End If
R1 = R1 - IIf(Cells(i, 1) <> "", 1, 0)
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Tôi không rành về XDCB nên không thể dựa vào DVT của các thành phần mà tính được.
Cảm ơn anh rất nhiều,nhưng em chưa hiểu đoạn Code này có phải là đoạn thừa không ạh?
Đúng là đoạn thừa đấy. Từ khóa rất nhiều, nhiều khi không nhớ hết. Vì vậy đôi khi cần phải sử dụng chức năng Record Macro.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cho tham gia cuộc đua này với!

PHP:
Option Explicit
Sub SumFor()
 Dim Rng As Range, sRng As Range, MyAdd As String
 Dim Color_ As Byte, Rw As Long
 
 Set Rng = Range([C65500].End(xlUp), [C7])
 Set sRng = Rng.Find("")
 If Not sRng Is Nothing Then
   MyAdd = sRng.Address:               Color_ = 35
   Do
8      If Left(sRng.Offset(, -1), 1) = "M" Or Left(sRng.Offset(, -1), 1) = "N" Then
         sRng.Offset(, 5).FormulaR1C1 = "=SUM(R[1]C:R[1]C)"
         sRng.Offset(, 5).Interior.ColorIndex = IIf(Color_ = 35, 38, 35)
         If Color_ = 38 Then Color_ = 35 Else Color_ = 38
12      Else
         If sRng.Offset(2) = "" Then
            Rw = 1:              sRng.Offset(, 5).Font.ColorIndex = 3
         Else
            Rw = sRng.Offset(1).End(xlDown).Row - sRng.Row
         End If
         sRng.Offset(, 5).FormulaR1C1 = "=SUM(R[1]C:R[" & Rw & "]C)"
         sRng.Offset(, 5).Interior.ColorIndex = 38
      End If
      Set sRng = Rng.FindNext(sRng)
   Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Đua tốc độ --=0
khóa rất nhiều, nhiều khi không nhớ hết. Vì vậy đôi khi cần phải sử dụng chức năng Record Macro.
Các anh làm thế nào mà viết code nhanh thế. Anh có thể bày cho em cách muốn sử dụng từ khóa như thế nào thì nhanh và hiệu quả nhất được không?. Em thường soạn viết Code trong Word rồi copy ra thôi. Trong khi nếu xử lý lỗi thì có khi hàng tiếng chẳng xong.
 
Upvote 0
Đua tốc độ --=0
Code này có lẽ nhanh hơn đấy.
PHP:
Sub TinhTong()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
R1 = [C65536].End(xlUp).Row
For i = [C65536].End(xlUp).Row To 6 Step -1
If Cells(i, 3) = "" Then
    Range("H" & i).Formula = Replace("=SUM(" &  _
           Cells(i + 1, 8).Address & ":" & Cells(R1, 8).Address & ")", "$", "")
    R1 = i - 1
    ElseIf Cells(i, 6) > 0 Then
    Range("H" & i).FormulaR1C1 = "=RC[-3]*RC[-2]"
End If
R1 = R1 - IIf(Cells(i, 1) <> "", 1, 0)
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Tôi không rành về XDCB nên không thể dựa vào DVT của các thành phần mà tính được.
Đúng là đoạn thừa đấy. Từ khóa rất nhiều, nhiều khi không nhớ hết. Vì vậy đôi khi cần phải sử dụng chức năng Record Macro.
Vì mới chập chững bước vào VBA nên kiến thức của em còn kém. Mong nhờ anh dịch hộ em ý nghĩa của dòng này : Range("H" & i).Formula = Replace("=SUM(" & _
Cells(i + 1, 8).Address & ":" & Cells(R1, 8).Address & ")", "$", "")
 
Upvote 0
Các anh làm thế nào mà viết code nhanh thế. Anh có thể bày cho em cách muốn sử dụng từ khóa như thế nào thì nhanh và hiệu quả nhất được không?. Em thường soạn viết Code trong Word rồi copy ra thôi. Trong khi nếu xử lý lỗi thì có khi hàng tiếng chẳng xong.
Viết code thì người ta viết trực tiếp vào cửa sổ VBE chứ ai lại soạn thảo trên Word nhỉ? Lở có sai cú pháp còn biết đường mà lần... Soạn trong Word thì có mà... chết

From Sa_DQ:

Viết trong cửa sổ VBE có nhiều cái lợi:
(*) Phát hiện giúp ta gỏ sai chính tả:
Ví dụ ta gỏ các dòng lệnh
dim GPe as string
gpe = [A8].address

thì sau khi {ENTER} kết thúc dòng lệnh thứ nhứt, thằng VBE sẽ sửa lại là:
Dim GPe As String

(Nếu ta thiếu hay thừa kí tự trong chuỗi string thì nó không chuyển thành String cho ta;
Như vậy, chỉ cần 1 liếc mắt là phát hiện ngay lỗi không đáng có & khó phát hiện)

Ở dòng lệnh thứ 2, khi ta nhấp dấu '.', cái thằng VBE thông minh đáo để này sẽ cung cấp cho ta 1 danh sách đỗ xuống các lựa chọn; Vừa í cho ta cái nào, ta chọn cái đó.

Sau khi nhấn {ENTER} kết thú`c dòng lệnh thứ 2, VBE sẽ sửa lại thành:
GPe = [A8].Address
. . . . .
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Vì mới chập chững bước vào VBA nên kiến thức của em còn kém. Mong nhờ anh dịch hộ em ý nghĩa của dòng này : Range("H" & i).Formula = Replace("=SUM(" & _
Cells(i + 1, 8).Address & ":" & Cells(R1, 8).Address & ")", "$", "")
PHP:
Range("H" & i).Formula = Replace("=SUM(" &  _
           Cells(i + 1, 8).Address & ":" & Cells(R1, 8).Address & ")", "$", "")[/QUOTE]
Đoạn này dùng để điền công thức Sum() vào ô thứ i của cột H. Hai cái .Address địa chỉ ô đầu và ô cuối của vùng tính tổng. Replace để loại các ký tự "$" ra vì tôi muốn kết quả là địa chỉ tương đối.
Bạn nên viết trực tiếp trên cửa sổ VBE. Kích hoạt chức năng Auto List Members và Auto Quick Info (Thường thì tự kích hoạt) sẽ giúp bạn lập trình nhanh hơn. Không nhớ kỹ từ khóa vẫn có thể viết được.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Range("H" & i).Formula = Replace("=SUM(" &  _
           Cells(i + 1, 8).Address & ":" & Cells(R1, 8).Address & ")", "$", "")
Đoạn này dùng để điền công thức Sum() vào ô thứ i của cột H. Hai cái .Address địa chỉ ô đầu và ô cuối của vùng tính tổng. Replace để loại các ký tự "$" ra vì tôi muốn kết quả là địa chỉ tương đối.
Thông thường ít ai dùng hàm Replace để thay đổi địa chỉ tương đối, tuyệt đối... vì Address Property còn có các tham số ở bên trong cho phép bạn tùy chỉnh ---> Chẳng hạn để loại bỏ dấu $ người ta hay dùng .Address(0,0)
Bạn có thể vào cửa sổ VBE, gõ chử Address, bôi đen nó rồi bấm F1 để biết thêm chi tiết
 
Upvote 0
Thông thường ít ai dùng hàm Replace để thay đổi địa chỉ tương đối, tuyệt đối... vì Address Property còn có các tham số ở bên trong cho phép bạn tùy chỉnh ---> Chẳng hạn để loại bỏ dấu $ người ta hay dùng .Address(0,0)
Bạn có thể vào cửa sổ VBE, gõ chử Address, bôi đen nó rồi bấm F1 để biết thêm chi tiết
Gà mà --=0. Vừa viết vừa mò. Ra được kết quả là mừng rồi |||||
 
Upvote 0
Nhờ các anh dịch hộ em thêm 3 dòng cuối

Em tập dịch đoạn Code trên để có thể lưu ứng dụng về sau nhưng khi dịch gần xong thì còn 3 ô cuối không thể dịch nổi. Mong các bác xem giúp em
 

File đính kèm

Upvote 0
[FONT=.VnTime]Anh cho em hái ®o¹n m· nµy ý nghÜa thÕ nµo anh nhØ R1 = R1 - IIf(Cells(i, 1) <> "", 1, 0) ®Æc biÖt lµ ch÷ b«i ®Ëm.[/FONT]

From Sa_DQ:
Bạn hãy dùng Font của diễn đàn & sửa lại câu viết đi cái!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
IIF : Là lệnh IF được dùng trong VBA nó tương ứng với cấu trúc IF(Logic,True,False). Cú pháp là:
IIF(Logic,True,False).
Câu lệnh nào bảo rằng R1 = R1 trừ đi [nếu ô Cells(i,1) khác rỗng, True = 1, False = 0]
Vậy ha!
 
Upvote 0
Bạn ấy hỏi ba dòng được đánh dấu như dưới đây

Bạn hỏi đoạn nào? Bạn nên Post đoạn code thẳng trên diễn đàn luôn. Như thế sẽ dễ xem hơn.

PHP:
 For i = [C65536].End(xlUp).Row To 6 Step -1 
2 If Cells(i, 3) = "" Then 
    Range("H" & i).Formula = Replace("=SUM(" &  _ 
           Cells(i + 1, 8).Address & ":" & Cells(R1, 8).Address & ")", "$", "") 
    R1 = i - 1 
    ElseIf Cells(i, 6) > 0 Then 
6    Range("H" & i).FormulaR1C1 = "=RC[-3]*RC[-2]" 
End If   '<=|'
8 R1 = R1 - IIf(Cells(i, 1) <> "", 1, 0)    '<=|'
Next   '<=|'

(*) Dòng lệnh thứ 7 Kết thúc điều kiện bắt đầu từ dòng thứ 2;

(*) Dòng lệnh 8 diễn dịch sang tiếng Việt như sau:
Nếu trị trong Cells(i, 1) khác rỗng thì gán R1-1 vô biến R1;
Ngược lại thì ta gán R1 vô R1 :-= . . -> (có nghĩa là vũ như cẩn)

(*) Kết thúc vòng lặp được bắt đầu từ dòng lệnh 1
 
Lần chỉnh sửa cuối:
Upvote 0
(a) Đua tốc độ
R1 = i - 1
Quả thực em không giải thích được dòng trên mong các bác giúp đỡ./.

(a) Đó là HuuThang_BD nói về macro của HThang sẽ chạy nhanh hơn của AnhPhuong
Rõ ràng sẽ nhanh hơn, vì cùng 1 số records như nhau, AnhPhuong duyệt đến ba lần cho ba tiêu chí cần tổng hợp;
Của HuuThang_BD chỉ duyệt có 1 lần;

Nhưng chưa hết, Vòng lặp lại không nhanh hơn phương thức tìm kiếm (FIND()) trong vòng lặp Do. . Loop (tại bài #6)
Vì lúc đó, VBA chỉ tìm những ô trống trong cột đó mà thôi;

Chúc bạn thành công.
 
Upvote 0
(a) Đó là HuuThang_BD nói về macro của HThang sẽ chạy nhanh hơn của AnhPhuong
Rõ ràng sẽ nhanh hơn, vì cùng 1 số records như nhau, AnhPhuong duyệt đến ba lần cho ba tiêu chí cần tổng hợp;
Của HuuThang_BD chỉ duyệt có 1 lần;

Nhưng chưa hết, Vòng lặp lại không nhanh hơn phương thức tìm kiếm (FIND()) trong vòng lặp Do. . Loop (tại bài #6)
Vì lúc đó, VBA chỉ tìm những ô trống trong cột đó mà thôi;

Chúc bạn thành công.
Thưa anh em vẫn chưa hiểu được ý của anh. Em muốn thắc mắc tại sao R1 = i - 1 ah?
 
Upvote 0
Thưa anh em vẫn chưa hiểu được ý của anh. Em muốn thắc mắc tại sao R1 = i - 1 ah?
cái này phải xét luôn cả dòng trên
PHP:
If Cells(i, 3) = "" Then
R1 = i - 1
Bạn cứ hiểu thế này: Nếu C55 = "" thì R1 = 54, Nếu C54 = "" thì R1 = 53...
Cái này liên quan đến thuật toán. Tùy từng bài toán cụ thê mà ta có những thuật toán khác nhau sao cho hiệu quả nhất.
 
Upvote 0
Web KT

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

Back
Top Bottom