0
votes

Comment faire pour qu'Excel VBA reconnaisse les cellules numériques?

J'ai un tableau de nombres qui sont tous alignés à gauche (c'est-à-dire qu'Excel les reconnaît comme du texte)

J'exécute un script VBA sur toutes les cellules:

cell.value = cell.Value * 1

Ce droit les aligne tous et Excel les a reconnus comme des nombres sauf pour les décimales (par exemple, 3.14 ne fonctionne pas tandis que 314 fonctionne). J'exécute également un script de recherche et de remplacement, où la recherche est pour l'espace ("") et le remplace par un espace (""), donc cela devrait éliminer au moins l'espace commun.

: Si j'exécute la formule = Valeur (A1) dans Excel, Excel reconnaîtra même les décimales comme un nombre. Si j'exécute Workbookfunction.value (A1) Excel ne reconnaîtra pas comme un nombre.

Le problème semble donc être lié à VBA (?) Et aux décimales. Des solutions?

J'ai maintenant exécuté ce qui suit après les commentaires ici:

For Each cell In rng
Dim vNumber As Double
On Error Resume Next
'Remove space
cell.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
   SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  ReplaceFormat:=False

'Remove comma
cell.Replace What:=",", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
   ReplaceFormat:=False

'Check if empty, if it is: Do nothing
If IsEmpty(cell) = True Then

Else
vNumber = CDbl(cell.Value)
cell.Value = vNumber
End If

'Check if numeric
If IsNumeric(cell) = True Then
cell.Interior.Color = RGB(0, 254, 0)
cell.Interior.TintAndShade = 0.8

Else
cell.Interior.Color = RGB(100, 0, 0)
cell.Interior.TintAndShade = 0.8

End If
Next cell

Le résultat est le suivant Avant et Après (où l'un est avec Double et l'autre avec Variant. D'une manière ou d'une autre, son écriture sur des cellules qui ne sont pas des décimales ...

entrez la description de l'image ici

 entrez la description de l'image ici


5 commentaires

J'ai juste essayé de modifier votre question pour filtrer les éléments non pertinents - et j'ai échoué. Les informations pertinentes ne sont tout simplement pas là. Votre première ligne semble indiquer que vous avez du texte. Mais je manque l'information selon laquelle les cellules ne contiennent que des nombres. Votre question est de savoir comment reconnaître les valeurs numériques et cela implique qu'il y en a qui ne sont pas numériques. Tout le reste de votre message (sauf pour la première ligne) indique que vous laissez votre code écrire le résultat correct dans une cellule dont vous ne savez pas comment définir le format. Ainsi, 3.14 est affiché comme 3 et vous blâmez le code au lieu du format de cellule.


Ce que je voudrais savoir, c'est que si la cellule "Avant" est un texte (aligné à gauche) "1.5", quelle devrait être la sortie. Au lieu du "13.9" que vous entrez, que voulez-vous sortir? La suppression des virgules peut être utile si le séparateur décimal de votre système est un point et que les données comportent une virgule à la place. Tu ne dis pas. La suppression d'espaces ne devrait pas être utile et vous ne montrez pas non plus où vos données d'origine ont des espaces. La conversion de 13,6 en 5 est un signe de code défectueux, pas de VBA défectueux. Veuillez nous faciliter la tâche. Dites-nous simplement ce que vous voulez.


"si la cellule" Avant "est un texte (aligné à gauche)" 1.5 "quelle devrait être la sortie." "1.5" + formaté pour qu'Excel reconnaisse que c'est un nombre. Au départ, Excel ne le reconnaît pas comme un nombre. Au lieu du "13.9" que vous entrez, que voulez-vous sortir? "13,9". Comme ci-dessus. "La conversion de 13,6 en 5 est un signe de code défectueux, pas de VBA défectueux." Oui, je suis d'accord. C'est pourquoi je demande de l'aide :)


Mon code révisé suppose que le format de cellule de la cellule cible est "Général". Lorsque vous modifiez ce format, l'affichage change également. Veuillez vous renseigner sur les formats de cellule pour obtenir un meilleur contrôle, mais utilisez "Général" jusqu'à ce que vous le fassiez. Cliquez avec le bouton droit sur une cellule, sélectionnez Format de cellule> Nombres et regardez les formats disponibles. Google pour obtenir des instructions pour définir des formats de cellule personnalisés si vous en avez besoin.


Je connais le formatage des cellules. L'objectif est d'automatiser au maximum cette phase de validation des données. Cliquer manuellement dans un menu déroulant ne correspond pas à l'objectif :)


3 Réponses :


1
votes

Vous devez convertir la valeur de la cellule en un double. Par exemple:

Dim myDouble As Double
myDouble = CDbl(Range("A1").Value)
Debug.Print myDouble
myDouble = myDouble + 1
Debug.Print myDouble

Les lignes 3 à 5 sont juste pour démontrer qu'il est reconnu comme un décimal.


2 commentaires

Merci! Obtenir des résultats étranges .... Pour chaque cellule In rng Dim vNumber As Double If IsEmpty (cell) = True Then Else vNumber = CDbl (cell.Value) cell.Value = vNumber End If Il parcourt tout sauf les entiers écrasent toutes les décimales en dessous. Je vais essayer de publier une capture d'écran.


Si vous avez du code supplémentaire à afficher, vous pouvez modifier votre message d'origine pour afficher le nouveau code. De cette façon, vous pouvez l'insérer sous forme de "code", ce qui le rend plus facile à lire :)



1
votes

Val (Cells (1,1) .Value convertira une chaîne en nombre si elle est numérique, en zéro si ce n'est pas le cas. "123abc" sera converti en nombre 123. IsNumeric (Cells (1,1) .Value) retournera True s'il n'y a pas de caractères non numériques dans la chaîne de la cellule.

Incidemment, la fonction Val () de VBA ignorera les espaces. Val (123 456 ") renverra le numéro 123456.

Le code ci-dessous répondra à vos exigences mises à jour. Veuillez l'essayer.

Sub ConvertTextToNumbers()

    Dim Rng As Range
    Dim Cell As Range
    Dim Arr As Variant
    Dim R As Long

    With Worksheets("Sheet1")           ' modify to suit
        Set Rng = .Range(.Cells(2, "B"), .Cells(.Rows.Count, "B").End(xlUp))
        Arr = Rng.Value

        For R = 1 To UBound(Arr)
            ' remove commas and spaces
            Arr(R, 1) = Val(Replace(Replace(Arr(R, 1), " ", ""), ",", ""))
        Next R

        Rng.Offset(0, 1).Value = Arr

        For Each Cell In Rng.Offset(0, 1)
            Cell.Interior.Color = IIf(Cell.Value, vbGreen, vbRed)
        Next Cell
    End With
End Sub

p >


7 commentaires

Merci, mais cela ne semble pas répondre à mes besoins. J'ai besoin de blancs pour rester vides. De plus, s'il y a quelque chose de non numérique, j'ai besoin qu'il soit signalé afin que je puisse l'examiner et le corriger si nécessaire. Je ne peux pas laisser Excel deviner ce que cela pourrait être.


Veuillez nous indiquer le type de données dont vous disposez et le type de sortie que vous souhaitez. Votre question est quelque part cachée dans votre récit et la solution dont vous avez besoin est contenue, je vous assure, dans ma réponse ci-dessus. Mais pour avoir une réponse plus précise, vous devez poser une question précise. De quel type de données disposez-vous: texte, chiffres, texte numérique? De quel type de sortie avez-vous besoin? Entiers, double, texte, texte numérique, dates?


J'ai des données qui ne devraient être que des chiffres mais qui peuvent contenir n'importe quoi. Il est également formaté sous forme de texte. Je veux: 1) nettoyer les espaces et les virgules 2) obtenir le bon formatage pour qu'Excel puisse vérifier si ses données numériques sont ou non 3) marquer les données numériques comme numériques (vert) 4) marquer les données non numériques comme non numériques (rouge)


C'est bien! Facile à faire. J'ai mis à jour ma réponse. Passe une bonne journée!


Merci! Je l'ai essayé, voir une nouvelle image pour le résultat. Pour mes besoins, j'ai toujours besoin des blancs pour rester blancs (celui-ci les convertit en zéros). J'en ai également besoin pour effectuer les opérations et les enregistrer dans les mêmes cellules que celles où se trouvent les données (maintenant leur enregistrement dans la colonne à côté des données). Je vais examiner cela et voir si je peux le modifier. Merci encore! :)


Les zéros peuvent être causés par des blancs ou des textes. Je pensais que cela pouvait faire une différence et je ne savais pas quel type de zéro supprimer. N'oubliez pas que vous pouvez également rendre les zéros invisibles. Vous avez raison de penser que la modification est simple à partir de maintenant, mais des éclaircissements sont encore nécessaires. Il y a beaucoup de réponses ici. Veuillez vous concentrer sur l'un d'entre eux maintenant avec l'objectif de le marquer éventuellement comme sélectionné quand il fait ce que vous voulez.


On dirait que Variatus a ce dont vous avez besoin. Pour garder les blancs, ajoutez simplement un If avant de modifier Arr (R, 1). Vous pouvez mettre If Len (Arr (R, 1))> 0 Then . Cela vérifiera les blancs car la longueur sera égale à zéro. Pour le garder dans la même colonne, supprimez simplement le .Offset (0,1) des deux lignes de code.



1
votes

Avez-vous essayé la conversion?

Sub test()

    Dim rng As Range, cell As Range

    With ThisWorkbook.Worksheets("Sheet1")

        Set rng = .Range("A1:A5")

        For Each cell In rng
            .Range("B" & cell.Row).Value = CDbl(cell)
        Next cell

    End With

End Sub

Résultats:

 entrez la description de l'image ici p >


1 commentaires

Je me demande pourquoi le vôtre fonctionne et le mien finit par remplacer les nombres contenant des décimales ... Peut-être lié à la façon dont je définis ma plage? En outre, existe-t-il un moyen d'implémenter cela afin que les données soient écrites dans la même cellule?