Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在这个宏中有错误吗?_Excel_Vba - Fatal编程技术网

Excel 在这个宏中有错误吗?

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

问题是,当我更改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 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的答案后,我决定检查是否在每个工作表循环后都找到了这两张工作表,而不是检查每一张工作表。谢谢斯科特!