Dùng VBA để lập bảng tiên lượng trong excel

Liên hệ QC

minhcong.tckt

Thành viên thường trực
Tham gia
13/4/11
Bài viết
385
Được thích
36
Giới tính
Nam
Giả sử tại
ô E1, trong excel em có công hàm sau:
2*10,35*3,3
Và cột E2 em có chuỗi sau:
Tam cấp: 10,35*0,15*0,3*3

Nhờ anh chị viết đoạn code VBA để sau khi em để dấu bằng đằng sau hàm và chuỗi trên thì có kết quả tại ô e1, e2 tương ứng như sau:
2*10,35*3,3 = 68,31
Tam cấp: 10,35*0,15*0,3*3 = 1,3973
Và cột F1, F2 chỉ có kết quả tương ứng như sau
68,31
1,3973
 

File đính kèm

  • Tienluong.xlsx
    12 KB · Đọc: 16
Lần chỉnh sửa cuối:
Giả sử tại
ô E1, trong excel em có công hàm sau:
2*10,35*3,3
Và cột E2 em có chuỗi sau:
Tam cấp: 10,35*0,15*0,3*3

Nhờ anh chị viết đoạn code VBA để sau khi em để dấu bằng đằng sau hàm và chuỗi trên thì có kết quả tại ô e1, e2 tương ứng như sau:
2*10,35*3,3 = 68,31
Tam cấp: 10,35*0,15*0,3*3 = 1,3973
Và cột F1, F2 chỉ có kết quả tương ứng như sau
68,31
1,3973
Anh tự viết đi chứ 1 cây VBA rồi còn nhờ vả gì nữa
 
Upvote 0
Mình viết không nổi nên mới nhờ anh chị trên diễn đàn giúp sức
bạn giúp được thì giúp mình luôn đi
 
Upvote 0

File đính kèm

  • Tienluong.xlsm
    24.4 KB · Đọc: 42
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn nhiều nha, đúng ý của mình rồi
 
Upvote 0
Upvote 0
Upvote 0
Vẫn file này mình tải về và kiểm tra dòng trên thì sai mà dòng dưới thì đúng. bạn chỉ mình cách là giờ mình thay cột D, F bằng cột khác thì chỉnh ở đâu vậy.
Cái Code nó vầy nha
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Str1 As String, Str As String, Numb As Double
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("E6:E65500")) Is Nothing Then
    If InStr(Target, "=") > 0 Then
        Str1 = " " & Trim(Split(Target.Value, "=")(0))
    Else
        Str1 = " " & Trim(Target.Value)
    End If
    If InStr(Str1, ":") > 0 Then
        Str = Trim(Split(Str1, ":")(1))
    Else
        Str = Trim(Str1)
    End If
    Application.EnableEvents = False
    On Error GoTo Thoat
    Numb = Khoiluong(Str)
    Target.Value = Str1 & " = " & Format(Numb, "0.000")
    Target.Offset(, 1).Value = Format(Numb, "0.000")
    With Target.Characters(InStr(Target, "=") + 1).Font
        .FontStyle = "Bold Italic"
        .ColorIndex = 5
    End With
End If
Thoat:
Application.EnableEvents = True
End Sub
Cái vùng Range("E6:E65500") là vùng chạy sự kiện. Bạn thích nó chạy trên cột nào thì thay vào
Còn cái kết quả Target.Offset(, 1) là dòng đang đứng lấy sang bên phải 1 dòng. Bạn muốn ghi ở dòng nào thì đếm từ ô diễn giải sang phải mấy ô thi thay vào (Trái âm, phải dương nha Bạn)
 
Upvote 0
Cái Code nó vầy nha
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Str1 As String, Str As String, Numb As Double
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("E6:E65500")) Is Nothing Then
    If InStr(Target, "=") > 0 Then
        Str1 = " " & Trim(Split(Target.Value, "=")(0))
    Else
        Str1 = " " & Trim(Target.Value)
    End If
    If InStr(Str1, ":") > 0 Then
        Str = Trim(Split(Str1, ":")(1))
    Else
        Str = Trim(Str1)
    End If
    Application.EnableEvents = False
    On Error GoTo Thoat
    Numb = Khoiluong(Str)
    Target.Value = Str1 & " = " & Format(Numb, "0.000")
    Target.Offset(, 1).Value = Format(Numb, "0.000")
    With Target.Characters(InStr(Target, "=") + 1).Font
        .FontStyle = "Bold Italic"
        .ColorIndex = 5
    End With
End If
Thoat:
Application.EnableEvents = True
End Sub
Cái vùng Range("E6:E65500") là vùng chạy sự kiện. Bạn thích nó chạy trên cột nào thì thay vào
Còn cái kết quả Target.Offset(, 1) là dòng đang đứng lấy sang bên phải 1 dòng. Bạn muốn ghi ở dòng nào thì đếm từ ô diễn giải sang phải mấy ô thi thay vào (Trái âm, phải dương nha Bạn)
Cảm ơn bạn nhiều nhé!.
 
Upvote 0
Cái Code nó vầy nha
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Str1 As String, Str As String, Numb As Double
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("E6:E65500")) Is Nothing Then
    If InStr(Target, "=") > 0 Then
        Str1 = " " & Trim(Split(Target.Value, "=")(0))
    Else
        Str1 = " " & Trim(Target.Value)
    End If
    If InStr(Str1, ":") > 0 Then
        Str = Trim(Split(Str1, ":")(1))
    Else
        Str = Trim(Str1)
    End If
    Application.EnableEvents = False
    On Error GoTo Thoat
    Numb = Khoiluong(Str)
    Target.Value = Str1 & " = " & Format(Numb, "0.000")
    Target.Offset(, 1).Value = Format(Numb, "0.000")
    With Target.Characters(InStr(Target, "=") + 1).Font
        .FontStyle = "Bold Italic"
        .ColorIndex = 5
    End With
End If
Thoat:
Application.EnableEvents = True
End Sub
Cái vùng Range("E6:E65500") là vùng chạy sự kiện. Bạn thích nó chạy trên cột nào thì thay vào
Còn cái kết quả Target.Offset(, 1) là dòng đang đứng lấy sang bên phải 1 dòng. Bạn muốn ghi ở dòng nào thì đếm từ ô diễn giải sang phải mấy ô thi thay vào (Trái âm, phải dương nha Bạn)
Mình chạy thử thì thấy sao cột F lại cho dấu "." và "," sai bạn nhỉ.
 

File đính kèm

  • Tienluong1.xlsm
    22 KB · Đọc: 8
Upvote 0
Upvote 0
Upvote 0
Upvote 0
Giả sử tại
ô E1, trong excel em có công hàm sau:
2*10,35*3,3
Và cột E2 em có chuỗi sau:
Tam cấp: 10,35*0,15*0,3*3

Nhờ anh chị viết đoạn code VBA để sau khi em để dấu bằng đằng sau hàm và chuỗi trên thì có kết quả tại ô e1, e2 tương ứng như sau:
2*10,35*3,3 = 68,31
Tam cấp: 10,35*0,15*0,3*3 = 1,3973
Và cột F1, F2 chỉ có kết quả tương ứng như sau
68,31
1,3973
Giả thiết:
1. giữa ":" và "=" chỉ có biểu thức, không có gì khác. Nếu không có : thì trước biểu thức chỉ cho phép ký tự space. Nếu không có = thì sau biểu thức chỉ cho phép space.

2. Trong biểu thức cho phép space nhưng không cho phép bất cứ ký tự nào ngoài: chữ số, dấu chấm, dấu phẩy, +, -, *, :, (, ). vd. không cho phép m, m². Bởi nếu chấp nhận chúng thì sẽ phải chấp nhận các chuỗi bất kỳ, thậm chí đan xen nhau, kiểu như sáng kiến: m³, lọ, thùng, hộp, gói, kg, tấn, thửa, cây ... Thôi thì đủ loại bất kỳ.

Nếu chấp nhận giả thiết thì đọc tiếp. Không chấp nhận thì dừng tại đây.

Trong biểu thức có thể dùng dấu phẩy hoặc chấm làm dấu thập phân. Thậm chí trong cùng biểu thức số này có dấu chấm, số kia có dấu phẩy. Nhưng kết quả luôn có dấu thập phân được thiết lập trong CP của system.
Mã:
Function TinhBT(ByVal bieu_thuc As String) As Double
Dim k As Long
    Application.Volatile
    bieu_thuc = Mid(bieu_thuc, InStr(1, bieu_thuc, ":") + 1)
    k = InStr(1, bieu_thuc, "=")
    If k Then bieu_thuc = Left(bieu_thuc, k - 1)
    bieu_thuc = Replace(bieu_thuc, ",", ".")
    TinhBT = Evaluate(bieu_thuc)
End Function

vd. cách dùng
Mã:
=tinhbt(E7)
 
Upvote 0
Hình như lệnh volatile trong hàm này thừa phải không bác @batman1. Em nghĩ có thể bỏ đi cho nhẹ.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom