2016-01-20 5 views
2

Я делаю простой лист Excel для меня и моего отца, братьев и т. Д., Чтобы отслеживать обслуживание автомобиля. У меня есть некоторый опыт программирования, но этого недостаточно, чтобы понять эту проблему. Проблема в том, что когда определенные строки чисел втягиваются в функцию, а затем помещаются в уравнение, она дает #VALUE! ошибка. Смотрите ниже и пример:Публичная функция Excel возвращает «VALUE #» для определенных номеров

клеток B9: Заменить @ миль: 185555

Cell D9: 41446

Cell E9: = IF ($ G $ 2- $ D9> = getMiles (B9),» СЕРВИС «, "OK")

Cell G2: 60000

Если я вхожу 18555 в E9, я получаю "! OK" вместо ошибки.

Если я вхожу 40000, я получаю сообщение об ошибке.

Кроме того, это происходит, если я изменю уравнение до значения не более = getMiles (B9). То же самое. Очевидно, это не число цифр. Но что-то в определенной степени, похоже, вызывает ошибку. Я не знаю, является ли это шестнадцатеричной вещью или ошибкой, или моим кодом. Пожалуйста помоги. См. Ниже уравнение миль и не стесняйтесь загружать лист excel из моей ссылки. Заранее благодарим за ваши усилия.

Public Function getMiles(cellie As String) As Double 

Dim pos As Integer 
Dim milesStr As String 
Dim milesTrimmedStr As String 
Dim milesInt As Integer 
Dim number As Integer 

pos = InStr(cellie, "miles:") 
number = pos + 6 
milesStr = Mid(cellie, number, 7) 
milesTrimStr = Trim(milesStr) 
milesInt = CDbl(Val(milesTrimStr)) 

getMiles = milesInt 


End Function 

Ссылка на мой файл Excel: https://filedropper.com/filemanager/public.php?service=files&t=1c6edf91310c639743bfcd09b0fbb80c

ответ

1

Изменение переменной milesInt от того типа Integer к типу Double. Вы переполняете целочисленную переменную.

В VBA, Integer переменные являются 16-разрядными, со значениями, разделенными положительным и отрицательным, поэтому наибольшее положительное число, которое может быть сохранено, составляет 2^15-1 = 32767. Вот почему ваша функция не может обрабатывать 40 000. Поскольку ваша функция возвращает double, имеет смысл объявить эту переменную как Double. Другие Integer переменные могут быть объявлены как Long (даже если переполнение не представляет опасности). С современными машинами действительно нет смысла использовать 16-битные целочисленные переменные в VBA.

+0

Работает отлично. Как вы можете видеть, у меня была небольшая мысль в моей голове, что, возможно, она должна быть двойной, поэтому я изменил тип возврата, но забыл изменить внутреннюю переменную. Смущающе и просто жалкое мышление с моей стороны. Большое спасибо за ваш лаконичный, точный и быстрый ответ! Пусть боги программирования помилуют мою душу ... – tstruss912

Смежные вопросы