2017-03-14 5 views
1

このプログラムはあります。リモートシステムから値をスキャンします。時には、ネットワークがダウンしていて、#nanエラーかそれに類するものが入るとタイムアウトすることがあります。セルから内容を削除する、IFIsNumeric = False

私はそのエラーメッセージをデータベースに書き込もうとします。それは数値を探しているので「データ型の不一致」のためにエラーになります。

これを回避するために、私は結果を整理しようと決めました。だから私は以下のコードを持っています。それはほとんどの時間で動作します。途中で数字の数字があり、それが再び間違っている場合、私はそれが失敗するのを見ている。数字の数字になると、ループを止めて他のものをクリーンアップしないようです。

誰かが私に与えることができる援助は素晴らしいでしょう。おそらく私はこれを悪い方法でやっています。私は、以下に見ようとしていることの例を挙げようとしました。ご意見やご質問がありましたらお知らせください。

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 

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

私はそれを見たいと思っています。

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

何をしているのですか?

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

「LoopIndex」はどこですか?また、[.Select'/'.Activate'](https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)の使用を避けるのが最善です。 – BruceWayne

+0

これは私が割り当てたグローバル変数です。コメント欄にそれがありました。 – user2644176

+0

@ user2644176私はdoループを使うのに注意します。 IMOでは、洗浄したい範囲を指定し、細胞を洗浄して洗浄するだけの方が安全です。あなたの範囲は可変ですか?私の答えがあなたにとってうまくいかない理由はありますか?私に知らせて、それを働かせるのを手伝ってくれるでしょう。あなたがなぜそうでないのかについては、 'IsEmpty'以外のものを試してみましょう - 代わりに' ActiveCell = "" 'を使いたいかもしれません。また、私のマシンではうまく動作するように見えました(しかし、たった1行です)。 – user1274820

答えて

3

この

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

を編集してみてください。

:バージョンループのない彼らは数式エラーであれば少し物事をスピードアップすることがあり

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

はこのようにそれを使用します

Sub Test() 
RemoveErrors Range("A1:D21") 
End Sub 
あなたが IsNumeric機能を使用する場合は

、これを使用します。

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

ありがとうございます。これはうまくいくように見えます。範囲は変わりませんが問題はありません。私はここでやったFor EachとIsErrorが好きです。私はそれをどうやってやっていたか、はるかにエレガントに思えます。それは有り難いです。 – user2644176

1

これは、私はそれをやってしまった方法である変数に対して異なるシート上の範囲です。私はこれを投稿して、他の人に将来の解決策を提供しています。

ありがとうございました。

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 
関連する問題