Если число не целое excel vba

ironegg

1904 / 781 / 31

Регистрация: 11.02.2010

Сообщений: 1,567

1

Как быстро определить: целое ли число?

04.04.2010, 14:09. Показов 29954. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Sub a()
Dim x As Single
Dim i As Single
t = Timer
For i = 1 To 256
    For j = 1 To 256
        For k = 1 To 256
            x = 1 + (i / 129)
            If 0 = (x - CInt(x)) Then
                If 1 Then
                   x = x
                End If
            End If
        Next k
    Next j
Next i
Debug.Print (Timer - t), "âðåìÿ öèêëà"
End Sub

сейчас проверка отсутствия дробной части сделана так.

Visual Basic
1
0 = (x - CInt(x))

.
возможно есть другой, более быстрый способ? без вызова(явного или неявного) дополнительных функций. и, желательно, чтобы вместо «0 = » можно было написать «Not»



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

а если число отрицательное?. в упрощенном примере который я привел выше, этого нет, но вообще мне надо чтобы он и отрицательные корректно обрабатывал.
ну и все равно, вызов функции, которая может находиться непонятно где(за пределами кэша процессора). может есть, что-то с применением «Mod» ?



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

Цитата
Сообщение от YuraAAA
Посмотреть сообщение

Fix() возвращает только целую часть

точно. надо больше спать. в данном случае одинаково в какую сторону округлять.
и тем не менее. при всавке в код имею вместо желаемого прироста производительлности около 20%
потерю на те же 20%. все потому, что Fix и Int работают медленнее Cint (этож я еще вчера выяснил экспериментом)
пока что (x — CInt(x)) самый быстрый — отбрасывание(свдиг?) и вычитание



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

Лучший ответ Сообщение было отмечено как решение

Решение

самый быстрый

Visual Basic
1
If i = 129 Then
Visual Basic
1
If Int(x) = x Then
Visual Basic
1
If CInt(x) = x Then



4



1904 / 781 / 31

Регистрация: 11.02.2010

Сообщений: 1,567

04.04.2010, 22:29

 [ТС]

8

i = 129 действительно дает прирост20%. но по известным причинам не подходит .
CInt(x) = x дает 10% и это рекорд.сам не догадался, надо чаще спать. спасибо!
все таки в тайне надеюсь на оператор без вызова функции. может битовый сдвиг? говорят умножение и деление на степень двойки компилируется в побитовый сдвиг



0



Содержание

  1. Int, Fix functions
  2. Синтаксис
  3. Замечания
  4. Пример
  5. См. также
  6. Поддержка и обратная связь
  7. Функции 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 Ghauri's user avatar

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

random_answer_guy's user avatar

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 b's user avatar

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

MoreCowbellPlease's user avatar

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 Not 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)

A cell with the time 3:00am

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;amp; Chr(10) &amp;amp;amp;amp;amp; x2 &amp;amp;amp;amp;amp; Chr(10) &amp;amp;amp;amp;amp; x3
End Sub

Run the macro and the answers will be displayed in the Msgbox:

msgbox stating False, False, True

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.

Понравилась статья? Поделить с друзьями:
  • Если число меньше то оно равно excel
  • Если число меньше нуля то excel
  • Если символ цифра excel
  • Если сбилась формула в excel что делать
  • Если сбилась нумерация в word