IFERROR in in this macro?

匿名 (未验证) 提交于 2019-12-03 01:26:01

问题:

The problem is that when I change the value in I16 or I17 I get an error. How can I prevent this error from happening? I check in I16 and I17 for the sheetnames, because every week an updated sheet comes available. Thank you

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:

Just to show what I was thinking.

I agree with puzzlepiece87 that On Error is finicky, but with something this simple I would use it to avoid the excess loops.

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:

Since the OP wanted an ISERROR type of solution, I decided to post the code which incorporates a function to check if a sheet exists in a workbook. The concept is similar to answers already posted, but it keeps any On Error statements strictly inside the function and uses regular code blocks to evaluate errors.

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

And, based on @puzzlepiece87 methodology, here is an improved WorksheetExist Function that eliminates of On Error statements altogether.

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


回答3:

You could use something similar to this to call compareSheets. It will warn you if either of the two ranges do not correspond to sheet names and won't call compareSheets if true.

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



转载请标明出处:IFERROR in in this macro?
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!