2017-03-14 1 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 until 루프를 사용할 때주의해야합니다. IMO 청소하려는 범위를 지정하고 세포를 청소하여 루프를 청소하는 것이 훨씬 안전합니다. 범위 변수가 맞습니까? 내 대답이 당신에게 효과가 없을 이유가 있습니까? 나에게 알려 줘서 내가 일하도록 도와 줄거야. 왜 당신이 아닌지, 나는'IsEmpty' 이외의 것을 시도 할 것이다. 대신'ActiveCell = ""'을 사용하고 싶을 것이다. 또한 내 컴퓨터에서 제대로 작동하는 것처럼 보였습니다 (단 한 줄만). – 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 Is와 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 
관련 문제