Nhờ giúp đỡ sửa lỗi code hàm tự tạo bằng Function VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

VU.NGO

Thành viên mới
Tham gia
1/5/23
Bài viết
22
Được thích
3
Em có file này, tính toán bằng hàm tự tạo , không hiểu sao bị lỗi VBA, nó chỉ cho ra kết quả bị #REF! hết. Nhờ các bác trợ giúp em sửa lỗi này với ạ.
Em cảm ơn!
 

File đính kèm

  • Cot.xlsm
    87.5 KB · Đọc: 9
Lần chỉnh sửa cuối:
mình vào tìm kiếm thấy code của bạn không thấy macBT ở chỗ khai báo .... ngoài ra còn 1 số code nữa
 
Upvote 0
Em có file này, tính toán bằng hàm tự tạo tên là Huy2, không hiểu sao bị lỗi VBA, nó chỉ cho ra kết quả bị #REF! hết. Nhờ các bác trợ giúp em sửa lỗi này với ạ.
Em cảm ơn!
Không rỏ nguyên nhân, hy vong bạn @VetMini biết
Mã:
  'Tinh cot thep cot doi xung
  Function TamThang(macBT, macThep, ByVal N1, ByVal M, ByVal b, ByVal h, ByVal a0, ByVal l, ByVal yb2, ByVal yb3)  ' Don vi M=KN.m  b,h=m
    Dim Rb1, am, ovga, CxiR, Gama As Double
    Dim Rs1, Rsc1, Cxi, Eb1, eta, lamda, teta, Ncr As Double
    Dim x, x1, ho, i, za, e1, ea, e0, exp0 As Double
    Dim a, thamso As Double
    Rb1 = Rb(macBT) * yb2 * yb3
    Rb2 = Rb(macBT)
    Rs1 = Rs(macThep)
    Eb1 = Eb(macBT)
    Rsc1 = Rsc(macThep)
    b1 = b * 1000
    h1 = h * 1000
    a01 = a0 * 1000
    l1 = l * 1000
    ovga = 0.85 - (0.008 * Rb2)
    CxiR = ovga / (1 + (Rs1 / 400) * (1 - (ovga / 1.1)))
    M1 = Abs(M) * 1000000
    N1 = Abs(N1) * 1000
    h01 = h1 - a01
    za = h01 - a01
    e1 = (M1 / N1)
    If (l1 / 600) >= (h1 / 30) Then
        ea = l1 / 600
    Else
        ea = h1 / 30
    End If
  
    If e1 <= ea Then
        e0 = ea
    Else
        e0 = e1
    End If
  
    lamda = l1 / h1
    If lamda <= 8 Then
        eta = 1
    Else
        i = (b1 * h1 * h1 * h1) / 12
        teta = (0.2 * e0 + 1.05 * h1) / (1.5 * e0 + h1)
        Ncr = (2.5 * teta * Eb1 * i) / (l1 * l1)
        eta = 1 / (1 - (N1 / Ncr))
    End If
  
    e = eta * e0 + 0.5 * h1 - a01
    x1 = N1 / (Rb1 * b1)
  
    If x1 <= CxiR * h01 Then
        If x1 >= (2 * a01) Then
            TamThang = (N1 * (e + 0.5 * x1 - h01)) / (Rsc1 * za)
        Else
            TamThang = (N1 * (e - za)) / (Rs1 * za)
        End If
   Else
        exp0 = e0 / h01
        x1 = h01 * (CxiR + (1 - CxiR) / (1 + 50 * exp0 * exp0))
        TamThang = ((N1 * e) - (Rb1 * b1 * x1) * (h01 - 0.5 * x1)) / (Rsc1 * za)
   End If
 
   If TamThang <= 0 Then
        TamThang = "cau ta0"
    
   Else
        TamThang = Round(TamThang / 100, 2)
   End If
  
  End Function

 
   'Tinh cot thep cot lech tam xiem
  Function TamXien(macBT, macThep, ByVal N1, ByVal Mx, ByVal My, ByVal cx, ByVal cy, ByVal a0, ByVal l, ByVal yb2, ByVal yb3) ' Don vi M=KN.m  b,h=m
    Dim Rb1, am, ovga, CxiR, Gama As Double
    Dim Rs1, M, N, Rsc1, Cxi, Eb1, etax, etay, lamdax, lamday, tetax, tetay, Ncrx, Ncry As Double
    Dim x, x1, h0, m0, l1, Ix, Iy, za, e1x, e1y, eax, eay, e0x, e0y, exp0 As Double
    Dim M1x, M1y As Double
  
    Rb1 = Rb(macBT) * yb2 * yb3
    Rb2 = Rb(macBT)
    Rs1 = Rs(macThep)
    Eb1 = Eb(macBT)
    Rsc1 = Rsc(macThep)
    c1x = cx * 1000
    c1y = cy * 1000
    a01 = a0 * 1000
    l1 = l * 1000
 
    Mx = Abs(Mx) * 1000000
    My = Abs(My) * 1000000
    N1 = Abs(N1) * 1000
  
    e1x = (Mx / N1)
    If (l1 / 600) >= (cx1 / 30) Then
        eax = l1 / 600
    Else
        eax = cx1 / 30
    End If
  
    If e1x <= eax Then
        e0x = eax
    Else
        e0x = e1x
    End If
  
    lamdax = l1 / c1x
    If lamdax <= 8 Then
        etax = 1
    Else
        Ix = (c1y * c1x * c1x * c1x) / 12
        tetax = (0.2 * e0x + 1.05 * c1x) / (1.5 * e0x + c1x)
        Ncrx = (2.5 * tetax * Eb1 * Ix) / (l1 * l1)
        etax = 1 / (1 - (N1 / Ncrx))
    End If
    M1x = N1 * etax * e0x
      
    e1y = (My / N1)
    If (l1 / 600) >= (c1y / 30) Then
        eay = l1 / 600
    Else
        eay = c1y / 30
    End If
  
    If e1y <= eay Then
        e0y = eay
    Else
        e0y = e1y
    End If
  
    lamday = l1 / c1y
    If lamday <= 8 Then
        etay = 1
    Else
        Iy = (c1x * c1y * c1y * c1y) / 12
        tetay = (0.2 * e0y + 1.05 * c1y) / (1.5 * e0y + c1y)
        Ncry = (2.5 * tetay * Eb1 * Iy) / (l1 * l1)
        etay = 1 / (1 - (N1 / Ncry))
    End If
    M1y = N1 * etay * e0y
  
    If M1x / c1x > M1y / c1y Then
    h = c1x
    b = c1y
    M1 = M1x
    M2 = M1y
    Else
    h = c1y
    b = c1x
    M1 = M1y
    M2 = M1x
    End If
  
    h0 = h - a01
    za = h0 - a01
    ovga = 0.85 - (0.008 * Rb2)
    CxiR = ovga / (1 + (Rs1 / 400) * (1 - (ovga / 1.1)))
      
    x1 = N1 / (Rb1 * b)
    If x1 <= h0 Then
    m0 = 1 - ((0.6 * x1) / h0)
    Else
    m0 = 0.4
    End If
  
    M = M1 + m0 * M2 * (h / b)
    e0 = M / N1
    e = e0 + 0.5 * h - a01
      
    If x1 <= CxiR * h0 Then
        If x1 >= (2 * a01) Then
            TamXien = (N1 * (e + 0.5 * x1 - h0)) / (Rsc1 * za)
        Else
            TamXien = (N1 * (e - za)) / (Rs1 * za)
        End If
   Else
        exp0 = e0 / h0
        x = h0 * (CxiR + (1 - CxiR) / (1 + 50 * exp0 * exp0))
        TamXien = ((N1 * e) - (Rb1 * b * x) * (h0 - 0.5 * x)) / (Rsc1 * za)
   End If
 
   If TamXien <= 0 Then
        TamXien = 0.6 / 100 * cx * 100 * cy * 100
    
   Else
        TamXien = Round(2.5 * TamXien / 100, 2)
   End If
      
  End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Không rỏ nguyên nhân, hy vong bạn @VetMini biết
...
Có thấy cái hàm răng nào tự tạo hay nha sĩ tạo tên là Huy2 đâu?
Đoán chừng nguyên nhân la tên hàm tự tạo gọi lên bảng tính không thể giống địa chỉ Range. (nếu chỉ dùng trong giới hạn các modules thì được).
Huy2 là cột Huy, dòng 2.
 
Upvote 0
Có thấy cái hàm răng nào tự tạo hay nha sĩ tạo tên là Huy2 đâu?
Đoán chừng nguyên nhân la tên hàm tự tạo gọi lên bảng tính không thể giống địa chỉ Range. (nếu chỉ dùng trong giới hạn các modules thì được).
Huy2 là cột Huy, dòng 2.
Bác sỹ chẩn bệnh trúng y.

Chẩn đoán thêm: Function Huy2 ở trong file được viết dùng cho Excel 2003, lúc đó tên cột chưa có đến 3 chữ cái như bây giờ.
 
Upvote 0
Có thấy cái hàm răng nào tự tạo hay nha sĩ tạo tên là Huy2 đâu?
Đoán chừng nguyên nhân la tên hàm tự tạo gọi lên bảng tính không thể giống địa chỉ Range. (nếu chỉ dùng trong giới hạn các modules thì được).
Huy2 là cột Huy, dòng 2.
Bác sỹ chẩn bệnh trúng y.

Chẩn đoán thêm: Function Huy2 ở trong file được viết dùng cho Excel 2003, lúc đó tên cột chưa có đến 3 chữ cái như bây giờ.
Các bác bắt được bệnh rồi , chữa bệnh giúp em được không, chứ nói đến chỗ đó em vẫn chưa hình dung ra tiếp theo làm gì ạ
 
Upvote 0
Bạn sửa tên "Huy2" thành "HuyLTX" là dùng được.
Vào Module nhấn Ctrl + H --> Đổi toàn bộ "Huy2" to "HuyLTX".
Còn tại sao thì chịu :D

1683338228982.png
 
Upvote 0
Trong hầu hết các trường hợp thông thường thì không cần phải sửa code. Chỉ cần sửa cách sử dụng.
Dân chuyên nghiệp có 2 cách làm:
1. Cách viết thêm code: dùng một hàm khác để gọi nó.
2. Cách sử dụng không gian định danh (namespace): nó nằm bên trong module nào thì gán thêm cái tiền tố tên module ấy.

1683349858909.png
 
Upvote 0
Web KT
Back
Top Bottom