Condition en fonction du type de variable

Bonjour forum,

j'ai reproduit une infime portion d'une feuille comprenant des nombres, des cellules vides, des chiffres entiers,...

Je veux convertir certains éléments de cette feuille comme suit:

les nombres entiers: restent inchangés,

les nombres décimales (avec une virgule): doivent être multipliés par 1000,

les cellules avec 2 virgules: les virgules doivent éliminées,

les chiffres avec un ".": le point doivent ête remplacés par une virgule,

les celulles vides ou comprenant tout autre forme de texte: doit rester identiques.

J'ai préparé une simple macro pour faire les conversions mais elle ne fonctionne pas.

J'aimerais connaitre mon erreur.

Merci d'avance

Le mieux serait de proposer le fichier à traiter ou au moins la macro.

Selon ce que je vois de mon côté, le fichier incluant la macro est jointe au message original.

Merci

Jean-Luc

Oups, désolé.

Bonjour,

Sub Macro1()
    Dim datas, lig As Long, col As Long, tmp
    datas = [A1:K3].Value
    For lig = 1 To UBound(datas)
        For col = 1 To UBound(datas, 2)
            If IsNumeric(datas(lig, col)) Then
                If datas(lig, col) - Int(datas(lig, col)) > 0 Then datas(lig, col) = datas(lig, col) * 1000
            Else
                If datas(lig, col) Like "*,*,*" Then
                    On Error GoTo suite
                    tmp = CDbl(Replace(datas(lig, col), ",", ""))
                    On Error GoTo 0
                    datas(lig, col) = tmp
suite:
                ElseIf InStr(datas(lig, col), ",") > 0 Then
                    datas(lig, col) = Replace(datas(lig, col), ",", ".")
                End If
            End If
        Next col
    Next lig
    [A12:K14] = datas
End Sub

j'ai supposé que tu n'y avais pas de texte de la forme "ab , cd"

eric

Bonjour tout le monde : une variante à optimiser.

Sub Macro1()
    Dim nL As Integer, nC As Integer

    nL = Sheets("Feuil1").Cells(Columns.Count, 2).End(xlUp).Row
    nC = Cells(1, Columns.Count).End(xlToLeft).Column

    For i = 1 To nL
        For j = 1 To nC
            If Cells(i, j) <> "" Then
                ' Nombre
                If IsNumeric(Cells(i, j)) Then
                    If Int(Cells(i, j)) <> Cells(i, j) Then
                        Cells(i, j) = Cells(i, j) * 1000
                    End If
                Else
                ' String
                    Cells(i, j).Select
                    If InStr(Cells(i, j), ",") > 0 Then Cells(i, j) = Replace(Cells(i, j), ",", "")
                    If InStr(Cells(i, j), ".") > 0 Then Cells(i, j) = Replace(Cells(i, j), ".", "")
                End If
            End If
        Next j
    Next i
End Sub

Bonjour Eriic,

je vous remercie pour votre solution rapide que je vais adapter aux corrections de je dois apporter à ma base de données. Néanmoins, je continue de me demander pourquoi les quelques lignes de ma VBA ignoraient les cellules avec des entiers ainsi que les cellules non numériques. Des réponses?

 For i = 1 To 3
  For j = 1 To 11
     If Not IsNumeric(Cells(i, j)) Then
        ActiveCell.Replace What:=",", Replacement:=""
        ActiveCell.Replace What:=".", Replacement:=","
     End If

     If VarType(Cells(i, j)) = 2 Then
     Else
     Cells(i, j).Value = Cells(i, j) * 1000
     End If

Je vous remercie pour vos solutions. Pour ma part, il semble bien que je n'ai pas tout à fait saisi les notions du cours VBA chapitre 4: les conditions partie 2

https://www.excel-pratique.com/fr/vba/conditions_suite

Je vais continuer de creuser un peu plus ces notions.

Merci encore à vous tous,

JL

Toutes les cellules numériques sont toujours Variant/Double.

Je crois qu'on peut dire que c'est un bug lorsqu'on utilise la fonction VarType avec les cellules du tableur. Comme l'a écrit eriiic, VarType( ) ne fait pas la différence entre un entier et un réel, alors qu'elle fonctionne parfaitement sous VB 6.0 ou VB.net.

    Dim var

    var = 12345
    MsgBox VarType(var) '===> 2

    var = 1.2345
    MsgBox VarType(var) '===> 5

Donc le plus sage est ne ne pas utiliser la fonction vbType() en VBA.

Bonjour,

ce n'est pas tout à fait ce que j'ai dit.
C'est excel qui ne met que des doubles dans les feuilles, VarType répond donc correctement.
eric

Bonjour à vous deux,

vos dernières répliques confirment ce que je suspectais sans vraiment en avoir la preuve. J'apprécie vos explications supplémentaires. Il serait peut-être pertinent d'apporter ces précisions dans le cours d'Excel VBA en ligne.

Encore un gros merci

JL

Rechercher des sujets similaires à "condition fonction type variable"