ironegg 1904 / 781 / 31 Регистрация: 11.02.2010 Сообщений: 1,567 |
||||||||
1 |
||||||||
Как быстро определить: целое ли число?04.04.2010, 14:09. Показов 29954. Ответов 7 Метки нет (Все метки)
сейчас проверка отсутствия дробной части сделана так.
.
0 |
1605 / 1337 / 291 Регистрация: 25.10.2009 Сообщений: 3,487 Записей в блоге: 2 |
|
04.04.2010, 14:17 |
2 |
Сообщение было отмечено как решение РешениеМожет использовать Fix ? Типо если x<>fix(x) тогда есть дробная часть
3 |
1904 / 781 / 31 Регистрация: 11.02.2010 Сообщений: 1,567 |
|
04.04.2010, 14:33 [ТС] |
3 |
а если число отрицательное?. в упрощенном примере который я привел выше, этого нет, но вообще мне надо чтобы он и отрицательные корректно обрабатывал.
0 |
1605 / 1337 / 291 Регистрация: 25.10.2009 Сообщений: 3,487 Записей в блоге: 2 |
|
04.04.2010, 14:38 |
4 |
Ну и отрицательное можно. Fix() возвращает только целую часть.К примеру x=5.6 ,Fix(x)=5 . И если X<>Fix(X) тогда дробная часть есть,а если равны-нету
1 |
1904 / 781 / 31 Регистрация: 11.02.2010 Сообщений: 1,567 |
|
04.04.2010, 14:52 [ТС] |
5 |
Fix() возвращает только целую часть точно. надо больше спать. в данном случае одинаково в какую сторону округлять.
0 |
1605 / 1337 / 291 Регистрация: 25.10.2009 Сообщений: 3,487 Записей в блоге: 2 |
|
04.04.2010, 15:01 |
6 |
Ну а Вы вообще Mod хотели =) он медленный и не работает с большими числами. Наверное,Ваша конструкция самая быстрая (x-CInt(x)) . А кстати попробуйте If x<>Round(x) . Это округление…хотя наврятли оно будет работать достаточно быстро
1 |
аналитика здесь больше нет… 3372 / 1670 / 184 Регистрация: 03.02.2010 Сообщений: 1,219 |
||||||||||||
04.04.2010, 15:37 |
7 |
|||||||||||
Сообщение было отмечено как решение Решениесамый быстрый
4 |
1904 / 781 / 31 Регистрация: 11.02.2010 Сообщений: 1,567 |
|
04.04.2010, 22:29 [ТС] |
8 |
i = 129 действительно дает прирост20%. но по известным причинам не подходит .
0 |
Содержание
- Int, Fix functions
- Синтаксис
- Замечания
- Пример
- См. также
- Поддержка и обратная связь
- Функции VBA для работы с числовыми значениями
Int, Fix functions
Возвращает целую часть числа.
Синтаксис
Int(number) Fix(number)
Обязательный аргумент number — это double или любое допустимое числовое выражение. Если аргумент число содержит нулевое значение, возвращается нулевое значение.
Замечания
Функции Int и Fix удаляют дробную часть элемента число и возвращают результирующее целочисленное значение.
Разница между Int и Fix заключается в том, что если число является отрицательным, Int возвращает первое отрицательное целое число меньше или равно числу, а исправление возвращает первое отрицательное целое число больше или равно числу. Например, функция Int преобразует –8,4 в –9, а Fix преобразует –8,4 в –8.
Fix(number) эквивалентен Sgn(number) * Int(Abs(number)).
Пример
В этом примере показано, как функцииInt и Fix возвращают целые части чисел. Если используется отрицательный числовой аргумент, функция Int возвращает первое отрицательное целое число, которое меньше или равно этому числу; функция Fix возвращает первое отрицательное целое число, которое меньше или равно этому числу.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Функции VBA для работы с числовыми значениями
- ABS() — эта функция возвращает абсолютное значение переданного ей числа (то же число, но без знака). Например, ABS(3) и ABS(-3) вернут одно и то же значение 3.
- Int() , Fix() и Round() позволяют по разному округлять числа:
- Int() возвращает ближайшее меньшее целое;
- Fix() отбрасывает дробную часть;
- Round() округляет до указанного количества знаков после запятой.
Однако Round может вернуть не совсем ожидаемый результат, т.к. функция применяет финансовое округление. По правилам данного округления если за последней к округлению цифрой стоит 5, то округляемую цифру увеличивают в том случае, если она нечетная и уменьшают, если четная.
Математическое же округление всегда округляет цифру в большую сторону, если за ней идет цифра 5 и выше, и отбрасывает остаток если 4 и меньше.
Т.е. если мы выполним такую строку кодаMsgBox Round(2.505, 2)
то результатом будет 2,5 , хотя предполагалось получить 2,51 . Поэтому порой для округления лучше использовать Format :
MsgBox Format(2.505, «#,##0.00»)
но в этом случае мы получим не число в чистом виде, а текст. И если нужно именно число, то придется производить дополнительные преобразования:
MsgBox CDbl(Format(2.505, «#,##0.00»))
Так же, для математического округления, можно использовать и такой вариант:
MsgBox Application.Round(2.505, 2)
Но здесь стоит учитывать, что это не чистый VB и этот метод сработает только в Excel, т.к. по сути мы обращаемся к встроенной в Excel функции округления ОКРУГЛ (ROUND) , которая применяет именно математическое округление.
Rnd и команда Randomize используются для получения случайных значений (очень удобно для генерации имен файлов и в других ситуациях). Перед вызовом функции Rnd() необходимо выполнить команду Randomize для инициализации генератора случайных чисел.Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 1: lMaxNum = 100 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum
Источник
My isInteger
boolean should be able to resolve into the following boolean values:
2 --> True
3.0 --> True
2.3 --> False
2.9 --> False
4.0 --> True
5 --> True
I tried to use the following code:
Dim isInteger as Boolean
isInteger = (myNumber Mod 1 = 0)
Debug.Print (isInteger)
However the output is always True
even when myNumber
is 2.3, 3.4, etc.
How should I fix this?
asked Aug 5, 2016 at 19:41
Haris GhauriHaris Ghauri
5472 gold badges6 silver badges27 bronze badges
3
You can use the VarType Function
Dim IntVar, DblVar, StrVar, DateVar, MyCheck
IntVar = 3
DblVar = 2.2
StrVar = "Hello World"
DateVar = #2/12/69#
MyCheck = VarType(IntVar) ' Returns 2
MyCheck = VarType(DblVar) ' Returns 5
MyCheck = VarType(DateVar) ' Returns 7
MyCheck = VarType(StrVar) ' Returns 8
Where the return values are:
Constant Value Description
vbEmpty 0 Empty (uninitialized)
vbNull 1 Null (no valid data)
vbInteger 2 Integer
vbLong 3 Long integer
vbSingle 4 Single-precision floating-point number
vbDouble 5 Double-precision floating-point number
vbCurrency 6 Currency value
vbDate 7 Date value
vbString 8 String
vbObject 9 Object
vbError 10 Error value
vbBoolean 11 Boolean value
vbVariant 12 Variant (used only with arrays of variants)
vbDataObject 13 A data access object
vbDecimal 14 Decimal value
vbByte 17 Byte value
vbLongLong 20 LongLong integer (Valid on 64-bit platforms only.)
vbUserDefinedType 36 Variants that contain user-defined types
vbArray 8192 Array
You can also use the TypeName Function
MyCheck = TypeName(IntVar) ' Returns Integer
MyCheck = TypeName(DblVar) ' Returns Double
MyCheck = TypeName(DateVar) ' Returns Date
MyCheck = TypeName(StrVar) ' Returns String
answered Aug 5, 2016 at 19:57
3
I was having a similar problem, that was not solved by @Random_Answer_Guy solution because the input was formated as text.
So what i did :
- Test if numeric
- If Yes, create an integer variable equals to the variable your testing
- Compare the 2. If they’re equal it’s an integer
It looks something like this :
Dim VariableTested as Double
If IsNumeric(VariableTested) Then
Dim VariableToCompareTo as Integer
VariableToCompareTo = VariableTested 'This will round up variableTested to the closest integer
If VariableToCompareTo = VariableTested Then
'Congrats, it's an integer
End If
End If
This is probably the worst way of solving this problem. But at least it is one way of solving this problem. Which is better than nothing.
It will probably not help you since this question is 4 years old though …
answered Oct 29, 2020 at 14:11
Leo bLeo b
111 bronze badge
2
I recently discovered a pretty robust way to check if a number is an integer or not. Here it is:
Dim num, roundedNum As Double
Dim isNumAnInteger As Boolean
num = 3.3
roundedNum = Round(num)
isNumAnInteger = False
If num = roundedNum Then
isNumAnInteger = True
End If
If the original is equal to the rounded number, then the original must have been and integer in the first place.
answered Feb 28 at 23:22
In VBA, to test whether an expression is a number, the IsNumeric
function can be used.
Description
The IsNumeric function evaluates whether the input expression is a number and returns a Boolean value (TRUE or FALSE). It returns True if the entire expression is a number; otherwise, it returns False.
Syntax
IsNumeric(expression)
The input expression is either a numeric expression or a string expression.
VBA examples of IsNumeric
Example 1 – Using IsNumeric with IF-THEN-ELSE
The following VBA function CheckNumeic uses IsNumeric to test whether input1 is numeric or not with an IF-THEN-ELSE statement.
Function CheckNumeric(ByVal input1) As String If IsNumeric(input1) = True Then MyFunction1 = "Input is numeric" Else MyFunction1 = "Input is not numeric" End If End Function
I would want to draw your attention to line 2. While this line is correct, it is not necessary. Instead, it can be written as:
If IsNumeric(input1) Then
In VBA, whenever you perform a logical test, for the condition of TRUE, you don’t have to type the =TRUE
in the statement.
Example2 – Negate the result of IsNumeric
The VBA function below returns the opposite of IsNumeric
. The function uses the same IF-THEN-ELSE structure.
Function IsNumericReverse(ByVal input1) As Boolean If IsNumeric(input1) = True Then IsNumericReverse = False Else IsNumericReverse = True End If End Function
However, this entire structure is not necessary. Instead, the function can be simplified as follows. The Not logical operator can be used to reverse (negate) the answer of IsNumeric, which serves the objective of the function in this case.
Function IsNumericReverse(ByVal input1) As Boolean IsNumericReverse = Not (IsNumeric(input1)) End Function
Example 3 – VBA action if not numeric
The VBA function counts the number of non-numeric cells in the input range. In line 5, note the use of Not
with IsNumeric
. In the sentence structure here, putting a space after No
t is enough, which is equivalent to using a bracket after Not
to wrap the condition being tested.
Function countNonNumeric(range1 As Range) As Long Dim cell As Range Dim counter As Long For Each cell In range1.Cells If Not IsNumeric(cell.Value) Then 'use Not to test for non-numeric counter = counter + 1 End If Next countNonNumeric = counter End Function
Special Case with Blank
When using IsNumeric, you need to be aware that “blank” (string of zero length) does not mean zero (0) and it is considered to be non-numeric:
IsNumeric("")
returns False
Therefore, when you write your macro, if you want to treat blank as numeric, you may have to use conditional statements to handle the case of blank string inputs.
Special Case with Dates
Another special case with IsNumeric
is the treatment of date inputs. Most people conceptually think dates are numeric (after all, they can be converted into date-serials in the computer). However the IsNumeric
function in VBA considers dates as non-Numeric:
IsNumeric("10/2/2020")
returns False
Even if you try to input a date truly in Date format, IsNumeric still returns False:
IsNumeric(DateSerial(2020, 10, 2))
returns False
Therefore, you may also need to use conditional statements to handle the case of dates expressions.
Special Case with Time
Handling of time expressions by the ISNUMERIC is difficult to manage, or I would describe it as unpredictable. Therefore, when you input expressions contain time expressions, you must test your macro thoroughly.
There are three possibilities with time expressions. Let’s experiment with the macro below. In cell A1, we place a time of “3:00:00 AM” first. Then we run the macro which test 3 cases:
- time in form of string (variable x1)
- time in form of time value (variable x2)
- time placed in a cell in an Excel sheet (variable x3)
Sub TimeCases() Dim y x1 = IsNumeric("3:00:00 AM") x2 = IsNumeric(TimeSerial(3, 0, 0)) y = Range("A1").Value x3 = IsNumeric(y) MsgBox x1 &amp;amp;amp;amp; Chr(10) &amp;amp;amp;amp; x2 &amp;amp;amp;amp; Chr(10) &amp;amp;amp;amp; x3 End Sub
Run the macro and the answers will be displayed in the Msgbox:
Calling Excel Worksheet Function ISNUMBER() in VBA
As an alternative to IsNumeric
in VBA, you may call the Excel worksheet function ISNUMBER()
in your macro. There are two ways to do this. See line 2 and line 3 in the VBA function below, which do the same job. (I personally prefer Method 2.)
Function CallIsNumber(input1) As Boolean x = WorksheetFunction.IsNumber(input1) 'Method 1' x = Application.IsNumber(input1) 'Method 2' CallIsNumber = x End Function
VBA ISNUMERIC vs ISNUMBER Worksheet Function
Although you can either use IsNumeric
or Excel worksheet function ISNUMBER
to check whether an input expression is numeric, you have to be aware of the differences between the two methods in order to program your macros correctly to produce expected result.
Expression | Date type of expression | ISNUMERIC returns (VBA) | ISNUMBER returns (worksheet function) |
123 | Number | TRUE | TRUE |
“123” | Number in form of string | TRUE | FALSE |
12/2/2020 | Date | FALSE | TRUE |
“12/2/2020” | Date in form of String | FALSE | FALSE |
DateSerial(2020,10,2) | Date in form of Date Value | FALSE | FALSE |
3:00:00 AM | Time placed in a cell | TRUE | TRUE |
“3:00:00 AM” | Time in form of String | FALSE | FALSE |
TimeSerial(3, 0,0) | Time in form of Time Value | FALSE | FALSE |
“” (blank) | String | FALSE | TRUE |
See also:
- Else if in VBA
Главная » Функции VBA »
28 Апрель 2011 129149 просмотров
- ABS() — эта функция возвращает абсолютное значение переданного ей числа (то же число, но без знака). Например, ABS(3) и ABS(-3) вернут одно и то же значение 3.
- Int(), Fix() и Round()позволяют по разному округлять числа:
- Int() возвращает ближайшее меньшее целое;
- Fix() отбрасывает дробную часть;
- Round() округляет до указанного количества знаков после запятой.
Однако Round может вернуть не совсем ожидаемый результат, т.к. функция применяет финансовое округление. По правилам данного округления если за последней к округлению цифрой стоит 5, то округляемую цифру увеличивают в том случае, если она нечетная и уменьшают, если четная.
Математическое же округление всегда округляет цифру в большую сторону, если за ней идет цифра 5 и выше, и отбрасывает остаток если 4 и меньше.
Т.е. если мы выполним такую строку кодато результатом будет 2,5, хотя предполагалось получить 2,51. Поэтому порой для округления лучше использовать Format:
MsgBox Format(2.505, "#,##0.00")
но в этом случае мы получим не число в чистом виде, а текст. И если нужно именно число, то придется производить дополнительные преобразования:
MsgBox CDbl(Format(2.505, "#,##0.00"))
Так же, для математического округления, можно использовать и такой вариант:
MsgBox Application.Round(2.505, 2)
Но здесь стоит учитывать, что это не чистый VB и этот метод сработает только в Excel, т.к. по сути мы обращаемся к встроенной в Excel функции округления ОКРУГЛ(ROUND), которая применяет именно математическое округление.
- Rnd и команда Randomize используются для получения случайных значений (очень удобно для генерации имен файлов и в других ситуациях). Перед вызовом функции Rnd() необходимо выполнить команду Randomize для инициализации генератора случайных чисел.
Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 1: lMaxNum = 100 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum
- Sgn() — позволяет вернуть информацию о знаке числа. Возвращает 1, если число положительное, -1, если отрицательное и 0, если проверяемое число равно 0.
- Mod() — Делит два числа и возвращает только остаток. Например, выражение 8 Mod 3 вернет число 2, т.к. без остатка(в виде дроби у результата деления) 8 делится на 3 только до 2-х(8 / 3 = 2,66666666666667).
При этом функция Mod учитывает и знак числа — если первое число или оба числа отрицательные, то результатом будет отрицательное число. Если же отрицательное только второе число — то результат будет положительным числом.
При попытке получить остаток при делении чисел с плавающей запятой результат может быть не тем, который ожидается, потому что перед выполнением деления оба числа округляются по математическим законам(5 и выше до большего, 4 и ниже — до меньшего). Например, выражение 8 Mod 3.5 вернет 0, а выражение 8 Mod 3.4 — 2.