Nhờ giúp em viết code VBA tính cột thành tiền và link đơn giá

Liên hệ QC

sondaubac

Thành viên hoạt động
Tham gia
14/10/08
Bài viết
168
Được thích
28
Nhờ các thầy, các anh trên GPE giúp em viết 1 đoạn code VBA để link công thức như sau:

Em đã tính toán ra kết quả, nhưng cứ ngồi link bằng tay thấy bất tiện quá, mong mọi người viết dùm em 1 đoạn CODE để tính các nội dung sau:

1/ Tính cột thành tiền dựa vào:
Định mức * Đơn giá
Riêng vật liệu khác và máy khác thì tính bằng % của thành tiền các loại vật liệu ở trên

2/ Link kết quả của đơn giá từng hạng mục

Em xin chân thành cảm ơn!
 

File đính kèm

  • Hoi Code VBA 3.xls
    157.5 KB · Đọc: 39
Lần chỉnh sửa cuối:
Đây là tổng thể mong muốn của mình

1/ Bước 1: Tạo 1 số hạng mục công việc với định mức sẵn có ở sheet DATA

2/ Bước 2: Vào sheet KHỐI LƯỢNG nhập mã hiệu để nhập dữ liệu đầu vào gồm: mã hiệu, tên hạng mục, ĐVT và Khối lượng

3/ Bước 3: Làm việc với Sheet PHÂN TÍCH VẬT TƯ để đưa dữ liệu của từng hạng mục công việc từ DATA sang. Bên PHÂN TÍCH VẬT TƯ thì chỉ cần thể hiện định mức và khối lượng hao phí cho toàn công trình (không tính cho vật liệu khác và máy khác), không cần thể hiện đơn giá và thành tiền.

4/ Bước 4: Căn cứ vào phân tích vật tư để tính toán công trình gồm bao nhiêu loại vật tư và Cập nhật đơn giá thực tế và tự link số liệu vào ĐƠN GIÁ CHI TIẾT

5/ Bước 5: Qua sheet DỰ TOÁN xuất kết quả đơn giá và thành tiền cho toàn bộ công trình

Rất mong nhận được sự hỗ trợ của các thầy và các bạn. Cảm ơn mọi người đã quan tâm giúp đỡ!
 

File đính kèm

  • Hoi Code VBA 10.xls
    4.9 MB · Đọc: 22
Lần chỉnh sửa cuối:
Upvote 0
Đây là tổng thể mong muốn của mình

1/ Bước 1: Tạo 1 số hạng mục công việc với định mức sẵn có ở sheet DATA

2/ Bước 2: Vào sheet KHỐI LƯỢNG nhập mã hiệu để nhập dữ liệu đầu vào gồm: mã hiệu, tên hạng mục, ĐVT và Khối lượng

3/ Bước 3: Làm việc với Sheet PHÂN TÍCH VẬT TƯ để đưa dữ liệu của từng hạng mục công việc từ DATA sang. Bên PHÂN TÍCH VẬT TƯ thì chỉ cần thể hiện định mức và khối lượng hao phí cho toàn công trình (không tính cho vật liệu khác và máy khác), không cần thể hiện đơn giá và thành tiền.

4/ Bước 4: Căn cứ vào phân tích vật tư để tính toán công trình gồm bao nhiêu loại vật tư và Cập nhật đơn giá thực tế và tự link số liệu vào ĐƠN GIÁ CHI TIẾT

5/ Bước 5: Qua sheet DỰ TOÁN xuất kết quả đơn giá và thành tiền cho toàn bộ công trình

Rất mong nhận được sự hỗ trợ của các thầy và các bạn. Cảm ơn mọi người đã quan tâm giúp đỡ!
Quan trọng là Bác muốn làm gì vậy. Tách vật tư cho công trình hay làm gì ... Bác nói ở trên em không hiểu
 
Upvote 0
Quan trọng là Bác muốn làm gì vậy. Tách vật tư cho công trình hay làm gì ... Bác nói ở trên em không hiểu
Là lập 1 dự toán đơn giản, căn cứ vào dữ liệu đầu vào ở Sheet DATA.
1/ Bước đầu tiên là mình sẽ lập trong DATA bao nhiêu hạng mục công việc
2/ Sau đó sang sheet KHỐI LƯỢNG nhập mã hiệu để nhập dữ liệu đầu vào của công trình lựa chọn : mã hiệu, tên hạng mục, ĐVT và Khối lượng từ sheet DATA
3/ Bước 3: PHÂN TÍCH VẬT TƯ
4/ Tổng hợp vật tư (Bổ sung thêm bước này)
5/ Tính Đơn giá chi tiết của từng hạng mục công việc của toàn công trình
6/ Xuất kết quả sheet DỰ TOÁN
 
Upvote 0
Là lập 1 dự toán đơn giản, căn cứ vào dữ liệu đầu vào ở Sheet DATA.
1/ Bước đầu tiên là mình sẽ lập trong DATA bao nhiêu hạng mục công việc
2/ Sau đó sang sheet KHỐI LƯỢNG nhập mã hiệu để nhập dữ liệu đầu vào của công trình lựa chọn : mã hiệu, tên hạng mục, ĐVT và Khối lượng từ sheet DATA
3/ Bước 3: PHÂN TÍCH VẬT TƯ
4/ Tổng hợp vật tư (Bổ sung thêm bước này)
5/ Tính Đơn giá chi tiết của từng hạng m
Vậy thì dùng phần mềm Dự toán cho nó nhanh. Lập lại làm gì cho nó đau đầu ra Bác.
 
Upvote 0
Không, phần mềm dự toán mình có rồi, tuy nhiên khi chưa đáp ứng được yêu cầu của mình. Nên toàn phải copy ra và làm thủ công những việc đó đó bạn. Bởi vì các hạng mục của mình là phải tự lập ra, không theo định mức của nhà nước mà
 
Upvote 0
Không, phần mềm dự toán mình có rồi, tuy nhiên khi chưa đáp ứng được yêu cầu của mình. Nên toàn phải copy ra và làm thủ công những việc đó đó bạn. Bởi vì các hạng mục của mình là phải tự lập ra, không theo định mức của nhà nước mà
Vậy à. Để khi nào em rảnh thử xem. Em mấy lần mò mày cái này nhưng nhức đầu quá nên thôi :D
 
Upvote 0
Vậy à. Để khi nào em rảnh thử xem. Em mấy lần mò mày cái này nhưng nhức đầu quá nên thôi :D
Vậy làm từng bước được không PacificPR, vừa làm vừa hướng dẫn mình cách viết CODE với. Còn yêu cầu về cách làm thì mình nắm rõ.
Mình sẽ lập từng bước, bắt đầu từ Bước số 1
Bước 1: là tạo định mức trong DATA (Có thể thay đổi nội dung bằng cách chèn thêm dòng), cái này coi như mình đã tạo ra rồi. Có lẽ phải chèn thêm dòng để tính riêng 2 loại mã hiệu.
1/ Một là: Mã hiệu công việc
2/ Hai là: Mã hiệu vật tư (gồm mã của Vật tư, Nhân Công, Máy)
Sau đó tạo 1 Form nhập dữ liệu đầu vào ở Sheet KHỐI LƯỢNG để lấy mã hiệu, đơn vị và nhập khối lượng.
 
Upvote 0
Bước 1: Làm theo mẫu này nha bạn. Tạo 1 Form để nhập dữ liệu đầu vào bằng cách:

1/ chọn mã hiệu để tự hiện ra STT, tên hạng mục, ĐVT (DATA List lấy ở sheet DATA)
2/ Rồi nhập vào cột E: Khối lượng của hạng mục công việc đó
(Mình mới update để rõ hơn)
 

File đính kèm

  • PMDuToanB1.xls
    89 KB · Đọc: 40
Lần chỉnh sửa cuối:
Upvote 0
Mình chỉnh sửa lại File rồi, Nhờ Pacific giúp đỡ viết dùm mình 1 đoạn CODE nhỏ link chỗ này với
 

File đính kèm

  • Link DonGia VL NC MTC.jpg
    Link DonGia VL NC MTC.jpg
    375.8 KB · Đọc: 24
  • Link DonGia VL NC MTC.xls
    2.5 MB · Đọc: 41
Lần chỉnh sửa cuối:
Upvote 0
Mình chỉnh sửa lại File rồi, Nhờ Pacific giúp đỡ viết dùm mình 1 đoạn CODE nhỏ link chỗ này với
Bác chạy thử Code này xem
PHP:
Sub Dongia_VL_NC_MTC()
    Dim sArr, dArr(), I As Long, Ihm As Long, Er As Long
    Dim VL As String, NC As String, MTC As String, Ivl As Long, Inc As Long, Im As Long
With Sheets("DGCT")
    VL = .Range("K6"): NC = .Range("L6"): MTC = .Range("M6")
    sArr = .Range("A7:A" & .Range("C65535").End(3).Row).Resize(, 10).Value
    ReDim dArr(1 To UBound(sArr), 1 To 3)
    For I = 1 To UBound(sArr)
        If sArr(I, 2) = Empty Then
            If sArr(I, 4) = VL Then Ivl = I + 6
            If sArr(I, 4) = NC Then Inc = I + 6
            If sArr(I, 4) = MTC Then Im = I + 6
        End If
        If sArr(I, 2) <> Empty Then Ihm = I
        If Ivl Then
            dArr(Ihm, 1) = "=" & .Range("J" & Ivl).Address:            Ivl = 0
        End If
        If Inc Then
            dArr(Ihm, 2) = "=" & .Range("J" & Inc).Address:            Inc = 0
        End If
        If Im Then
            dArr(Ihm, 3) = "=" & .Range("J" & Im).Address:            Im = 0
        End If
    Next I
    Er = .Range("D65535").End(3).Row
    .Range("K7:M" & Er + 1).ClearContents
    .Range("K7").Resize(I - 1, 3) = dArr
End With
End Sub
 
Upvote 0
Bác chạy thử Code này xem
PHP:
Sub Dongia_VL_NC_MTC()
    Dim sArr, dArr(), I As Long, Ihm As Long, Er As Long
    Dim VL As String, NC As String, MTC As String, Ivl As Long, Inc As Long, Im As Long
With Sheets("DGCT")
    VL = .Range("K6"): NC = .Range("L6"): MTC = .Range("M6")
    sArr = .Range("A7:A" & .Range("C65535").End(3).Row).Resize(, 10).Value
    ReDim dArr(1 To UBound(sArr), 1 To 3)
    For I = 1 To UBound(sArr)
        If sArr(I, 2) = Empty Then
            If sArr(I, 4) = VL Then Ivl = I + 6
            If sArr(I, 4) = NC Then Inc = I + 6
            If sArr(I, 4) = MTC Then Im = I + 6
        End If
        If sArr(I, 2) <> Empty Then Ihm = I
        If Ivl Then
            dArr(Ihm, 1) = "=" & .Range("J" & Ivl).Address:            Ivl = 0
        End If
        If Inc Then
            dArr(Ihm, 2) = "=" & .Range("J" & Inc).Address:            Inc = 0
        End If
        If Im Then
            dArr(Ihm, 3) = "=" & .Range("J" & Im).Address:            Im = 0
        End If
    Next I
    Er = .Range("D65535").End(3).Row
    .Range("K7:M" & Er + 1).ClearContents
    .Range("K7").Resize(I - 1, 3) = dArr
End With
End Sub
Cảm ơn bạn nhé! Bạn có thể giải thích thêm thuật toán trong đoạn CODE được không? Giúp mình với
 
Upvote 0
Hình thù nó như thế nào?
Trong bài đó Sơn bảo viết code tính cho cái vùng màu vàng thì code mình tính cho vùng màu vàng rồi đó.
Nhưng mà khi xóa dữ liệu đi thì nó tính không được a ơi. Em đang cố hoàn thiện mấy thứ rồi sẽ up lên, cho mọi người test thử :)
 
Upvote 0
Cảm ơn bạn nhé! Bạn có thể giải thích thêm thuật toán trong đoạn CODE được không? Giúp mình với
Cái này có thuật toán gì đâu anh. Nó chỉ như thế này thôi
PHP:
Sub Dongia_VL_NC_MTC()
    Dim sArr, dArr(), I As Long, Ihm As Long, Er As Long
    Dim VL As String, NC As String, MTC As String, Ivl As Long, Inc As Long, Im As Long
With Sheets("DGCT")
    VL = .Range("K6"): NC = .Range("L6"): MTC = .Range("M6")
    sArr = .Range("A7:A" & .Range("C65535").End(3).Row).Resize(, 10).Value  ' Tạo 1 mảng sArr
    ReDim dArr(1 To UBound(sArr), 1 To 3)              ' Khai báo mảng dArr có số hàng bằng hàng mảng sArr, số cột bằng  3
    For I = 1 To UBound(sArr)                         ' Chạy từ hàng 1 đến hàng cuối của mảng sArr
        If sArr(I, 2) = Empty Then                        ' Khi ô cột B không có giá trị
            If sArr(I, 4) = VL Then Ivl = I + 6          ' Nếu dòng nào của cột D ="a.) Vật liệu"  thì ghi lại 1 cái Ivl =I hàng đó
            If sArr(I, 4) = NC Then Inc = I + 6        ' Nếu dòng nào của cột D  ="b.) Nhân công"  thì ghi lại 1 cái Inc =I hàng đó
            If sArr(I, 4) = MTC Then Im = I + 6       ' Nếu dòng nào của cột D ="c.) Máy thi công"  thì ghi lại 1 cái Im=I hàng đó
        End If
        If sArr(I, 2) <> Empty Then Ihm = I          ' Nếu dòng nào có dữ liệu thì ghi lại Ihm=I
        If Ivl Then
            dArr(Ihm, 1) = "=" & .Range("J" & Ivl).Address:            Ivl = 0
' Khi có Ivl gán vào mảng dArr với vị trí là Ihm và cột là 1, sau đó gán lại Ivl=0 (trả lại ban đầu)
        End If
        If Inc Then
            dArr(Ihm, 2) = "=" & .Range("J" & Inc).Address:            Inc = 0
' Khi có Inc gán vào mảng dArr với vị trí là Ihm và cột là 2, sau đó gán lại Inc=0 (trả lại ban đầu)
        End If
        If Im Then
            dArr(Ihm, 3) = "=" & .Range("J" & Im).Address:            Im = 0
' Khi có Im gán vào mảng dArr với vị trí là Ihm và cột là 3, sau đó gán lại Im=0 (trả lại ban đầu)
        End If
    Next I
    Er = .Range("D65535").End(3).Row     'Xác định dòng cuối có dữ liệu của cột D
    .Range("K7:M" & Er + 1).ClearContents   'Xóa dữ liệu cũ từ K7 đến M có dữ liệu
    .Range("K7").Resize(I - 1, 3) = dArr      'Gán dữ liệu xuống bảng tính
End With
End Sub
 
Upvote 0
Em sửa lại theo gợi ý của anh @befaint :D
Mã:
Sub Dongia_VL_NC_MTC()
    Dim sArr, dArr(), I As Long, Ihm As Long, Er As Long
    Dim VL As String, NC As String, MTC As String, Ivl As Long, Inc As Long, Im As Long
With Sheets("DGCT")
    VL = .Range("K6"): NC = .Range("L6"): MTC = .Range("M6")
    Er = .Range("C65535").End(3).Row
    If Er < 7 Then GoTo Thoat
    sArr = .Range("A7:A" & Er).Resize(, 10).Value
    ReDim dArr(1 To UBound(sArr), 1 To 3)

    For I = 1 To UBound(sArr)
        If sArr(I, 2) = Empty Then
            If sArr(I, 4) = VL Then Ivl = I + 6
            If sArr(I, 4) = NC Then Inc = I + 6
            If sArr(I, 4) = MTC Then Im = I + 6
        End If
        If sArr(I, 2) <> Empty Then Ihm = I
        If Ivl Then
            dArr(Ihm, 1) = "=" & .Range("J" & Ivl).Address: Ivl = 0
        End If
        If Inc Then
            dArr(Ihm, 2) = "=" & .Range("J" & Inc).Address: Inc = 0
        End If
        If Im Then
            dArr(Ihm, 3) = "=" & .Range("J" & Im).Address: Im = 0
        End If
   
    Next I
    Er = .Range("D65535").End(3).Row
    .Range("K7:M" & Er + 1).ClearContents
    .Range("K7").Resize(I - 1, 3) = dArr
End With
Thoat:
End Sub
 
Upvote 0
Web KT
Back
Top Bottom