Chỉnh sửa code tính Diễn giải Khối lượng trong Xây dựng

Liên hệ QC
các anh chị cho em hỏi công thức tính tổng của bảng diễn giải khối lượng sau trong excel
ví dụ ở cột diễn giải =2+2+4 thì em muốn cột tính tổng ra kết quả luôn là 9
em vẫn đang làm thủ công copy xong em đặt dấu = sau đó pates
xin anh chị hướng dẫn cụ thể vì em mù tịt không biết cái này
em xin chân thành cảm ơn
Bạn nên tạo Topic mới với tiêu đề rõ ràng, đính kèm file ví dụ, có kết quả mẫu mong muốn.
Nếu bạn chưa biết dùng code VBA hay ADO thì đừng hỏi trong các chuyên mục lập trình VBA hay ADO.
Tìm hỏi trong các chuyên mục Hàm và công thức Excel là được.
 
Bài này hay quá thầy SwisTom ơi, trước giờ em toàn dùng code và hàm evalua trên diễn đàn, nay có bài này thì tốt quá. Thầy cho em hỏi muốn các chuổi sao khi enter thành số và tính tổng như trong file đính kèm thì sửa code thế nào vậy thầy.

Rất cảm ơn code này rất đúng ý em. xong em test thấy lúc mình edit thì phải sửa lại và phải xoá đi kết quả và dấu bằng rất bất tiện. híc! cụ thể:
Khi đả đánh vào:
Móng M1: 1,2*2*3 -> enter ra: 1,2*2*3 = 7,2. Trong quá trình tính toán em edit thì:
- Nếu sửa: Móng M1: 1,1*2*3 (sửa "1,2"->1,1 và xóa "=7,2") thi ra kết quả đúng.
- Nếu sửa: Móng M1:1,1*2*3 = 7,2 thi hiển thị kết quả: Móng M1: 1,1*2*3 = 7,2 = 0,00 (sai) em muốn chi edit biểu thức thì nó tự replece kết quả được không?.
Chúc các bác sức khỏe!
 
Các bác giúp em với! file và code của em (sưu tầm tren diễn đàn GPE) đây:

Function FormatWithComma(ByVal number As Double) As String
Dim text As String, result As String
text = Format(2001 / 2, "#,##0.0")
result = Format(number, "#,##0.0##")
If Mid(text, 6, 1) = "," Then
FormatWithComma = Replace(result, Mid(text, 2, 1), ".")
Else
result = Replace(result, ".", "@")
result = Replace(result, Mid(text, 2, 1), ".")
FormatWithComma = Replace(result, "@", ",")
End If
End Function

Private Sub Worksheet_Change(ByVal Target As Range)
Dim expression As String, result As Double
If Not Intersect(Target, Range("D1:D10000")) Is Nothing Then
If Target.Count = 1 Then
If Target.Value <> "" Then
If InStr(Target, ":") > 0 Then
expression = Trim(Split(Target.Value, ":")(1))
Else
expression = Trim(Target.Value)
End If
expression = Replace(expression, ",", ".")
Application.EnableEvents = False
On Error GoTo end_
result = Evaluate(expression)
Target.Offset(, 2).Value = result
Target.Value = Trim(Target.Value) & " = " & FormatWithComma(result)

End If
End If
End If
end_:
Application.EnableEvents = True
End Sub
_______________________________________________________
Code trên còn tồn tại nhược điểm sau:
Khi đả đánh vào:
Móng M1: 1,2*2*3 -> enter ra: 1,2*2*3 = 7,2. Trong quá trình tính toán em edit thì:
- Nếu sửa: Móng M1: 1,1*2*3 (sửa "1,2"->1,1 và xóa "=7,2") thi ra kết quả đúng.
- Nếu sửa: Móng M1:1,1*2*3 = 7,2 thi hiển thị kết quả: Móng M1: 1,1*2*3 = 7,2 = 0,00 (sai) em muốn chi edit biểu thức thì nó tự replece kết quả được không?.
Chúc các bác sức khỏe!
 

File đính kèm

  • NHO HIEU CHINH CODE TINH DIEN GIAI KHOI LUONG.xlsm
    39.2 KB · Đọc: 37
Lần chỉnh sửa cuối:
Rất cảm ơn code này rất đúng ý em. xong em test thấy lúc mình edit thì phải sửa lại và phải xoá đi kết quả và dấu bằng rất bất tiện. híc! cụ thể:
Khi đả đánh vào:
Móng M1: 1,2*2*3 -> enter ra: 1,2*2*3 = 7,2. Trong quá trình tính toán em edit thì:
- Nếu sửa: Móng M1: 1,1*2*3 (sửa "1,2"->1,1 và xóa "=7,2") thi ra kết quả đúng.
- Nếu sửa: Móng M1:1,1*2*3 = 7,2 thi hiển thị kết quả: Móng M1: 1,1*2*3 = 7,2 = 0,00 (sai) em muốn chi edit biểu thức thì nó tự replece kết quả được không?.
Chúc các bác sức khỏe!
Code này của bác siwtom mình có thêm một số cái: chỉnh sửa công thức không cần xóa dấu "=", tô màu đỏ kết quả cho dễ nhìn. Nhưng còn 1 số vấn đề nhờ các anh giải quyết giúp:
1. khi nhập biểu thức -3+8 thì kết quả hiển thị là 5 = 5,0 ( đúng ra phải là -3+8 = 5,0)
2. nhập
4-3 hoặc 4/3 thì nó ra kết quả là ngày tháng năm (đúng ra phải là 4-3 = 1,0 hoặc 4/3 = 1,333.
Các vấn đề này thì có thể xử lý tạm thời bằng cách gõ dấu ' trước biểu thức thì ra kết chính xác, nhưng thấy không được tiện và dễ nhầm lẫn.

Mã:
Private Function FormatWithComma(ByVal number As Double) As String
Dim text As String, result As String
    text = Format(2001 / 2, "#,##0.0")
    result = Format(number, "#,##0.0##")
    If Mid(text, 6, 1) = "," Then
        FormatWithComma = Replace(result, Mid(text, 2, 1), ".")
    Else
        result = Replace(result, ".", "@")
        result = Replace(result, Mid(text, 2, 1), ".")
        FormatWithComma = Replace(result, "@", ",")
    End If
End Function

Private Sub Worksheet_Change(ByVal Target As Range)
Dim expression, ketqua, bieuthuc As String, result, result2 As Double
    If Not Intersect(Target, Range("A1:A10000")) Is Nothing Then
        If Target.Count = 1 Then
            If Target.Value <> "" Then
                If InStr(Target, "=") > 0 Then
                    ketqua = Trim(Split(Target.Value, "=")(1))
                    bieuthuc = Trim(Split(Target.Value, "=")(0))
                Else: bieuthuc = Target.Value
                End If
                If InStr(Target, ":") > 0 Then
                    'expression = Trim(Split(Target.Value, ":")(1))
                   expression = Trim(Split(bieuthuc, ":")(1))
                Else
                    'expression = Trim(Target.Value)
                   expression = Trim(bieuthuc)
                End If
                expression = Replace(expression, ",", ".")
                Application.EnableEvents = False
                On Error Resume Next
                result = Evaluate(expression)
                On Error Resume Next
                result2 = Evaluate(ketqua)
                If result = 0 Then
                    If result2 <> 0 Then
                    Target.Value = "'" & Trim(bieuthuc)
                    End If
                Else
                    Target.Value = "'" & Trim(bieuthuc) & " = " & FormatWithComma(result)
                    Target.Characters(1, InStr(Target, "=")).Font.Color = xlThemeColorLight2
                    Target.Characters(InStr(Target, "=") + 1).Font.Color = -16776961
                End If
            End If
        End If
    End If
end_:
    Application.EnableEvents = True
End Sub
 

File đính kèm

  • TinhKL.xls
    38 KB · Đọc: 104
Lần chỉnh sửa cuối:
Sao mình lưu code vào mà không chạy nhỉ. Bấm Alt+F11 lưu dưới dạng Addin. Cả nhà giúp mình với. Khi nhập diễn giải và công thức enter thì không ra kết quả.
 
Sao mình lưu code vào mà không chạy nhỉ. Bấm Alt+F11 lưu dưới dạng Addin. Cả nhà giúp mình với. Khi nhập diễn giải và công thức enter thì không ra kết quả.
Ý bạn nói đến bài # nào nhỉ?
Tại sao lại phải bấm Alt+F11 thì mới lưu được add in nhỉ?
Ví dụ code ở #64 không thể lưu thành dạng add in được mà chỉ code sẽ tính toán sau mỗi lần cập nhật dữ liệu thay đổi (theo tôi là vậy).
 
Chào bác Lê Văn. Ý em hỏi code của bác và bác Siwtom thảo luận ấy. Em thấy hay quá nhưng khi e lưu dưới dạng addin thì không được. Bác chỉ cụ thể em cách sử dụng được không?
 
Code ở #34 bác nhé. Bác giúp đỡ. Em đi dạo này mới sang nghiên cứu đánh đấm mấy món này nên cũng gà quá.
 
Chào bác Lê Văn. Ý em hỏi code của bác và bác Siwtom thảo luận ấy. Em thấy hay quá nhưng khi e lưu dưới dạng addin thì không được. Bác chỉ cụ thể em cách sử dụng được không?
Bạn đọc bài #66 của tôi chưa? Code tại #34 cũng tương tự code #64 mà tôi nói tới.
 
Bác nói là không lưu dưới dạng addin nhưng ý em hỏi làm cách nào để lưu code và sử dụng được code này để khi ta diễn giải khối lượng thì nó sẽ tự động ra kết quả. Em không làm được. Mong bác giúp
 
Bác nói là không lưu dưới dạng addin nhưng ý em hỏi làm cách nào để lưu code và sử dụng được code này để khi ta diễn giải khối lượng thì nó sẽ tự động ra kết quả. Em không làm được. Mong bác giúp
Thì đúng là code ở các bài trên đang là tự động nhảy ra kết quả nếu nhập xong dữ liệu và Enter.
Tất nhiên là bạn phải biết Enable marco để marco chạy.Lưu file dưới dạng .xls hay .xlsm
Còn việc copy code thì bạn cứ quét chọn/nhấn Copy/vào excel nhấn Alt+F11/Insert module/dán code vào là CHẠY.
Tôi chỉ làm như vậy thôi, không có gì cao siêu cả!
 
Cũng không hẳn như thế anh Văn à. Em thì chưa hiểu nhiều về vấn đề này nên hơi khó khăn. Mà bác cho em hỏi thêm mỗi lần diễn giải khối lượng đều phải copy code vào như thế này à? Không thể lưu vào và mở file nào lên cũng dùng được luôn à bác?
 
Cũng không hẳn như thế anh Văn à. Em thì chưa hiểu nhiều về vấn đề này nên hơi khó khăn. Mà bác cho em hỏi thêm mỗi lần diễn giải khối lượng đều phải copy code vào như thế này à? Không thể lưu vào và mở file nào lên cũng dùng được luôn à bác?
Theo tôi thì muốn lưu thành add in thì phải là 1 hàm nào đó. Còn đây là sự kiện thay đổi sau mỗi lần nhấn Enter.
Không những phải copy code mà còn phải điều chỉnh cột tính toán nữa.
 
Code này của bác siwtom mình có thêm một số cái: chỉnh sửa công thức không cần xóa dấu "=", tô màu đỏ kết quả cho dễ nhìn. Nhưng còn 1 số vấn đề nhờ các anh giải quyết giúp:
1. khi nhập biểu thức -3+8 thì kết quả hiển thị là 5 = 5,0 ( đúng ra phải là -3+8 = 5,0)
2. nhập
4-3 hoặc 4/3 thì nó ra kết quả là ngày tháng năm (đúng ra phải là 4-3 = 1,0 hoặc 4/3 = 1,333.
[/CODE]
Bạn xem file đính kèm (cũng từ code trong những bài ở trên, bổ sung tí chút) giải quyết được vấn đề của Bạn:
 

File đính kèm

  • _MauTinhKhoiLuong.xls
    28.5 KB · Đọc: 94
Lần chỉnh sửa cuối:
Cũng không hẳn như thế anh Văn à. Em thì chưa hiểu nhiều về vấn đề này nên hơi khó khăn. Mà bác cho em hỏi thêm mỗi lần diễn giải khối lượng đều phải copy code vào như thế này à? Không thể lưu vào và mở file nào lên cũng dùng được luôn à bác?
Bạn có thể Xoá hết diễn giải rồi lưu file dưới dạng template. Mỗi lầm mở lên thì làm và nó sẽ không ghi đè lên file template của Bạn.
 
Ý của anh Trần Hòe là lưu dưới dạng template thì mỗi lần mở 1 file excel bất kỳ thì sẽ dùng được luôn à a? có đưa vào addin không a? e vẫn chưa hiểu lắm. Mong a hồi âm sớm.
 
Ý của anh Trần Hòe là lưu dưới dạng template thì mỗi lần mở 1 file excel bất kỳ thì sẽ dùng được luôn à a? có đưa vào addin không a? e vẫn chưa hiểu lắm. Mong a hồi âm sớm.
Bạn cứ thử trên máy bạn những thao tác như a Hòe hướng dẫn đi.
 
Ý của anh Trần Hòe là lưu dưới dạng template thì mỗi lần mở 1 file excel bất kỳ thì sẽ dùng được luôn à a? có đưa vào addin không a? e vẫn chưa hiểu lắm. Mong a hồi âm sớm.
Đọc lại giáo trình Excel. Phân biệt addins và template.
Như vanle33 đã trả lời: muốn lưu thành addins (trong E2003 có phần mở rộng là xla) thì phải là 1 hàm nào đó. Còn đây là sự kiện thay đổi sau mỗi lần nhấn Enter.
Còn template (trong E2003 có phần mở rộng là xlt) là file mẫu có chứa những định dạng cần thiết phục vụ cho công việc. Mỗi lần mở lên thì tự tạo file mới chứ không ghi đè lên file mẫu.
 
Web KT
Back
Top Bottom