web-dev-qa-db-fra.com

comment exprimer le terme si x est un entier en langage VBA?

comment exprimer le terme si x est un entier en langage VBA? Je veux écrire un code qui fait quelque chose si x est un entier et fait autre chose si ce n'est pas avec vba Excel.

Sub dim()
  Dim x is Variant

  'if x is integer Then 

  'Else:

End Sub 
17
excel34
If IsNumeric(x) Then 'it will check if x is a number

Si vous souhaitez vérifier le type, vous pouvez utiliser

If TypeName(x) = "Integer" Then
24
shahkalpesh

Cela peut convenir:

If x = Int(x) Then
15
Fionnuala

Cela dépend si vous voulez dire le type de données "Integer", ou Integer dans le sens de: "Un nombre sans décimal". Si vous vouliez dire ce dernier, alors un test manuel rapide suffira (voir le premier exemple); si vous vouliez dire le premier, il existe trois façons d'examiner les types de données, toutes avec divers avantages et inconvénients:

  1. VarType vous indiquera le sous-type de la variante (voir exemple). C'est raisonnablement rapide car il s'agit simplement d'une mémoire lue dans une énumération, mais ne peut être utilisé que sur des variantes et ne vous indiquera pas le type d'objet spécifique. De plus, le sous-type du variant est souvent attribué automatiquement (généralement tendant à taper avec le plus petit type de données approprié). Mais cela peut être délicat (voir exemple).
  2. TypeName est le plus flexible et le plus robuste. Il peut vous indiquer des types de classes spécifiques et des sous-types de variantes. Il a un léger inconvénient en ce que le test nécessite une comparaison de chaînes, donc il y a un minuscule coup de performance. Cela ne sera pas perceptible à moins qu'il y ait une répétition sérieuse. De plus, si vous avez deux objets du même nom dans votre projet (exemple Word.Range et Excel.Range), TypeName ne peut pas faire la différence (il renverra "Range" pour les deux).
  3. Enfin, il y a l'opérateur TypeOf (qui ne vous aidera pas ici). L'opérateur TypeOf ne peut pas tester les primitives (exemple: Integer, Long, String, etc.) mais il peut indiquer le type spécifique d'objet (exemple. Excel.Range vs Word.Range). L'opérateur TypeOf lancera une erreur si l'objet n'est rien, donc vous devez toujours prétester l'objet pour "Not Is Nothing" mais étant un opérateur plutôt qu'une fonction, il est beaucoup plus rapide que TypeName (même avec le prétest).
Public Sub ExampleManual()
    Dim d As Double
    d = 1
    If Fix(d) = d Then
        MsgBox "Integer"
    End If
End Sub

Public Sub ExampleTypeName()
    Dim x As Integer
    MsgBox TypeName(x)
End Sub

Public Sub ExampleTypeOf()
    Dim x As Excel.Range
    Set x = Selection
    ''//Using TypeOf on Objects set to Nothing will throw an error.
    If Not x Is Nothing Then
        If TypeOf x Is Excel.Range Then
            MsgBox "Range"
        End If
    End If
End Sub

Public Sub ExampleVarType()
    Dim x As Variant
    ''//These are all different types:
    x = "1"
    x = 1
    x = 1&
    x = 1#
    Select Case VarType(x)
        Case vbEmpty
        Case vbNull
        Case vbInteger
        Case vbLong
        Case vbSingle
        Case vbDouble
        Case vbCurrency
        Case vbDate
        Case vbString
        Case vbObject
        Case vbError
        Case vbBoolean
        Case vbVariant
        Case vbDataObject
        Case vbDecimal
        Case vbByte
        Case vbUserDefinedType
        Case vbArray
        Case Else
    End Select
End Sub
12
Oorang