Excel 在这个宏中有错误吗?
问题是,当我更改I16或I17中的值时,我会得到一个错误。怎样 我可以防止这个错误发生吗? 我在I16和I17中查看SheetName,因为每周都会有更新的工作表可用。 多谢各位Excel 在这个宏中有错误吗?,excel,vba,Excel,Vba,问题是,当我更改I16或I17中的值时,我会得到一个错误。怎样 我可以防止这个错误发生吗? 我在I16和I17中查看SheetName,因为每周都会有更新的工作表可用。 多谢各位 Sub Compare() Call compareSheets(range("I16").Value, range("I17").Value) End Sub Sub compareSheets(Sofon As String, Sofon2 As String) Dim mycell As ra
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
您可以使用类似的方法来调用compareSheets。如果这两个范围中的任何一个与图纸名称不对应,它将发出警告,如果为true,则不会调用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
结束Sub只是为了展示我的想法 我同意错误是很挑剔的,但是对于这样简单的东西,我会用它来避免多余的循环
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
由于OP需要iError类型的解决方案,我决定发布代码,其中包含一个函数,用于检查工作簿中是否存在工作表。这个概念类似于已经发布的答案,但它将所有关于错误的语句严格地保存在函数中,并使用常规代码块来评估错误
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方法,这里有一个改进的WorksheetList函数,它完全消除了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
我有一个错误-你有什么错误?另外,在I16和I17中更改工作表后,是否确定工作表存在于工作簿中?您的代码也可以更好地通过不循环M列中的每个单元格,而是通过查找包含数据的最后一行并将其设置为您的结束范围来循环包含数据的单元格。我得到:运行时错误“9”下标超出范围。当我将I16或I17更改为与其中一张图纸的名称不相关的值时,就会发生这种情况。但我希望它是万无一失的,这就是为什么我想知道你如何可以添加一个IFERROR到这个。如果你有更好的想法,请让我知道。查看错误转到。错误转到@scottcraner建议的也可以,并且会短一点。我个人的偏好是在错误发生之前防止错误发生,特别是因为一旦发生错误就很难重新设置。在看到@ScottHoltzman的答案后,我决定检查是否在每个工作表循环后都找到了这两张工作表,而不是检查每一张工作表。谢谢斯科特!