I want to perform some task based on some ifs
my (uncomplete) code is
Sub checkif()
Dim s
With ActiveDocument.Range
s = Val(ActiveDocument.Paragraphs.Count)
s = s / 5
If s = Integer then
perform some task
Else
Exit Sub
End If
End With
End Sub
I am completely new to VBA and there are so many answers. I have tried several.
one is
Sub checkif2()
Dim s
With ActiveDocument.Range
s = Val(ActiveDocument.Paragraphs.Count)
s = s / 5
If IsNumeric(s) Then
MsgBox "is integer"
Else
MsgBox "not integer"
Exit Sub
End If
End With
End Sub
This always give integer.
checked another one
Sub checkif2()
Dim s
With ActiveDocument.Range
s = Val(ActiveDocument.Paragraphs.Count)
s = s / 5
If TypeName(s) = "Integer" Then
MsgBox "is integer"
Else
MsgBox "not integer"
Exit Sub
End If
End With
End Sub
Always give not integer.
Is there any method for Word VBA?
asked Dec 9, 2015 at 7:07
If s = Fix(s)
is one way.
Fix
strips off the fractional part.
Another approach in your case would be to check if the base 5 modulus is zero prior to taking the division. Use Mod
for that: If s Mod 5 = 0
.
answered Dec 9, 2015 at 7:22
BathshebaBathsheba
231k33 gold badges359 silver badges477 bronze badges
1
While trying Rahul’s answer, Found that This is simplest way.
If s = Int(s) Then
Tried for smaller file.
I will check with larger files and tell.
answered Dec 9, 2015 at 7:50
2
В языке VBA есть универсальные типы данных, т.е. способные хранить как число, так и строку, дату и любой другой тип информации. Например, ячейка в таблице может содержать что угодно и изначально, программа не знает какой в ней тип данных хранится. Кроме того, в самой программе может использоваться тип данных Variant, который так же может содержать любое значение любого типа.
Чтобы определить какой тип данных в ячейке или в переменной типа Variant, можно воспользоваться несколькими способами.
Способ 1. Использовать функцию TypeName для определения типа данных
Эта функция возвращает строку с названием типа данных на английском. В качестве аргумента принимает переменную, значение ячейки.
Обратите внимание: Функция определяет только стандартные типы данных и не может определить пользовательский тип (определенный с помощью Type).
Возможные возвращаемые функцией значения:
Byte | Число типа Byte |
Integer | Целое число |
Long | Длинное целое число |
Single | Число одиночной точности с плавающей запятой |
Double | Число двойной точности с плавающей запятой |
Currency | Валюта |
Decimal | Число с плавающей запятой |
Date | Дата |
String | Строка |
Boolean | Логическое |
Error | Ошибка |
Empty | Не проинициализировано (т.е. переменная не была объявлена) |
Null | Неверные данные (в переменной нет корректных данных) |
Object | Объект (класс) |
Unknown | Тип данных не известен |
Nothing | Объект, никуда не ссылающийся |
Приведу несколько примеров по использованию TypeName.
Пример 1. Определение типа переменной.
Dim v As Integer MsgBox TypeName(v) ' Выведет: Integer
Обратите внимание: если вы используете результат TypeName в условии, т.е. проверяете, соответствует ли тип данных определенному, например, Integer, то регистр символов возвращаемого типа имеет значение. Т.е. нужно писать Integer с заглавной буквы, либо использовать приведение всех символов к одному регистру.
Пример 2. Использование TypeName в условии.
Dim v As Integer If TypeName(v) = "Integer" Then MsgBox "Yes" Else MsgBox "No" ' Yes If TypeName(v) = "integer" Then MsgBox "Yes" Else MsgBox "No" ' No If LCase(TypeName(v)) = "integer" Then MsgBox "Yes" Else MsgBox "No" ' Yes
Пример 3. Определение типа данных в ячейке.
MsgBox TypeName(Cells(1, 1).Value) ' Выведет тип данных в ячейке A1
Если функции была передана переменная массив, она вернет тип данных в массиве с добавлением скобок.
Пример 4. Определение типа массива.
Dim Arr1(10) As Integer Dim Arr2(10) MsgBox TypeName(Arr1) ' Выведет: Integer() MsgBox TypeName(Arr2) ' Выведет: Variant()
Способ 2. Проверка на возможность преобразования строки к нужному типу.
Бывает ситуация, когда значение, например, число или дата, содержится в строке. В этом случае TypeName вернет String, а не Integer или Date. Чтобы узнать, что содержится в строке, можно воспользоваться одной из функций IsNumeric, IsDate, IsObject, IsArray, IsNull, IsError.
IsNumeric | Проверяет может ли выражение быть преобразовано в число |
IsDate | Проверяет может ли выражение быть преобразовано в дату |
IsObject | Проверяет, является ли переменная объектом |
IsArray | Проверяет, является ли переменная массивом |
IsNull | Проверка на пустое значение |
IsError | Проверка выражения на ошибку |
Пример 4. Определение может ли переменная быть преобразована в число.
Dim v As String If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no (т.к. в строке нет числа) v = "120" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes v = "120.45" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no v = "test 120" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no v = "120 test" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no
К сожалению, как видим из примера, нет возможности проверить, содержится ли в строке число с плавающей точкой.
Пример 5. Определение содержит ли переменная дату (может быть преобразована в дату).
Dim firstDate, secondDate As Date Dim timeOnly, dateAndTime, noDate As String firstDate = CDate("12.05.2017") secondDate = #12/5/2017# timeOnly = "15:45" dateAndTime = "12.05.2017 15:45" noDate = "Test" If IsDate(firstDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(secondDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(timeOnly) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(dateAndTime) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes If IsDate(noDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no
Проверка, содержится ли число или дата в ячейке листа делается аналогично, как и с переменными.
Помимо этих способов можно конечно еще придумать и другие, например, проверку строки с данными регулярным выражением или пройти по каждому символу в цикле и проверить цифра это или нет и тому подобное. Но на мой взгляд, описанных мной способов вполне достаточно для решения повседневных задач.
In this Article
- Integer (Int) Variable Type
- Long Variable Type
- Decimal Values & Int Data Types
- Decimal / Double Data Type
- Declare Int Variable at Module or Global Level
- Module Level
- Global Level
- Convert String to Int
- Convert Int to String
- Format Integer Stored as String
Integer (Int) Variable Type
The VBA Int data type is used to store whole numbers (no decimal values). However as we’ll see below, the Integer values must fall within the range ‑32768 to 32768.
To declare an Int variable, you use the Dim Statement (short for Dimension):
Dim intA as Integer
Then, to assign a value to a variable, simply use the equal sign:
intA = 30000
Putting this in a procedure looks like this:
Sub IntExample()
'declare the integer
Dim intA as Integer
'populate the integer
intA = 30000
'show the message box
MsgBox intA
End Sub
If you run the code above, the following message box will be shown.
Long Variable Type
As mentioned above, Int variables can only store values between ‑32768 to 32768. If you attempt to assign a value outside that range to an Int variable you’ll receive an error:
When you click on de-bug, the code will break at the ‘populate the integer line as an integer cannot store a number as high as 50000.
Instead, you can declare a variable with the Long data type:
Dim longA as Long
Long Variables can store very long data types (-2,147,483,648 to 2,147,483,648).
<<link to long variable article>>
Why would you use Int variables instead of Long variables?
Long variables use more memory. Years ago, memory was a big concern when writing code, however now computing technology is much improved and it’s doubtful you’ll encounter memory issues caused by long variables when writing VBA code.
We recommend always using Long variables instead of Int variables. We will continue this tutorial discussing Int variables, but keep in mind that you can use the Long variable type instead.
Decimal Values & Int Data Types
Int variables can not store decimal values. If you pass a decimal number an integer, the decimal number will be rounded to remove the decimal.
Therefore, if you were to run the procedure below:
Sub IntExampleB()
'declare the integer
Dim intA as Integer
'populate the integer
intA = 3524.12
'show the message box
MsgBox intA
End Sub
You would get the following result (rounding down):
However, this code below:
Sub IntExampleB()
'declare the integer
Dim intA as Integer
'populate the integer
intA = 3524.52
'show the message box
MsgBox intA
End Sub
Would return the following message box (rounding up):
Decimal / Double Data Type
If you want to store a decimal place, you would need to declare a variable that allows for decimal places. There are 3 data types that you can use – Single, Double or Currency.
Dim sngPrice as Single
Dim dblPrice as Double
Dim curPrice as Currency
The Single data type will round the decimal point slightly differently to the double and currency data type, so it is preferable to use double to single for accuracy. A double can have up to 12 decimal places while currency and single can both have up to 4 decimal places.
For further information about these data types, you can have a look here.
Declare Int Variable at Module or Global Level
In the previous examples, we’ve declared the Int variable within a procedure. Variables declared with a procedure can only be used within that procedure.
Instead, you can declare Int variables at the module or global level.
Module Level
Module level variables are declared at the top of code modules with the Dim statement.
These variables can be used with any procedure in that code module.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Global Level
Global level variables are also declare at the top of code modules. However, instead of using the Dim statement, use the Public statement to indicate that the integer variable is available to be used throughout your VBA Project.
Public IntA as Integer
If you were to declare the integer at a module level and then try to use it in a different module, an error would occur.
However, if you had used the Public keyword to declare the integer, the error would not occur and the procedure would run perfectly.
Convert String to Int
There might be an instance or instances when you will need to convert a number stored as a string to an integer value.
You will notice in the immediate window that the integer value goes to the right indicating a number, while the string value goes to the left – indicating text.
Convert Int to String
Conversely, you can convert an integer value to a string.
For further information about these data types, you can have a look here.
VBA Programming | Code Generator does work for you!
Format Integer Stored as String
<<also talk about the Format function, to assign number formatting>>
TommyGun
MrExcel MVP
- Joined
- Dec 9, 2002
- Messages
- 4,202
-
#2
<font face=Courier New><SPAN style=»color:#00007F»>Sub</SPAN> Test()
<SPAN style=»color:#00007F»>Dim</SPAN> i <SPAN style=»color:#00007F»>As</SPAN> <SPAN style=»color:#00007F»>Integer</SPAN>, j <SPAN style=»color:#00007F»>As</SPAN> <SPAN style=»color:#00007F»>Long</SPAN>
i = 250
j = 2500000
<SPAN style=»color:#00007F»>If</SPAN> TypeName(i) = «Integer» <SPAN style=»color:#00007F»>Then</SPAN>
MsgBox «Variable «»i»» is an integer.»
<SPAN style=»color:#00007F»>Else</SPAN>
MsgBox «Variable «»i»» is a: » & TypeName(i)
<SPAN style=»color:#00007F»>End</SPAN> <SPAN style=»color:#00007F»>If</SPAN>
<SPAN style=»color:#00007F»>If</SPAN> TypeName(j) = «Integer» <SPAN style=»color:#00007F»>Then</SPAN>
MsgBox «Variable «»j»» is an integer.»
<SPAN style=»color:#00007F»>Else</SPAN>
MsgBox «Variable «»j»» is a: » & TypeName(j)
<SPAN style=»color:#00007F»>End</SPAN> <SPAN style=»color:#00007F»>If</SPAN>
<SPAN style=»color:#00007F»>End</SPAN> <SPAN style=»color:#00007F»>Sub</SPAN></FONT>
tzenekkik
New Member
- Joined
- Jun 3, 2002
- Messages
- 39
-
#3
or try this: =TRUNC(A1;0)=A1
(provided A1 holds the value to be tested)
Scott Huish
MrExcel MVP
- Joined
- Mar 17, 2004
- Messages
- 19,961
- Office Version
-
- 365
- Platform
-
- Windows
-
#4
Sub test()
x = Range(«A1»).Value
If Int(x) / x = 1 Then
MsgBox «Value is an Integer»
Else
MsgBox «Value is not an Integer»
End If
End Sub
RalphA
Well-known Member
- Joined
- May 14, 2003
- Messages
- 3,829
-
#5
One more:
Assuming A1 has the number, put, in any other cell, the formula:
=IF(INT(A1)=A1,»True»,»False»)
tzenekkik
New Member
- Joined
- Jun 3, 2002
- Messages
- 39
-
#6
so: INT(A1)=A1 is the shortest version to test for an integer.
verblender
New Member
- Joined
- May 15, 2017
- Messages
- 1
-
#7
since you are using VBA, not checking within the formulas of a given worksheet, you can check if a cell is of integer variable type using this syntax:
If
VarType(my_variable) = vbInteger Then ‘IF my_variable if is of type Integer …
other types of comparisons for different kinds of data (date, text, etc) can be made using the following code:
If VarType(my_variable) = vbInteger Then ‘IF my_variable is of type Integer …
‘Identical to :
If VarType(my_variable) = 2 Then ‘IF my_variable is of type Integer …
based on the following table:
vbEmpty 0
vbNull 1
vbInteger 2
vbLong 3
vbSingle 4
vbDouble 5
vbCurrency 6
vbDate 7
vbString 8
vbObject 9
vbError 10
i read this on from https://www.excel-pratique.com/en/vba/conditions_continued.php which basically covers this for VBA.
SpillerBD
Well-known Member
- Joined
- Jul 2, 2014
- Messages
- 2,851
- Office Version
-
- 365
- Platform
-
- Windows
-
#8
=If (Trunc(A1)=A1,Integer,Non-Integer)
or
=If (Int(A1)=A1,Integer,Non-Integer)
I wouldn’t be surprised if the «math» and the floating point issues have some of these fail.
In VBA, you have INT function.
The other functions are available through WorksheetFunction
cubitmg
New Member
- Joined
- Feb 18, 2023
- Messages
- 1
- Office Version
-
- 2016
- Platform
-
- Windows
-
#9
If you can use a macro then I find this function works:
Public Function isInteger(varValue)
On Error GoTo Exit_isInteger ‘if not numeric then int() will throw an error and take the default False return value
isInteger = False ‘default False return value
If Int(varValue) = Val(varValue) Then isInteger = True
Exit_isInteger:
End Function
Validation
VBA provide rich collection of methods, functions can help user to build various own customized solutions. I am going to give some examples of VBA functions which developer usually looks for while developing programs.
VarType
This method provides datatype that a variable holds. VBA offers various constants to validate conditions like given below:
Constants
- vbEmpty 0
- vbNull 1
- vbInteger 2
- vbLong 3
- vbSingle 4
- vbDouble 5
- vbCurrency 6
- vbDate 7
- vbString 8
- vbObject 9
- vbError 10
Checking a valid integer data type
Sub CheckDataType() If VarType(my_variable) = vbInteger Then MsgBox"Integer" Else MsgBox"Not Integer" End If End Sub
Check valid Integer Value Method – 1
Public Function ValidateNumber(oValue As String) As Boolean If IsNumeric(oValue) Then ValidateNumber = True Else ValidateNumber = False End If End Function
This method returns true/false based on value provided as input to the parameter oValue.
Using TypeName Method-2
Public Function GetDataType(oValue As String) As String Dim i As Integer Dim j As Long i = 250 j = 2500000 If TypeName(i) = "Integer" Then GetDataType = "Variable ""i"" is an integer." Else GetDataType = "Variable ""i"" is a: " & TypeName(i) End If If TypeName(j) = "Integer" Then GetDataType = "Variable ""j"" is an integer." Else GetDataType = "Variable ""j"" is a: " & TypeName(j) End If End Function
Email Address
Public Sub CheckValidEmail() Dim oEmail As String oEmail = InputBox("Enter Email Address : ", "E-Mail Address") ' Check email syntax If IsEmailValid(oEmail) Then MsgBox oEmail & " is a valid e-mail" Else MsgBox oEmail & " is not a valid e-mail" End If End Sub
Public Function EmailValidateFunction(oEmailAddress As String) As Boolean Dim oStringArray As Variant Dim oItem As Variant Dim i As Long Dim c As String Dim isValdAddress As Boolean isValdAddress = True 'identify position of @ in the string i = Len(oEmailAddress) - Len(Application.Substitute(oEmailAddress, "@", "")) If i <> 1 Then EmailValidateFunction = False Exit Function End If ReDim oStringArray(1 To 2) oStringArray(1) = Left(oEmailAddress, InStr(1, oEmailAddress, "@", 1) - 1) oStringArray(2) = Application.Substitute(Right(oEmailAddress, Len(oEmailAddress) - Len(oStringArray(1))), "@", "") For Each oItem In oStringArray If Len(oItem) <= 0 Then isValdAddress = False EmailValidateFunction = isValdAddress Exit Function End If For i = 1 To Len(oItem) c = LCase(Mid(oItem, i, 1)) If InStr("abcdefghijklmnopqrstuvwxyz_-.", c) <= 0 And Not IsNumeric(c) Then isValdAddress = False 'Return EmailValidateFunction = isValdAddress Exit Function End If Next i If Left(oItem, 1) = "." Or Right(oItem, 1) = "." Then isValdAddress = False 'Return EmailValidateFunction = isValdAddress Exit Function End If Next oItem If InStr(oStringArray(2), ".") <= 0 Then isValdAddress = False 'Return EmailValidateFunction = isValdAddress Exit Function End If i = Len(oStringArray(2)) - InStrRev(oStringArray(2), ".") If i <> 2 And i <> 3 Then isValdAddress = False 'Return EmailValidateFunction = isValdAddress Exit Function End If If InStr(oEmailAddress, "..") > 0 Then isValdAddress = False 'Return EmailValidateFunction = isValdAddress Exit Function End If 'Return EmailValidateFunction = isValdAddress End Function
Regular Expression
To validate a mail we can use another method which provides short code to achieve same goal mentioned in previous example. RegExp is a scripting library provided by Microsoft which we need to bring in our project by adding as reference as shown below:
Code example
Public Sub CheckEmail() Dim txtEmail As String txtEmail = InputBox("Enter Email Address:", "E-Mail Address") ' Check e-mail syntax If IsEmailValid(txtEmail) Then MsgBox txtEmail & " is a valid e-mail" Else MsgBox txtEmail & " is not a valid e-mail" End If End Sub
Public Function IsEmailValid(ByVal strEmailAddress As String) As Boolean On Error GoTo Errh Dim objRegExp As New RegExp Dim blnIsValidEmail As Boolean objRegExp.IgnoreCase = True objRegExp.Global = True objRegExp.Pattern = "^([a-zA-Z0-9_-.]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$" blnIsValidEmail = objRegExp.Test(strEmailAddress) IsEmailValid = blnIsValidEmail Exit Function Errh: If Err.Number <> 0 Then IsEmailValid = False MsgBox "Error#: " & Err.Number & vbCrLf & vbCrLf & Err.Description End If End Function
Null or Empty string
Public Function IsNullOrEmpty(oValue As String) As Boolean If IsEmpty(oValue) Then IsNullOrEmpty = True Else IsNullOrEmpty = False End If End Function
Len Function
Public Function IsNullOrEmpty(oValue As String) As Boolean If Len(oValue)>0 Then IsNullOrEmpty = False Else IsNullOrEmpty = True End If End Function
IsDate Function
Public Function IsValidDate(oDate As Date) As Boolean If IsDate(oDate) Then IsValidDate = True Else IsValidDate = False End If End Function
Choose Function
Excel CHOOSE function returns a value from a list of values which should be a variant Parameter Array.
Syntax
=CHOOSE(Index As Single, ParamArray Choice() As Variant)
Code example
Function TestChoose() As String TestChoose = Choose(2, "Test", "Test1", "Test2") End Function
Output
Test1
Asc() Function
Function Test(oChar As String) As String Test = Asc(oChar) End Function
Output
65
Concatenate or &
Function Test(oVal1 As String, oVal2 As String) As String Test = oVal1 & oVal2 End Function
FORMAT() Function
This function is very useful function in VBA which holds the capability to perform various formatting on a string.
Sub CallingMethod() ''Date Formatting in VBA Debug.Print "Full Date " & Format(Now, "DD-MMM-YYYY") Debug.Print "Date With Time " & Format(Now, "DD-MMM-YYYY: hh:mm:ss") Debug.Print "Short Day " & Format(Now, "DDD") Debug.Print "Long Day " & Format(Now, "DDDD") Debug.Print "Month Number " & Format(Now, "MM") Debug.Print "Short Month " & Format(Now, "MMM") Debug.Print "Long Month " & Format(Now, "MMMM") Debug.Print "Hours " & Format(Now, "HH") End Sub
Output
Full Date 09-Dec-2017
Date With Time 09-Dec-2017: 18:35:40
Short Day Sat
Long Day Saturday
Month Number 12
Short Month Dec
Long Month December
Hours 18
There are many inbuilt functions listed below:
- INSTR() : Returns the position of the first occurrence of a substring in a string.
- INSTRREV() : Returns the position of the first occurrence of a string in another string, starting from the end of the string.
- LCASE() : Converts string in Lower Case.
- LEFT() : Returns a substring from a string, starting from the left-most character.
- LEN() : Returns length of a string.
- LTRIM() : Removes leading spaces from a string.
- MID() : Extracts a substring from a string (starting at any position).
- REPLACE() : Replaces a sequence of characters in a string with another set of characters.
- RIGHT() : Extracts a substring from a string starting from the right-most character.
- RTRIM() : Removes trailing spaces from a string.
- SPACE() : Returns a string with a specified number of spaces.
- SPLIT() : Used to split a string into substrings based on a delimiter.
- STR() : Returns a string representation of a number.
- STRCOMP() : Returns an integer value representing the result of a string comparison.
- STRCONV() : Returns a string converted to uppercase, lowercase, proper case or Unicode.
- STRREVERSE() : Returns a string whose characters are in reverse order.
- TRIM() : Returns a text value with the leading and trailing spaces removed.
- UCASE() : Converts string in Upper Case.
- VAL() : Returns the numbers found in a string.
- ISERROR(): Helps checking error.
- ISNULL() : Helps getting Object State.
- UBOUND() : Returns upper boundary of an Array.
- LBOUND() : Returns lower boundary of an Array.
Next>> GetObject Vs. CreateObject VBA
|
|
In this blog post we explain data types in VBA and provide detailed definitions for when they should be used.
Firstly a word on VBA variable names; a variable may be named anything you wish as long as it conforms to VBA’s naming rules. Variable names must start with a letter, may contain number characters or underscores ( _ ) but that’s it! Punctuation marks are not allowed. Also unlike other languages VBA is case-insensitive! This is important to understand and is demonstrated below.
Finally, there are some keywords that cannot be used as variable names.
Sub Declarations() Dim a as String ‘ a valid variable name Dim b_ as String ‘ a valid variable name Dim _b as String ‘ variable names must start with a letter Dim 2b as String ‘ variable names must start with a letter Dim c1 as String ‘ a valid variable name Dim d12 as String ‘ a valid variable name Dim e_e1 as String ‘ a valid variable name Dim f! as String ‘ punctuation not allowed in variable names Dim g as String ‘ a valid variable name Dim G as String ‘ an invalid variable name. VBA is case- ‘ insensitive, variables also cannot be ‘ declared more than once in a code block Dim aVariableName as String ‘ a valid variable name Dim a_Variable_Name as String ‘ a valid variable name Dim HELLOWORLD as String ‘ a valid variable name Dim dim as String ‘ variable name is invalid as Dim is a keyword End Sub
Boolean – (Yes/No)
A variable of type Boolean is the simplest possible data type available in VBA. It can only be set to 0 or -1. These are often thought of as states and correspond to Access’s Yes/No fields. In VBA you can assign a Boolean variable to True (-1) or False (0) or the numbers indicated in the brackets.
Notice we used capitalised words for True and False, which is because they are VBA keywords and you cannot name a variable a Keyword.
Sub trueOrFalse() Dim foo As Boolean Dim bar As Boolean foo = True ' foo holds the value True bar = False ' bar holds the value False End Sub
Integer
At the beginning of the post we said that we have to tell the computer what type of data to expect before we can work on it. An Integer is another number data type, but its value must be between -32,768 and 32,767, and it must be a whole number, that is to say, it mustn’t contain decimal places. If you or your users try to save a decimal value (eg 2.5) to an integer variable, VBA will round the decimal value up or down to fit into an Integer data-type.
Sub IntegerDataType() Dim foo As Integer Dim bar As Integer Dim oof As Integer foo = 12345 ' foo is assigned the value 12,345 bar = 2.5 ' bar is assigned the value 3 as VBA rounds it up bar = 2.4 ' bar is assigned the value 3 as VBA rounds it down foo = 32768 ' causes an overflow error as 32,768 is too big End Sub
Long
Long is another number type and works just like Integer except it can hold a much larger range; Any number between -2,147,483,648 and +2,147,483,647.
Sub LongDataType() Dim foo As Long foo = 74345 ' foo is a variable assigned the value 74,345 End Sub
Single
Single is the smaller of the two “floating point” data types. Singles can represent any decimal number between -3.4028235E+38 through 1.401298E-45 for negative numbers and 1.401298E-45 through 3.4028235E+38 for positive numbers. Put more simply, the single data type has a decimal point in it.
Sub DoubleDataType() Dim foo As Single Dim bar As Single foo = 1.1 ' foo keeps the .1 decimal part bar = -20.2 ' bar also keep the decimal part foo = foo * bar ' foo equals -22.2200008392334 End Sub
Double
This is a “floating point” number as well and range in value from -1.79769313486231570E+308 through -4.94065645841246544E-324 for negative values and from 4.94065645841246544E-324 through 1.79769313486231570E+308 for positive values.
Sub DoubleDataType() Dim foo As Double Dim bar As Double foo = 1.1 ' foo keeps the .1 decimal part bar = -20.2 ' bar also keep the decimal part foo = foo * bar ' foo equals -22.2200008392334 End Sub
Currency
This data-type is a third “floating-point data” type in disguise. It’s a Single which has been engineered to represent behaviours typical of currencies. In particular it rounds off numbers to four decimal places. See the Figure below:
Sub CurrencyDataType() Dim bar As Single Dim foo As Currency bar = 1.1234567 ' this is the Single foo = bar ' add the Single to the Currency MsgBox bar ' bar contains 1.1234567 MsgBox foo ' foo contains 1.1235. Notice that the 4th digit ' has been rounded up to 5 End Sub
Date
The Date data type is used to perform operations that involve dates AND times. In VBA there are several functions that operate on date variables which perform date and time calculations. It is important to know that date and time operations can be quite complicated and to help ease your burden you can use VBA’s DateTime object which encapsulates a lot of the difficulty of working with dates and time and can make them a little less of a headache to deal with. Date data types are the most complicated of all the data types to work with.
Here are a few operations we can do with date data types.
Sub DateDataTypes() Dim bar As Date Dim foo As Date bar = #11/15/1978# ' bar set to this date but has no time foo = #12/10/2012 11:37:00 PM# ' foo is set to this date and time bar = #1:00:09 AM# ' bar is 1 hour and 9 seconds foo = #9:00:00 PM# ' foo is 9PM foo = foo + bar ' foo is now 22:00:09 MsgBox foo foo = foo - bar ' foo is back to 9PM MsgBox foo End Sub
String
A String is any set of characters that are surrounded by double-quotation marks. For example “dog” is a String that contains three characters. Strings are very important to us as they can contain human language, and in fact contain almost any data we want, even numbers and punctuation marks. Strings are very versatile and you will use them extensively in your code. Often when you ask your users for information you will first store their input in a String before actually using the data provided; in this way Strings are often thought of as a safe data type.
Below are some Figures of Strings in action.
Sub StringDataTypes() Dim bar As String Dim foo As String Dim foobar As String bar = "Hello" ' bar now contains "Hello" foo = "world!" ' foo contains "world!" foobar = bar & " " & foo ' foobar now contains "Hello world!" ' notice that foobar has a +" "+ this means a SPACE character has been ' inserted into the String, without it foobar would contain "Helloworld!" foobar = bar + " " + foo ' This Figure also shows that you can add ' Strings together (but you cannot subtract!) foo = "H" & "E" & "L" & "P" ' foo now contains "HELP" bar = foo & foo ' bar now contains "HELPHELP" End Sub
Confusion
As stated above, when you collect input from a user you will usually collect it into a String. But be careful not to confuse String with Number data types. For example:
Sub Confusion() Dim bar, foo As String Dim foobar As String foo = "12.5" ' user inputs "12.5" bar = "6.3" ' user inputs "6.3" foobar = foo * bar ' we multiple 12.5 and 6.3 Debug.Print foobar ' print the result - 0 ' It's ZERO! ' Remember foo and bar are STRING data types, 'so multiplying foo and bar as above is like 'saying "aaa" * "bbb" = 11 ? It doesn't make sense. 'But we collect data in a String because a String 'can accept all user input, even if they 12 put a 'punctuation mark in there. foo = "12.5.2" ' user made a mistake bar = "ifvgj212m" ' cat walks across the keyboard ' When collecting user input the data held in a String 'can be tested for accuracy and correctness before we 'load it into an Integer. If the user has not entered 'data correctly we ignore or display a useful message 'like "Error"... End Sub
Variant
A variant is a special type which can contain any of the data types mentioned above (along with some others).
When a value is assigned to the variant data type the variable mutates into the type of the data assigned to it, and in some cases VBA can “detect” the type of data being passed and automatically assign a “correct” data type. This is useful for collecting data from users and also for writing procedures and functions for which you want to be able to call with a variable of any type.
Sub VariantDataType() Dim bar As Variant Dim foo As Variant Dim foobar As Variant bar = 1 ' bar is now an Integer foo = "oi!" ' foo is now a String foobar = bar + 1.1 ' foobar is now a Double with the value of 2.1 MsgBox TypeName(bar) ' Integer MsgBox TypeName(foo) ' String MsgBox TypeName(foobar) ' Double End Sub
Related Posts
Variables Variables
Я хочу выполнить какую-то задачу, основанную на некоторых если
Мой (неполный) код
Sub checkif()
Dim s
With ActiveDocument.Range
s = Val(ActiveDocument.Paragraphs.Count)
s = s / 5
If s = Integer then
perform some task
Else
Exit Sub
End If
End With
End Sub
Я совершенно новичок в VBA, и есть так много ответов. Я пробовал несколько. один
Sub checkif2()
Dim s
With ActiveDocument.Range
s = Val(ActiveDocument.Paragraphs.Count)
s = s / 5
If IsNumeric(s) Then
MsgBox "is integer"
Else
MsgBox "not integer"
Exit Sub
End If
End With
End Sub
Это всегда целое число.
Проверил еще один
Sub checkif2()
Dim s
With ActiveDocument.Range
s = Val(ActiveDocument.Paragraphs.Count)
s = s / 5
If TypeName(s) = "Integer" Then
MsgBox "is integer"
Else
MsgBox "not integer"
Exit Sub
End If
End With
End Sub
Всегда указывайте не целое число. Есть ли какой-нибудь метод для Word VBA?
2 ответа
Лучший ответ
If s = Fix(s)
— односторонний.
Fix
удаляет дробную часть.
Другой подход в вашем случае — проверить, равен ли базовый 5 модуль нулю, прежде чем делать деление. Для этого используйте Mod
: If s Mod 5 = 0
.
1
Bathsheba
9 Дек 2015 в 08:38
Пробуя ответ Рахула, обнаружил, что это самый простой способ.
If s = Int(s) Then
Пробовал для меньшего файла. Я проверю с файлами большего размера и расскажу.
1
user5657754user5657754
9 Дек 2015 в 07:50