2017-03-14 4 views
1

Je possède ce programme; qui analyse les valeurs d'un système distant. Parfois, il peut arriver à expiration si le réseau est en panne et il va mettre en erreur #nan ou quelque chose de similaire.Supprimer le contenu de la cellule, IFIsNumeric = Alors Faux

Lorsque je tente et d'écrire ce message d'erreur à une base de données; il se trompe pour un "Data Type Mismatch" puisqu'il cherche une valeur numérique.

Pour contourner cela, je décidé d'essayer de nettoyer les résultats. J'ai donc ce code ci-dessous. Cela fonctionne la plupart du temps; Ce que je vois à l'échec, c'est s'il y a un nombre numérique à mi-chemin et ensuite il recommence. Une fois arrivé au numéro numérique, il semble qu'il arrête la boucle et ne nettoie rien d'autre.

Chaque fois que quelqu'un d'aide peut me donner serait génial; et peut-être que je fais cela d'une mauvaise façon. J'ai essayé de donner des exemples de ce que j'essaie de voir ci-dessous. S'il vous plaît laissez-moi savoir si vous avez des suggestions ou des questions.

Private Sub Clean() 
'Select Current Row For where to start cleaning. LoopIndex is a global variable. 
'Just giving the line of where to read from so I do not need to read the whole sheet. 
    Range("B" & LoopIndex).Select 

'Start the loop, to go through the entire row. 
    Do Until IsEmpty(ActiveCell) 

    'Checks if it is a number value; if it is not it will clear out the data. 
    If IsNumeric(ActiveCell.Value) = False Then 
     ActiveCell.Value = "" 
    End If 
    ActiveCell.Offset(0, 1).Select 
Loop 
End Sub 

À quoi il ressemble.

|A  |B  |C  |D  | 
|#error|#Error|3  |#Error| 

Ce que je veux qu'il ressemble.

|A  |B  |C  |D  | 
|  |  |3  |  | 

Ce qu'il fait.

|A  |B  |C  |D  | 
|  |  |3  |#Error| 
+1

Où avez-vous 'LoopIndex'? Aussi, il est préférable de [éviter d'utiliser '.Select' /' .Activate'] (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros). – BruceWayne

+0

C'est une variable globale que je lui ai assignée. Je l'ai eu dans la section des commentaires. – user2644176

+0

@ user2644176 Je serais prudent en utilisant faire jusqu'à boucles. IMO il est beaucoup plus sûr de spécifier la gamme que vous voulez nettoyer et simplement faire une boucle à travers les cellules pour les nettoyer. Votre gamme est-elle variable? Y at-il une raison pour laquelle ma réponse ne fonctionnera pas pour vous? Faites le moi savoir et je vais vous aider à le faire fonctionner. Quant à savoir pourquoi le vôtre n'est pas, je voudrais essayer quelque chose en plus de 'IsEmpty' - Peut vouloir utiliser' ActiveCell = "" 'à la place. En outre, il semblait fonctionner correctement sur ma machine (bien que pour une seule ligne). – user1274820

Répondre

3

Essayez cette

Sub RemoveErrors(TheRange As Range) 
Dim c 
For Each c In TheRange 
    If IsError(c) Then c.Value = "" 
Next c 
End Sub 

Edit: Version sans boucle qui peut accélérer un peu les choses si elles sont des erreurs de formule

Sub RemoveErrors(TheRange As Range) 
On Error Resume Next 
TheRange.SpecialCells(xlCellTypeFormulas, xlErrors).Value = vbNullString 
On Error GoTo 0 
End Sub 

utiliser comme ceci:

Sub Test() 
RemoveErrors Range("A1:D21") 
End Sub 

Si vous préférez utiliser la fonction IsNumeric, utilisez ceci:

Sub RemoveNAN(TheRange As Range) 
Dim c 
For Each c In TheRange 
    If IsNumeric(c) = False Then c.Value = "" 
Next c 
End Sub 
+1

Merci. Cela semble bien fonctionner. La gamme sera variable que ce n'est pas un problème. J'aime le For Each et IsError que vous avez fait ici. Semble beaucoup plus élégant que comment je le faisais. Je vous en suis reconnaissant. – user2644176

1

Voilà comment je fini par le faire, pour les variables varie sur des feuilles différentes. Je ne poste que ceci pour donner aux autres une solution à l'avenir.

Nous vous remercions de l'aide tout le monde à ce sujet.

Private Sub Clean() 

Dim StartRow As String 
Dim LastCol As Long 
Dim EndRow As String 
Dim StartCol As String 
Dim MyCol As String 

StartCol = "B" 


With ActiveSheet 
     LastCol = .Cells(LoopIndex, .Columns.Count).End(xlToLeft).Column 
End With 

MyCol = GetColumnLetter(LastCol) 


RemoveErrors Range(StartCol & LoopIndex & ":" & MyCol & LoopIndex) 


End Sub 

'Does the replacing 
Sub RemoveErrors(TheRange As Range) 
Dim c 
For Each c In TheRange 
    If IsError(c) Then c.Value = "" 
Next c 
End Sub 

'Gets the Column Letter 
Function GetColumnLetter(colNum As Long) As String 
    Dim vArr 
    vArr = Split(Cells(1, colNum).Address(True, False), "$") 
    GetColumnLetter = vArr(0) 
End Function