2015-12-03 4 views
0

Проблема в том, что когда я изменяю значение в I16 или I17, я получаю сообщение об ошибке. Как я могу предотвратить эту ошибку? Я проверяю I16 и I17 для имен листов, потому что каждую неделю появляется обновленный лист. СпасибоIFERROR в этом макросе?

Sub Compare() 


Call compareSheets(range("I16").Value, range("I17").Value) 


End Sub 




Sub compareSheets(Sofon As String, Sofon2 As String) 


Dim mycell As range 
Dim mydiffs As Integer 


For Each mycell In ActiveWorkbook.Worksheets(Sofon2).range("M:M") 
If Not mycell.Value = ActiveWorkbook.Worksheets(Sofon).Cells(mycell.Row, mycell.Column).Value Then 


mycell.Interior.Color = vbYellow 
mydiffs = mydiffs + 1 


End If 
Next 


MsgBox mydiffs & " differences found in Column M (Salesman)", vbInformation 


ActiveWorkbook.Sheets(Sofon2).Select 


End Sub 
+1

* У меня есть ошибка * - Какую ошибку вы получаете? Кроме того, уверены ли вы, что листы существуют в книге после того, как вы изменили их в «I16» и «I17»? Ваш код также будет лучше обслуживаться **, а не ** перебирать через * каждую * ячейку в столбце 'M', а вместо этого перебирать только ячейки с данными (путем поиска последней строки с данными в ней и установки ее до конца ассортимент). –

+0

Я получаю: Ошибка во время выполнения '9' Подзаголовок вне диапазона. Это происходит, когда я меняю I16 или I17 на значение, которое не коррелирует с именем одного из листов. Но я хочу, чтобы это было безупречным, поэтому я хочу знать, как вы можете добавить к нему IFERROR. Если у вас есть идея, пожалуйста, дайте мне знать. –

+1

Посмотрите на 'On Error GoTo'. –

ответ

2

Вы могли бы использовать что-то похожее на это, чтобы позвонить compareSheets. Он предупредит вас, если любой из двух диапазонов не соответствует именам листов и не будет вызывать compareSheets, если это правда.

Dim Sheet1 As Worksheet 
Dim boolI16SheetCheck As Boolean 
Dim boolI17SheetCheck As Boolean 

    boolI16SheetCheck = False 
    boolI17SheetCheck = False 

    For Each Sheet1 in ActiveWorkbook.Worksheets 
     If Sheet1.Name = Activesheet.Range("I16").Value Then boolI16SheetCheck = True 
     If Sheet1.Name = Activesheet.Range("I17").Value Then boolI17SheetCheck = True 
     If boolI16SheetCheck = True And boolI17SheetCheck = True Then 
      Call compareSheets(range("I16").Value, range("I17").Value) 
      Exit Sub 
     End If 
    Next Sheet1 

    If boolI16SheetCheck = False Then 
     If boolI17SheetCheck = False Then 
      Msgbox "Neither I16 nor I17 sheet found." 
     Else 
      Msgbox "I16 sheet not found." 
     End If 
    Else 
     Msgbox "I17 sheet not found." 
    End If 

End Sub

+1

'On Error GoTo', как было предложено @scottcraner, также будет работать и будет немного короче. Мои личные предпочтения - предотвращать ошибки до их возникновения, особенно потому, что On Error может быть затруднительным для сброса. – puzzlepiece87

+0

Увидев ответ @ScottHoltzman, я решил проверить, были ли найдены оба листа уже после каждой петли листа, а не через каждый лист. Спасибо, Скотт! – puzzlepiece87

3

Просто, чтобы показать, что я имел в виду.

Я согласен с puzzlepiece87 в том, что On Error искусно, но с чем-то этим простым я использовал бы его, чтобы избежать лишних циклов.

Sub compareSheets(Sofon As String, Sofon2 As String) 

Dim mycell As Range 
Dim mydiffs As Integer 

On Error GoTo nosheet 
For Each mycell In ActiveWorkbook.Worksheets(Sofon2).Range("M:M") 
    If Not mycell.Value = ActiveWorkbook.Worksheets(Sofon).Cells(mycell.Row, mycell.Column).Value Then 
     mycell.Interior.Color = vbYellow 
     mydiffs = mydiffs + 1 
    End If 
Next 


MsgBox mydiffs & " differences found in Column M (Salesman)", vbInformation 
ActiveWorkbook.Sheets(Sofon2).Select 
Exit Sub 

nosheet: 
If Err.Number = 9 Then 
    MsgBox "One or both sheets do not exist" 
Else 
    MsgBox Err.Description 
End If 

End Sub 
2

Поскольку ОП нужен был ISERROR типа решения, я решил разместить код, который включает в себя функцию для проверки, если лист существует в книге. Концепция похожа на уже опубликованные ответы, но она содержит любые инструкции On Error внутри функции и использует регулярные кодовые блоки для оценки ошибок.

Sub Compare() 

Dim bGo As Boolean 
Dim s1 As String, s2 As String 
s1 = Range("I16").Value2 
s2 = Range("I17").Value2 

If Not WorksheetExist(s1) Then 
    bGo = False 
    MsgBox "The sheet " & s1 & " does not exist in this workbook." 
End If 

If Not WorksheetExist(s2) Then 
    bGo = False 
    MsgBox "The sheet " & s2 & " does not exist in this workbook." 
End If 

If bGo Then compareSheets s1, s2 

End Sub 


Function WorksheetExist(sName As String, Optional wb As Workbook) As Boolean 

    Dim wbCheck As Workbook, ws As Worksheet 
    If wb Is Nothing Then Set wbCheck = ThisWorkbook Else: Set wbCheck = wb 

    On Error Resume Next 
    Set ws = wbCheck.Sheets(sName) 
    On Error GoTo 0 

    If Not ws Is Nothing Then WorksheetExist = True Else: WorksheetExist = False 

End Function 

И, основываясь на методологии @ puzzlepiece87, вот улучшилосьWorksheetExist Function, что исключает из On Error отчетности в целом.

Function WorksheetExist(sName As String, Optional wb As Workbook) As Boolean 

Dim wbCheck As Workbook, ws As Worksheet 
If wb Is Nothing Then Set wbCheck = ThisWorkbook Else: Set wbCheck = wb 

WorksheetExist = False 

For Each ws In wbCheck.Worksheets 
    If ws.Name = sName Then 
     WorksheetExist = True 
     Exit For 
    End If 
Next 

End Function 
Смежные вопросы