Ảnh hưởng của việc chạy thủ tục đến quá trình tính toán của hàm.

Liên hệ QC

vu_tuan_manh_linh

linhvtm84@gmail.com
Tham gia
27/2/10
Bài viết
2,637
Được thích
1,903
Giới tính
Nam
Nghề nghiệp
Kỹ sư Kinh tế Xây dựng
Tôi có làm 1 file với mục đích diễn giải các khối lượng theo các kích thước có sẵn. Khi nhập các thông số vào Cột B thì kết quả sẽ cộng lại vào cột C bằng hàm Cong. Bình thường thì hàm Cong tính được, nhưng khi thêm hoặc tính lai 1 ô nào đó trong cột B thì hàm báo lỗi #Value. Nếu bấm F2 vào ô chứa hàm và enter thì hàm lại chạy được. Tôi không hiểu việc chạy thủ tục đã ảnh hưởng đến hàm như thế nào. Mong mọi người giải quyết giúp. Cảm ơn nhiều.
 
Theo mình nghỉ, bạn fải xử lí dấu âm nếu có ngay sau dòng lệnh có đánh số 9 như trong hàm của bạn:(Không nên xử nó ở dòng lệnh 13 như vậy là trễ đó!)

PHP:
Option Explicit
Function Cong(Vung As Range)
Dim i As Integer, j As Integer, DaiTP As Integer, VTr As Integer
Dim Cll As Range:                         Dim GT As String
Dim Nguyen As Variant, So As Variant, ThapFan As Variant

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For Each Cll In Vung
   GT = Cll.Formula
   i = InStr(1, GT, "=")
    If i > 0 Then
        GT = Right(GT, Len(GT) - i)
9        GT = Trim(GT)
        VTr = InStr(1, GT, ",")
        If VTr > 0 Then
            Nguyen = Val(Left(GT, VTr - 1))
            ThapFan = Val(Right(GT, Len(GT) - VTr))
            DaiTP = Len(GT) - VTr
            ThapFan = ThapFan / (10 ^ DaiTP)
        Else
            Nguyen = Val(GT)
        End If
        
13        If Left(GT, 1) <> "-" Then
            So = Nguyen + ThapFan
        Else
            So = Nguyen - ThapFan
        End If
        Cong = Cong + So
    End If
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Function
 
Upvote 0
Tôi có làm 1 file với mục đích diễn giải các khối lượng theo các kích thước có sẵn. Khi nhập các thông số vào Cột B thì kết quả sẽ cộng lại vào cột C bằng hàm Cong. Bình thường thì hàm Cong tính được, nhưng khi thêm hoặc tính lai 1 ô nào đó trong cột B thì hàm báo lỗi #Value. Nếu bấm F2 vào ô chứa hàm và enter thì hàm lại chạy được. Tôi không hiểu việc chạy thủ tục đã ảnh hưởng đến hàm như thế nào. Mong mọi người giải quyết giúp. Cảm ơn nhiều.
Code của bạn rối quá... Tôi sửa lại thế này:
PHP:
Function ValExp(ByVal SrcRng As Range) As Double
  Dim Tmp As String, Exp As String, Clls As Range, Des As String, Res
  On Error Resume Next
  With Application
    If Application.UseSystemSeparators Then
      Des = .International(3)
    Else
      Des = .DecimalSeparator
    End If
  End With
  For Each Clls In SrcRng
    Exp = Clls.Value
    Tmp = Mid(Exp, 1, IIf(InStr(Exp, "=") > 0, InStr(Exp, "=") - 1, Len(Exp)))
    Tmp = Mid(Tmp, IIf(InStr(Tmp, ":") > 0, InStr(Tmp, ":") + 1, 1), Len(Tmp))
    Tmp = Replace(Tmp, " ", "")
    Tmp = Replace(Tmp, ",", Des)
    Tmp = Replace(Tmp, ".", Des)
    Res = Res + Evaluate(Tmp)
  Next
  ValExp = Round(Res, 3)
End Function
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
  Dim Tmp
  If Target.Column = 2 Then
    Application.EnableEvents = False
    If IsEmpty(Target) Then GoTo ExitSub
    If Target.Columns.Count > 1 Then GoTo ExitSub
    If Cells(Target.Row, 1).Value <> 0 Then GoTo ExitSub
    Tmp = Round(ValExp(Target), 3)
    If InStr(Target.Value, "=") = 0 Then
      Target.Value = Target.Value & "=" & Tmp
    Else
      Target.Value = Mid(Target.Value, 1, InStr(Target, "=")) & Tmp
    End If
    Target.Characters(InStr(Target.Value, "="), Len(Target)).Font.ColorIndex = 3
    Application.EnableEvents = True
  End If
ExitSub:
  Application.EnableEvents = True
End Sub

- Hàm ValExp tính toán chuổi biểu thức từ sau dấu 2 chấm đến trước dấu bằng
- Nếu trong chuổi không có dấu 2 chấm thì biểu thức tính từ ký tự thứ nhất
- Nếu trong chuổi không có dấu bằng thì biểu thức tính đến ký tự cuối
- Sự kiện Change sẽ tính toán kết quả dựa vào hàm ValExp ---> Nếu chuổi chưa có dấu = thì tự thêm vào

------------------------------
Chỉ đoán và làm đại thôi (không có kiên nhẫn xem code của bạn)
Bạn xem lại, tôi không chắc chính xác theo ý bạn
 

File đính kèm

Upvote 0
Code của bạn rối quá... Tôi sửa lại thế này:
PHP:
Function ValExp(ByVal SrcRng As Range) As Double
  Dim Tmp As String, Exp As String, Clls As Range, Des As String, Res
  On Error Resume Next
  With Application
    If Application.UseSystemSeparators Then
      Des = .International(3)
    Else
      Des = .DecimalSeparator
    End If
  End With
  For Each Clls In SrcRng
    Exp = Clls.Value
    Tmp = Mid(Exp, 1, IIf(InStr(Exp, "=") > 0, InStr(Exp, "=") - 1, Len(Exp)))
    Tmp = Mid(Tmp, IIf(InStr(Tmp, ":") > 0, InStr(Tmp, ":") + 1, 1), Len(Tmp))
    Tmp = Replace(Tmp, " ", "")
    Tmp = Replace(Tmp, ",", Des)
    Tmp = Replace(Tmp, ".", Des)
    Res = Res + Evaluate(Tmp)
  Next
  ValExp = Round(Res, 3)
End Function
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
  Dim Tmp
  If Target.Column = 2 Then
    Application.EnableEvents = False
    If IsEmpty(Target) Then GoTo ExitSub
    If Target.Columns.Count > 1 Then GoTo ExitSub
    If Cells(Target.Row, 1).Value <> 0 Then GoTo ExitSub
    Tmp = Round(ValExp(Target), 3)
    If InStr(Target.Value, "=") = 0 Then
      Target.Value = Target.Value & "=" & Tmp
    Else
      Target.Value = Mid(Target.Value, 1, InStr(Target, "=")) & Tmp
    End If
    Target.Characters(InStr(Target.Value, "="), Len(Target)).Font.ColorIndex = 3
    Application.EnableEvents = True
  End If
ExitSub:
  Application.EnableEvents = True
End Sub

- Hàm ValExp tính toán chuổi biểu thức từ sau dấu 2 chấm đến trước dấu bằng
- Nếu trong chuổi không có dấu 2 chấm thì biểu thức tính từ ký tự thứ nhất
- Nếu trong chuổi không có dấu bằng thì biểu thức tính đến ký tự cuối
- Sự kiện Change sẽ tính toán kết quả dựa vào hàm ValExp ---> Nếu chuổi chưa có dấu = thì tự thêm vào

------------------------------
Chỉ đoán và làm đại thôi (không có kiên nhẫn xem code của bạn)
Bạn xem lại, tôi không chắc chính xác theo ý bạn
Anh làm đúng ý của em rồi. Tuy nhiên file đính kèm anh gửi em thấy tính không được. Code anh viết xúc tích, em sẽ nghiên cứu thêm. Cảm ơn anh nhiều!
 
Upvote 0
Cảm ơn anh Ndu96081631 và anh ChanhQT@. Em đã tìm ra 1 giải pháp là sau khi tính toán ra giá trị tại Target, thì chạy ngược lại và gán lại hàm Cong(), hàm này sẽ cập nhật vùng tính toán.
 
Upvote 0
Web KT

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

Back
Top Bottom