Lập trình sự kiện khi nhấn Enter tự động tính toán theo hàm tự lập

Liên hệ QC

hieuxd

Thành viên tích cực
Tham gia
27/5/09
Bài viết
854
Được thích
1,160
Nghề nghiệp
Xây Dựng
Em có theo dõi một chủ đề tính khối lượng dựa vào biểu thức nhập nhưng chủ Top đã kết cảm ơn rồi
Vấn đề em cần mọi người giúp là:
Trong cột E là biểu thức dùng để tính toán
Cột N là kết quả tinhtoan của hàm tính toán tinhtoan(En)
Coi như hàm tinhtoan đã lập là đúng
Em muốn khi kết quả hàm tinhtoan bên cột N tính với biểu thức cột E khác 0 thì cột e tự nhận hàm Tinhtoan(En) trong khi tại cột N dòng Nn em không nhập hàm Tinhtoan(En)
Khi kết quả hàm Tinhtoan(En) =#VALUE! thì cột N dòng n để trống
En là cột E dòng n khi nhấn Enter tại cột E dòng n
 

File đính kèm

  • Tinhtoan Tu Dong.rar
    23.4 KB · Đọc: 21
Lần chỉnh sửa cuối:
Anh đưa việc gán công thức vào sự kiện Worksheet_Change nếu có cần kiểm tra thì cũng cho luôn vào sự kiện đó để bắt lỗi là được
 
Upvote 0
Anh đưa việc gán công thức vào sự kiện Worksheet_Change nếu có cần kiểm tra thì cũng cho luôn vào sự kiện đó để bắt lỗi là được

Cảm ơn Dhn46 quả thật mình mới chỉ học và tìm hiểu qua về lập trình sự kiện có một buổi ở lớp VBA Hà Nội nên chưa làm được việc này
Mong bạn Áp code vào File giúp lần sau mình sẽ vận dụng được
 
Upvote 0
Theo em anh nên bắt lỗi tại cột F, vì khi cần gán công thức thì cột F sẽ trống. Code có dạng sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 Then
        If Target <> 0 Then
            If Target.Offset(, 1) = "" Then
                Target.Offset(, 9) = "=tinhtoan(" & Target.Address & ")"
            End If
        End If
    End If
End Sub
 
Upvote 0
Theo em anh nên bắt lỗi tại cột F, vì khi cần gán công thức thì cột F sẽ trống. Code có dạng sau
[/code]
Đa phần là khi gán công thức thì cột F sẽ trống thật
Trường hợp Cột F trống thì Code của Bạn chạy tốt
Mình muốn khi cột F cột Đơn vị vẫn có dữ liệu đơn vị nhưng vẫn tính được tự động
Khi có nhiều biểu thức tính thì sẽ xuống dòng và nhập biểu thức
Khi biểu thức ngắn thì mình vẫn nhập nội dung và biểu thức cùng đơn vị trên một dòng
VD: Đào móng: 2*4*1,5 m 12
Khi biểu thức và dòng nội dung cùng dòng có đơn vị tính bên cạnh luôn thì
 
Upvote 0
Theo em anh nên bắt lỗi tại cột F, vì khi cần gán công thức thì cột F sẽ trống. Code có dạng sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 Then
        If Target <> 0 Then
            If Target.Offset(, 1) = "" Then
                Target.Offset(, 9) = "=tinhtoan(" & Target.Address & ")"
            End If
        End If
    End If
End Sub

Theo mình thì vẫn còn chút gì đó chưa ổn thiếu điều kiện gì ấy Vì
Theo nguyên lý nhập từ trái qua phải từ trên xuống dưới như vậy
Khi nhập biểu thức hay nội dung ở cột E thì cột F của tất cả các dòng đều là trống
như vậy khi nhập cột E thì cột N đều đã chạy sự kiện ấy trước rồi
Sau đó mình nhập tiếp cột F đơn vị thì cột N vẫn còn hàm đã chạy sự kiện trước
Cho dù nhập dữ liệu cột F thì cột N vẫn có nỗi #VALUE!
Nói vui: Hay Dhn46 bảo mình nhập dữ liệu cột F trước rồi nhập dữ liệu Cột E sau nhỉ
Nhập đơn vị trước nhập tên công tác và diễn giải sau
Mong nhận được giải pháp cho cả biểu thức có cột F không phải là trống
Chỉ khi cột N kết quả là #VALUE! thì không chạy sự kiện hoặc chạy ra kết quả là #VALUE! thì tự xóa trống
 
Lần chỉnh sửa cuối:
Upvote 0
Theo mình thì vẫn còn chút gì đó chưa ổn thiếu điều kiện gì ấy Vì
Theo nguyên lý nhập từ trái qua phải từ trên xuống dưới như vậy
Khi nhập biểu thức hay nội dung ở cột E thì cột F của tất cả các dòng đều là trống
như vậy khi nhập cột E thì cột N đều đã chạy sự kiện ấy trước rồi
Sau đó mình nhập tiếp cột F đơn vị thì cột N vẫn còn hàm đã chạy sự kiện trước
Cho dù nhập dữ liệu cột F thì cột N vẫn có nỗi #VALUE!
Nói vui: Hay Dhn46 bảo mình nhập dữ liệu cột F trước rồi nhập dữ liệu Cột E sau nhỉ
Em đâu có biết cách thức xây dựng File đâu anh ^^.
Em trả lời vài câu hỏi của anh bên bài #5 và #6 nhé:

1/ Cho công thức chạy không phụ thuộc vào cột F => anh sửa lại 1 chút xíu xíu như sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Tmp As Variant
    If Target.Column = 5 Then
        If Target <> 0 Then
            a = tinhtoan(Target.Text)
            If Not VBA.IsError(a) Then
                Target.Offset(, 9) = "=tinhtoan(" & Target.Address & ")"
            Else
                Target.Offset(, 9) = ""
            End If
        End If
    End If
End Sub

'Bỏ  As Double trong Function => tức là tên Function sẽ trở thành => mục đích là bắt lỗi trong sự kiện

Function tinhtoan(Mystr As String, Optional Dautp As String)

2/ Xuống dòng để nhập và tính biểu thức

=> Có thể làm được song cột N sẽ không là hàm mà trả về kết quả dạng số

3/ Tính toán khi biểu thức có thêm đơn vị hay cái gì đó:

=> Có thể làm nhưng phải biết nó là cái gì, ngay bản thân hàm tinhtoan anh post nó cũng có chức năng tính toán khi thêm cái gì đó rồi, cụ thể hơn đó là tính biểu thức sau dấu 2 chấm (Phương pháp tính theo hàm này đã có topic nói tới và có cách viết hay hơn khi dùng RegExp thậm chí trong hàm a post dùng Instr kết hợp Len trong khi chỉ cần InstrRev là xong)

Suy nghĩ riêng: với các dạng data thì không nên ôm quá nhiều thứ trong 1 cell sẽ khó giải quyết
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Dhn 46 đúng là để triệt để thì phải thay đổi cả cái hàm tính toán đã có
Mình có nói Coi như hàm tinhtoan đã lập là đúng ở bài đầu tiên vì mục đích của mình là dùng cho hàm khác cái hàm tính toán trên trua thật tổng quát
 
Upvote 0
Web KT
Back
Top Bottom