Lỗi giới hạn phạm vi số, cần giúp đỡ!

Liên hệ QC

t10000

Thành viên mới
Tham gia
1/10/15
Bài viết
8
Được thích
0
Tôi có viết một đoạn code xử lý số trên excel bằng VBA
Hàm nhận một số từ một cell nào đó, và xuất ra kết quả xử lý. Chuyện viết code thì không thành vấn đề nhưng vấn đề xảy ra khi nhập một số lớn hơn 2147483647 ("2 mũ 30 "-1) thì hàm báo #VALUE! (tức là hàm xảy ra lỗi khi số nhập số từ "2 mũ 30" )
Các kiểu dữ liệu là hoàn toàn phù hợp cho biến số lớn, để đơn giản tôi xin trích dẫn ra đây một hàm làm ví dụ

Function testnum(n As Long) As String
Dim st As String
If n > 0 Then
st = "OK"
else
st = ”NO”
End If
testnum = st

End Function

Và đây là kết quả của hàm trong SHEET:
View attachment 219876

Xin mọi người giúp đỡ!
Trân trọng cảm ơn.
 
Lần chỉnh sửa cuối:
Tôi có viết một đoạn code xử lý số trên excel bằng VBA
Hàm nhận một số từ một cell nào đó, và xuất ra kết quả xử lý. Chuyện viết code thì không thành vấn đề nhưng vấn đề xảy ra khi nhập một số lớn hơn 2147483647 ("2 mũ 30 "-1) thì hàm báo #VALUE! (tức là hàm xảy ra lỗi khi số nhập số từ "2 mũ 30" )
Các kiểu dữ liệu là hoàn toàn phù hợp cho biến số lớn, để đơn giản tôi xin trích dẫn ra đây một hàm làm ví dụ

Function testnum(n As Long) As String
Dim st As String
If n > 0 Then
st = "OK"
else
st = ”NO”
End If
testnum = st

End Function

Và đây là kết quả của hàm trong SHEET:
View attachment 219876

Xin mọi người giúp đỡ!
Trân trọng cảm ơn.
Bạn thử bỏ As Long thử lại xem sao.
 
Thân chào các bạn!
Tôi đã thử viết lại code,
tuy nhiên, vẫn còn vấn đề: nếu dùng các toán hạng trong hàm thì vẫn không được
ví dụ
Function testnum(n) As String
Dim st As String
If n \ 1000 > 0 Then
st = ">1000"
Else
st = "<1000"
End If
testnum = st
End Function

hàm sẽ cho kết quả #VALUE! khi nhập số lớn như trên

Mong đuọc giúp vì cần xử lý số cỡ như nghìn tỷ chẳng hạn, code cần xử lý lấy phần dư, phần nguyên ...!
 
Office bạn 32bit hay 64bit ?
 
Win 64, còn office 2010 Pluss bạn ạ (xem lại thì là Ver 14.0 32bit)
 
Office là 32bit hay 64bit đó bạn ?
 
Xem kỹ thì là Office Profesional Plus 2010 - 32 bit
 
Thân chào các bạn!
Tôi đã thử viết lại code,
tuy nhiên, vẫn còn vấn đề: nếu dùng các toán hạng trong hàm thì vẫn không được
ví dụ
Function testnum(n) As String
Dim st As String
If n \ 1000 > 0 Then
st = ">1000"
Else
st = "<1000"
End If
testnum = st
End Function

hàm sẽ cho kết quả #VALUE! khi nhập số lớn như trên

Mong đuọc giúp vì cần xử lý số cỡ như nghìn tỷ chẳng hạn, code cần xử lý lấy phần dư, phần nguyên ...!
Bạn thử sửa Function testnum(n) As String

thành Function testnum(Byval n As Double) As String
Bài đã được tự động gộp:

À, tôi đã hiểu lý do rồi, bạn nên làm thế này:

Function testnum(ByVal n As Double) As String Dim st As String If Fix(n / 1000) > 0 Then st = ">1000" Else st = "<1000" End If testnum = st End Function
 
Lần chỉnh sửa cuối:
Cảm ơn bạn
Mình sẽ thử với double nhưng nếu vậy sẽ phát sinh vấn đề chia lấy nguyên và lấy dư
nếu có giải pháp đơn giản hãy giúp mình nhé!

Chúc vui!
Tôi đã sửa hàm lại cho bạn rồi đó:
Mã:
Function testnum(ByVal n As Double) As String
    Dim st As String
    If Fix(n / 1000) > 0 Then
        st = ">=1000"
    Else
        st = "<1000"
    End If
    testnum = st
End Function
Phải là st = ">=1000" bởi thử lấy 1000 chia cho 1000 thì phải bằng 1 đúng không?
 
Office 64bit thì dùng chuyển qua dùng kiểu LongLong cũng được. Còn không thì phải dùng kiểu Double
Cung cấp cho bạn hàm mod này để bạn dùng với kiểu Double
Mã:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' DblMod
' Performs the same function as Mod but will not overflow
' with very large numbers. Both Mod and integer division ( \ )
' will overflow with very large numbers. DlbMod will not.
' Existing code like:
'       Result = dblNumber Mod dblDiv
' should be changed to:
'       Result = DblMod(dblNumber, dblDiv)
' Input values that are not integers are truncated to integers. Negative
' numbers are converted to postive numbers.
' This can be used in VBA code and can be called directly from a worksheet cell.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function DblMod(ByVal dblNumber As Double, ByVal dblDiv As Double) As Double
    dblNumber = Int(Abs(dblNumber))
    dblDiv = Int(Abs(dblDiv))
    DblMod = dblNumber - (Int(dblNumber / dblDiv) * dblDiv)
End Function
 
Rất cảm ơn tất cả các bạn!

Mình sẽ thử nhưng trước mắt có vẻ như sử dụng hàm Int liệu có bị dính tiếp phạm vi hay không nữa nhỉ

Chúc mọi người vui!
 
Báo cáo các bạn,

đã test dùng thử hàm DblMod của bạn "ThangCuAnh" và thấy rất tốt
Vấn đề số lớn của mình đã giải quyết xong, xử lý luôn đến cả triệu tỷ cũng tốt nữa

thanks all,
 
Bản thân variant Long chỉ có phạm vi -2^15 -1 đến 2^15 -1 nghĩa là nếu @t10000 gõ số vượt ngoài phạm vi này thì nó không làm việc được.
Tốt nhất nếu số lượng biến ít, mà chưa rõ phạm vi thì có thể khai báo variant type Single hoặc Double là ổn nhất nha.
phạm vi Double lên tới ^+-300 lận,

Tôi có viết một đoạn code xử lý số trên excel bằng VBA
Hàm nhận một số từ một cell nào đó, và xuất ra kết quả xử lý. Chuyện viết code thì không thành vấn đề nhưng vấn đề xảy ra khi nhập một số lớn hơn 2147483647 ("2 mũ 30 "-1) thì hàm báo #VALUE! (tức là hàm xảy ra lỗi khi số nhập số từ "2 mũ 30" )
Các kiểu dữ liệu là hoàn toàn phù hợp cho biến số lớn, để đơn giản tôi xin trích dẫn ra đây một hàm làm ví dụ

Function testnum(n As Long) As String
Dim st As String
If n > 0 Then
st = "OK"
else
st = ”NO”
End If
testnum = st

End Function

Và đây là kết quả của hàm trong SHEET:
View attachment 219876

Xin mọi người giúp đỡ!
Trân trọng cảm ơn.
 
Tiền ở đâu mà tới cả triệu tỷ vậy bạn ? :) Hì hì, nói chứ nhìn phân biệt số tỷ với chục tỷ, trăm tỷ, ngàn tỷ không thôi đã mệt, lộn tới lộn lui rồi :p
 
Một type mới trong VBA đó là: LongLongLongPtr,
Thông thường bạn sẽ biết:
- Interger (phạm vi 0đến 2^8)
- Long (phạm vi từ - 2^15 đến 2^15 -1)
- Single
Nhưng giờ hệ thống 64bit đã đại trà, nên phát sinh kiểu dữ liệu mới cho "số nguyên"
- LongPtr và LongLong là một kiểu mới, trong đó LongPtr có thể tự động thay đổi phạm vi giữa môi trường hệ thống 64bit và 32bit, còn LongLong chỉ ứng dụng trong môi trường hệ thống 64bit.
LongLong có phạm vi lên tới -2^63 đến 2^63 -1
LongPtr thì vẫn giống Long khi trên 32bit, nhưng sẽ giống LongLong khi trên 64bit.

Tham khảo chi tiết về:
LongLong
LongPtr
 
Web KT
Back
Top Bottom